broadcast receiver–广播接收器,接受全局的广播。
根据广播的种类分为系统广播和自定义广播。
- 系统广播:电池消耗情况,开关机。一般系统广播为有序广播
- 自定义广播:自己定义一个广播。
根据广播的传播方式分为:普通广播和有序广播(orderedBroadcast) - 普通广播:异步执行,当一个broadcast发出后,所有与之匹配的broadcast都会同时接收到广播。
- 有序广播:同步执行,会根据之前设置的优先级有序的执行,优先级高的接收器可以截断广播,从而停止广播的传送,传说中的短信电话拦截就是用的这个原理。
根据广播的注册方式分为静态注册和动态注册。 - 静态注册:在AndroidManifest中进行注册,广播会一直存在除非退出app。一般多用于系统广播注册。
动态注册:在类中通过context.registerBroadcast()进行注册,可以通过onResume()注册,onPause()注销。
广播的发送方式:sendBroadcast(intent);
- sendOrderedBroadcast(intent);–发送有序广播
onReceiver方法–当接收器接收到传递的广播时会调用onreiver方法,但是BroadcastReceiver的周期在onReceiver结束后结束,而且onReceiver是运行在主线程中的,如果需要执行耗时程序,需要开启service,创建新线程。
以下就通过代码来运用广播的注册与发送。
- 静态注册广播
<receiver android:name=".broadcast.MyReceiver" >
<intent-filter>
<action android:name="android.action.test" />
</intent-filter>
<intent-filter>
<action android:name="android.action.dynamic.test"/>
</intent-filter>
</receiver>
@OnClick(R.id.send_broadcast)
void sendBroad() {
Intent intent = new Intent().setAction("android.action.test");
intent.putExtra("broad","register broadcast");
sendBroadcast(intent);
}
- 动态注册广播
@Override
protected void onResume() {
Log.i(TAG, "onResume");
super.onResume();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("android.action.dynamic.test");
registerReceiver(new MyReceiver(), intentFilter);
}
@Override
protected void onPause() {
Log.i(TAG, "onPause");
super.onPause();
unregisterReceiver(new MyReceiver());
}
@OnClick(R.id.send_dynemic_broadcast)
void sendDynemicBroad(){
Intent intent =new Intent().setAction("android.action.dynamic.test");
intent.putExtra("broad","dynamic reggister broadcast");
sendBroadcast(intent);
}
继承BroadcaReceiver的类,调用onReceiver方法。
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
// 不能执行超过5秒的任务,可以用service,关于context,若是静态注册,则context为系统context,若动态注册,则context为注册的那个类
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
if (**intent.getAction().equals("android.action.dynamic.test")**){
DebugLog.i("broad"+intent.getStringExtra("broad"));
Toast.makeText(context,intent.getStringExtra("broad"),Toast.LENGTH_SHORT).show();
}else if (intent.getAction().equals("android.action.test")){
DebugLog.i("dynamicBroad"+intent.getStringExtra("broad"));
Toast.makeText(context,intent.getStringExtra("broad"),Toast.LENGTH_SHORT).show();
}
Log.i("MyReceive", "onReceive" + intent.getAction());
}
}
上图图片就是静态注册和动态注册后执行的方法