一、BroadcastReceiver的动态注册方法
1.新建一个广播接收者的类去继承BroadcastReceiver,重写其onReceive方法
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//每当收到广播时,该方法便会执行
}
}
2.新建一个IntentFilter对象,并为其添加Action的值,这里以监听网络状态变更为例
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
3.新建广播接收者的实例,并注册该广播接收者
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver,intentFilter);
4.最后要记得,动态注册的广播接收者一定要取消注册才行,这里我就在onDestroy()方法中取消注册
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
二、BroadcastReceiver的静态注册方法
1.和动态注册一样,新建一个广播接收者的类去继承BroadcastReceiver,重写其onReceive方法
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//每当收到广播时,该方法便会执行
}
}
2.打开AndroidManifest.xml文件,给我们刚才创建的广播接收者进行注册
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
这里的enabled属性为true表示启用该广播接收者,这里的exported属性为true表示允许该广播接收者接收本程序以外的广播,这里以监听开机广播为例,因此设置值为true。然后在receiver的标签体内添加intent-filter便签,并为其添加action的值,这里是要监听开机广播,因此值为android.intent.action.BOOT_COMPLETED。
3.因为这里监听的是系统开机广播,所以还需添加一条权限标签
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
三、发送标准广播(无序广播)
1.新建一个intent对象,并为其添加action的值
Intent intent = new Intent();
intent.setAction("com.xxxx.xxxxx.broadcastreceivertest.MY_BROADCAST");
sendBroadcast(intent);
值得注意的是,这里的action的值应该与注册的广播接收者中的action值保持一致。
2.如果是在Android8.0及以后的版本发送给静态注册的广播接收者,还需要给intent设置component
//Android8.0之后需要设置ComponentName来指定广播接收者的包名类名
intent.setComponent(new ComponentName("com.xxxx.xxxxx.broadcastreceivertest","com.xxxx.xxxxx.broadcastreceivertest.MyBroadcastReceiver"));
其中第一个参数为自定义广播接收者所在的包名,第二个参数为自定义广播接收者的包名类名。
四、发送有序广播
1.因为我目前用的开发环境是Android8.1,8.0之后的版本不再推荐使用静态注册的方式了。因此我在测试时写的两个应用的广播接收者均为动态注册,在发送有序广播时,动态注册为其配置优先级的方法如下:
intentFilter2.setPriority(50);
2.然后发送广播的方法为
sendOrderedBroadcast(intent,null);
然后这里我尝试了一下,即使用之前的sendBroadcast()方法也是可以的,只要设置好了优先级即可。
3.优先级高的广播接收者截断广播的方法为
abortBroadcast();
五、使用本地广播
1.声明本地广播管理器并获得它的实例
//本地广播管理器
private LocalBroadcastManager localBroadcastManager;
localBroadcastManager = LocalBroadcastManager.getInstance(this);
2.注册广播接收者的方法变更为:
localBroadcastManager.registerReceiver(myBroadcastReceiver,intentFilter2);
3.注销广播接收者的方法变更为:
localBroadcastManager.unregisterReceiver(myBroadcastReceiver);
4.发送广播的方法变更为:
localBroadcastManager.sendBroadcast(intent);