一、简介
1. 定义
广播接收器是一个用于接收广播信息,并做出对应处理的组件。比如我们常见的系统广播:通知时区改变、电量低、用户改变了语言选项等。
2. 用途
广播可以进行数据的传递、通知,类似于观察者模式。开发中我们可以通过继承BroadcastReceiver基类来自定义广播,接收某些我们感兴趣的广播来实现业务需求。
二、类型
1、无序广播
只发送广播到优先级较高的接收者那里,然后由优先级高的接收者决定是继续传播到优先级低的接收者那里还是终止这个广播。
2、有序广播
对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。是我们使用较多的一种普通广播类型。
三、生命周期
BroadcastReceiver的生命周期从对象调用它开始,到onReceiver方法执行完成之后结束。每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完就销毁,如果BroadcastReceiver的onReceiver方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver方法中执行耗时的操作。
如果需要在BroadcastReceiver中执行耗时的操作,可以通过Intent启动Service来完成。但不能绑定Service。 如果我们在Activity中注册了BroadcastReceiver,当这个Activity销毁的时候要主动撤销注册否则会出现异常。
四、无序广播的使用
1. 创建BreadcastReceiver的子类
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO
}
}
2. 注册BroadcastReceiver
(1) 静态注册
<!-- 在配置文件中注册BroadcastReceiver能够匹配的Intent -->
<receiver
android:name="com.example.test.MyBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.MyBroadcastReceiver"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</receiver>
(2) 动态注册
//通过代码的方式动态注册
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MyBroadcastReceiver");
registerReceiver(receiver, filter);
3.发送广播
Intent intent = new Intent("android.intent.action.MY_BROADCAST");
intent.putExtra("msg", "hello receiver");
sendBroadcast(intent, "android.dsw.data");
五、有序广播的使用
1.注册
<receiver android:name=".FirstReceiver">
<intent-filter android:priority="1000">
<action android:name="android.dsw.data"/>
</intent-filter>
</receiver>
<receiver android:name=".SecondReceiver">
<intent-filter android:priority="500">
<action android:name="android.dsw.data"/>
</intent-filter>
</receiver>
接收者的创建和普通广播一样。有序和无序广播区别在于可以实现广播的拦截,高优先级的接收者可以通过abortBroadcast()终止广播。比如系统的接收短信广播就是一个有序广播,可以通过自定义的广播进行拦截,只要设置的android:priority属性,越大优先级越高。这个值介于[-1000,1000]。
2. 发送广播
Intent intent = new Intent("android.intent.action.MY_BROADCAST");
intent.putExtra("msg", "hello receiver");
sendOrderedBroadcast(intent, "android.dsw.data");
六、几种常见的系统广播
1. 开机启动广播
<receiver
android:name=".BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
2. 网络变化广播
<receiver
android:name=".NetworkStateReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
因为在isNetworkAvailable方法中我们使用到了网络状态相关的API,所以需要声明相关的权限才行,下面就是对应的权限声明:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
3. 电量变化广播
<receiver
android:name=".BatteryChangedReceiver">
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
4. SD卡状态广播
<receiver
android:name="com.itheima.sdcradlistener.SDCardReceiver">
<intent-filter >
<action android:name="android.intent.action.MEDIA_MOUNTED"/>
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
<action android:name="android.intent.action.MEDIA_REMOVED"/>
<data android:scheme="file"/>
</intent-filter>
</receiver>
5. 监听应用的安装、卸载、更新
<receiver
android:name="com.itheima.app.AppReceiver">
<intent-filter >
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REPLACED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>