BroadcastReceiver是安卓中四大组件之一,用于接受广播通知。常用于监听系统的事件,比如:开机、锁屏、解锁屏、电量变化、网络变化、短信收发等。有时候还有收发自定义的广播的需求。
广播注册分为静态注册和动态注册。区别如下:
1.动态注册广播不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收
器。 静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
2.当广播为有序广播时:
1 优先级高的先接收
2 同优先级的广播接收器,动态优先于静态
3 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。
3.当广播为普通广播时:
1 无视优先级,动态广播接收器优先于静态广播接收器
2 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。
在高版本安卓中,部分频繁发送的广播事件只能动态注册,也就是代码方式注册。比如:电量变化、锁屏、解锁等广播事件。
至于这么设计,大概是考虑到在配置文件中注册,将会一直运行接收者的代码,
而通过代码方式注册的,在应用退出后,就无法接收了,这样省电省资源。
静态注册的格式:在AndroidManifest.xml文件中配置
<receiver android:name="com.ittianyu.broadcast.MyReceiver">
<intent-filter>
<action android:name="android.intent.action.MY_BROADCAST"/>
</intent-filter>
</receiver>
动态注册的格式:
//放在文件申明部分
// add: detect screen status, false for power off, ture for power up.
boolean mScreenPowerStatus = true;//全局标识位,方便收到广播后针对性操作
ScreenStatusReceiver mScreenStatusReceiver;//全局广播接受对象
//广播接受类
private class ScreenStatusReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if("android.intent.action.SCREEN_ON".equals(intent.getAction())) {
Log.d(TAG, "Detect screen on and set mScreenPowerStatus false");
mScreenPowerStatus = true;
} else if("android.intent.action.SCREEN_OFF".equals(intent.getAction())) {
Log.d(TAG, "Detect screen off and set mScreenPowerStatus ture");
mScreenPowerStatus = false;
}
}
}
//广播在哪里使用就在哪里进行注册
//Register Receiver
ScreenStatusReceiver mScreenStatusReceiver = new ScreenStatusReceiver();//new一个接受者
IntentFilter filterIF = new IntentFilter();//new一个intent过滤器
filterIF.addAction("android.intent.action.SCREEN_ON");//增加亮屏操作
filterIF.addAction("android.intent.action.SCREEN_OFF");//增加灭屏操作
registerReceiver(mScreenStatusReceiver, filterIF);//注册监听
//在ondestory里面进行对象的销毁
public void onDestroy() {
unregisterReceiver(mScreenStatusReceiver);//注销监听
mScreenStatusReceiver = null;//清空对象
if (mBtInputDeviceService != null) {
mAdapter.closeProfileProxy(BluetoothProfile.INPUT_DEVICE, mBtInputDeviceService);
}
isCancel = true;
super.onDestroy();
}
//然后就可以根据标识位进行相应的操作
局部广播已经说过了,关于普通广播和有序广播后面有应用到就再研究一下。