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);
}
1.和动态注册一样,新建一个广播接收者的类去继承BroadcastReceiver,重写其onReceive方法
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//每当收到广播时,该方法便会执行
}
}
2.打开AndroidManifest.xml文件,给我们刚才创建的广播接收者进行注册
这里的enabled属性为true表示启用该广播接收者,这里的exported属性为true表示允许该广播接收者接收本程序以外的广播,这里以监听开机广播为例,因此设置值为true。然后在receiver的标签体内添加intent-filter便签,并为其添加action的值,这里是要监听开机广播,因此值为android.intent.action.BOOT_COMPLETED。
3.因为这里监听的是系统开机广播,所以还需添加一条权限标签
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();
前面我们发送和接收的广播都是属于系统全局广播,即发出的广播可以被其他任何应用程序接收到,并且我们也可以接收到来自于其他任何应用程序的广播。这样就很容易引起安全性问题,比如我们发送的一些携带关键性数据的广播有可能被其他应用程序截获,或者其他的程序不停地向我们的广播接收器里发送各种垃圾广播。
为了能解决上述的安全性问题,Android引入了本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接受来自本应用程序发出的广播。
1.声明本地广播管理器并获得它的实例
//本地广播管理器
private LocalBroadcastManager localBroadcastManager;
localBroadcastManager = LocalBroadcastManager.getInstance(this);
2.注册广播接收者的方法变更为:
localBroadcastManager.registerReceiver(myBroadcastReceiver,intentFilter2);
3.注销广播接收者的方法变更为:
localBroadcastManager.unregisterReceiver(myBroadcastReceiver);
4.发送广播的方法变更为:
localBroadcastManager.sendBroadcast(intent);