Android详解广播
广播分两类:
▲标准广播:完全异步执行的广播!!!几乎所有的广播接收器都会同时接收到这条广播消息,没有先后顺序可言。
优点:效率高;
缺点:无法被截断。
▲有序广播:同步执行的广播!!!广播发出后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器逻辑处理完了,才会继续传递广播。所以他是分先后顺序的,优先级高的接收器会先收到广播。
优点:可截断,后面的广播接收器就收不到广播了;
缺点:效率低,一个一个处理。
例如:
开机后:系统会在执行finishBooting
函数时发送一条广播,值为android.intent.action.BOOT_COMPLETED
的广播。
自己发送和接收广播:
标准广播:
▲发送标准广播:其实很简单,只需要初始化一个Intent
,然后sendBroadcast
就行了
Intent intent = new Intent("com.czb.broadcast_test.MY_BROADCAST");
sendBroadcast(Intent);
▲想要接收自己发的广播也很简单:
新建一个BroadcastReceiver,
继承BroadcastReceiver
并重写onReceive(Context var1, Intent)
在Manifest里面加<intent-fliter>
表明想接收的广播的值
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.czb.broadcast_test.MY_BROADCAST" />
</intent-filter>
</receiver>
然后intent.getAction();
就可以接收到广播的值了,intent.getExtra("msg");
接收Intent里面存的数据。
有序广播:
▲发送有序广播:也很简单,改一行代码就可以:
Intent intent = new Intent("com.czb.broadcast_test.MY_BROADCAST");
sendOrderedBroadcast(Intent,null);
▲接收有序广播:其实和接收标准广播的区别不大:
1.可以识别BroadcastReceiver
的优先级;
2.可以截断广播。
先在Manifest
里面加一句来设置优先级
这里我设置的是最高优先级100
<intent-filter android:priority=100>
<action android:name="com.czb.broadcast_test.MY_BROADCAST" />
</intent-filter>
然后在标准广播的接收器改一下就可以接收并截断广播了;
在onReceive
里面加一句abortBroadcast();
就可以截断广播了
本地广播:
只能在应用程序内部发送和接收广播
这个就稍复杂一点了,需要借助LocalBroadcastManager
LocalBroadcastManager lbm = new LoadBroadcastManager.getInstance(this);
Intent intent = new Intent("com.czb.broadcast_test.MY_BROADCAST")
lbm.sendBroadcast(intent);
接收本地广播:
LocalBroadcastManager lbm = new LoadBroadcastManager.getInstance(this);
...
LocalReceiver lr = new LocalReceive();
Intentfilter intentfliter = new Intentfliter("com.czb.broadcast_test.MY_BROADCAST");
lbm.registerReceiver(lr, intentfliter);//注册本地广播监听器
class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// unregisterReceiver(networkChangeReceiver);
localBroadcastManager.unregisterReceiver(localReceiver);
}
这里写了一个内部类作为本地广播接收器,而且我们这次没有在Manifest
里面写receiver
,而是动态注册的广播接收器;
这种方法也适用于注册标准广播接收器和有序广播接收器,方法类似,不再赘述。
▲本地广播接收器的优势:
1.明确知道正在发送的广播不会离开我们的程序,因此不必担心信息泄露;
2.其他程序也没办法给我们的程序发送广播,没有安全隐患;
3.本地广播比一开始说的两种广播(系统全局广播)更加高效。