package cn.trinea.android.demo;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.content.LocalBroadcastManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
/**
* BroadcastReceiver Demo, include general broadcast, local broadcast, ordered broadcast,sticky broadcast
*
* @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2012-9-20
*/
public class BroadcastReceiverDemo extends BaseActivity {
private final static String ACTION_GENERAL_SEND = "cn.trinea.android.demo.BroadcastReceiverDemo.sendGeneralBroadcast";
private final static String ACTION_LOCAL_SEND = "cn.trinea.android.demo.BroadcastReceiverDemo.sendLocalBroadcast";
private final static String ACTION_ORDERED_SEND = "cn.trinea.android.demo.BroadcastReceiverDemo.sendOrderedBroadcast";
private final static String ACTION_STICKY_SEND = "cn.trinea.android.demo.BroadcastReceiverDemo.sendStickyBroadcast";
private final static String MSG_KEY = "msg";
private final static String RUSULT_MSG_KEY = "resultMsg";
private boolean isStickyRegister = false;
private MyBroadcastReceiver generalReceiver;
private OrderedBroadcastReceiverPriorityHigh orderedReceiverHigh;
private OrderedBroadcastReceiverPriorityMedium orderedReceiverMed;
private OrderedBroadcastReceiverPriorityLow orderedReceiverLow;
private LocalBroadcastReceiver localReceiver;
private StickyBroadcastReceiver stickyReceiver;
private Button sendGeneralBtn;
private Button sendLocalBtn;
private Button sendOrderedBtn;
private Button sendStickyBtn;
private TextView generalMsg;
private TextView localMsg;
private TextView orderedMsg;
private TextView stickyMsg;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState, R.layout.broadcast_receiver_demo);
initView();
}
private void initView() {
generalMsg = (TextView)findViewById(R.id.general_broadcast_msg);
localMsg = (TextView)findViewById(R.id.local_broadcast_msg);
orderedMsg = (TextView)findViewById(R.id.ordered_broadcast_msg);
stickyMsg = (TextView)findViewById(R.id.sticky_broadcast_msg);
sendGeneralBtn = (Button)findViewById(R.id.send_general_broadcast);
sendGeneralBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(ACTION_GENERAL_SEND);
i.putExtra(MSG_KEY, getString(R.string.general_broadcast_msg));
sendBroadcast(i);
}
});
sendLocalBtn = (Button)findViewById(R.id.send_local_broadcast);
sendLocalBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(ACTION_LOCAL_SEND);
i.putExtra(MSG_KEY, getString(R.string.local_broadcast_msg));
LocalBroadcastManager.getInstance(context).sendBroadcast(i);
}
});
sendOrderedBtn = (Button)findViewById(R.id.send_ordered_broadcast);
sendOrderedBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(ACTION_ORDERED_SEND);
i.putExtra(MSG_KEY, getString(R.string.ordered_broadcast_msg));
sendOrderedBroadcast(i, null, new OrderedBroadcastReceiverResultReceiver(), null, Activity.RESULT_OK,
null, null);
}
});
sendStickyBtn = (Button)findViewById(R.id.send_sticky_broadcast);
sendStickyBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(ACTION_STICKY_SEND);
i.putExtra(MSG_KEY, getString(R.string.sticky_broadcast_msg));
sendStickyBroadcast(i);
int waitTime = 2000;
stickyMsg.setText(String.format(getString(R.string.sticky_broadcast_wait_tip), waitTime));
// receiver broadcast after broadcast send 2 seconds
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
isStickyRegister = true;
registerReceiver(stickyReceiver, new IntentFilter(ACTION_STICKY_SEND));
}
}, waitTime);
}
});
}
@Override
public void onStart() {
super.onStart();
generalReceiver = new MyBroadcastReceiver();
localReceiver = new LocalBroadcastReceiver();
orderedReceiverHigh = new OrderedBroadcastReceiverPriorityHigh();
orderedReceiverMed = new OrderedBroadcastReceiverPriorityMedium();
orderedReceiverLow = new OrderedBroadcastReceiverPriorityLow();
stickyReceiver = new StickyBroadcastReceiver();
registerReceiver(generalReceiver, new IntentFilter(ACTION_GENERAL_SEND));
LocalBroadcastManager.getInstance(context).registerReceiver(localReceiver, new IntentFilter(ACTION_LOCAL_SEND));
IntentFilter high = new IntentFilter(ACTION_ORDERED_SEND);
high.setPriority(100);
IntentFilter med = new IntentFilter(ACTION_ORDERED_SEND);
med.setPriority(-1);
IntentFilter low = new IntentFilter(ACTION_ORDERED_SEND);
low.setPriority(-100);
registerReceiver(orderedReceiverHigh, high);
registerReceiver(orderedReceiverMed, med);
registerReceiver(orderedReceiverLow, low);
}
@Override
public void onStop() {
unregisterReceiver(generalReceiver);
LocalBroadcastManager.getInstance(context).unregisterReceiver(localReceiver);
unregisterReceiver(orderedReceiverHigh);
unregisterReceiver(orderedReceiverMed);
unregisterReceiver(orderedReceiverLow);
if (isStickyRegister) {
unregisterReceiver(stickyReceiver);
}
super.onStop();
}
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
generalMsg.setText(intent.getStringExtra(MSG_KEY));
}
}
public class StickyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
stickyMsg.setText(intent.getStringExtra(MSG_KEY));
}
}
public class LocalBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
localMsg.setText(intent.getStringExtra(MSG_KEY));
}
}
public class OrderedBroadcastReceiverPriorityHigh extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
orderedMsg.setText(String.format(getString(R.string.ordered_broadcast_high_tip),
intent.getStringExtra(MSG_KEY)));
// modify broadcast content
getResultExtras(true).putString(RUSULT_MSG_KEY, "High");
}
}
public class OrderedBroadcastReceiverPriorityMedium extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
boolean isCancel = false;
if (isCancel) {
orderedMsg.setText(orderedMsg.getText()
+ "\r\n"
+ String.format(getString(R.string.ordered_broadcast_medium_cancel_tip),
intent.getStringExtra(MSG_KEY), getResultExtras(true).getString(RUSULT_MSG_KEY)));
// calcel broadcast
abortBroadcast();
} else {
orderedMsg.setText(orderedMsg.getText()
+ "\r\n"
+ String.format(getString(R.string.ordered_broadcast_medium_tip),
intent.getStringExtra(MSG_KEY), getResultExtras(true).getString(RUSULT_MSG_KEY)));
getResultExtras(true).putString(RUSULT_MSG_KEY, "Medium");
}
}
}
public class OrderedBroadcastReceiverPriorityLow extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
orderedMsg.setText(orderedMsg.getText()
+ "\r\n"
+ String.format(getString(R.string.ordered_broadcast_low_tip), intent.getStringExtra(MSG_KEY),
getResultExtras(true).getString(RUSULT_MSG_KEY)));
getResultExtras(true).putString(RUSULT_MSG_KEY, "Low");
}
}
public class OrderedBroadcastReceiverResultReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
orderedMsg.setText(orderedMsg.getText()
+ "\r\n"
+ String.format(getString(R.string.ordered_broadcast_tip), intent.getStringExtra(MSG_KEY),
getResultExtras(true).getString(RUSULT_MSG_KEY)));
}
}
}