Android详解广播

2019-09-28  本文已影响0人  雁度寒崖

广播分两类:

▲标准广播:完全异步执行的广播!!!几乎所有的广播接收器都会同时接收到这条广播消息,没有先后顺序可言。
优点:效率高;
缺点:无法被截断。
▲有序广播:同步执行的广播!!!广播发出后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器逻辑处理完了,才会继续传递广播。所以他是分先后顺序的,优先级高的接收器会先收到广播。
优点:可截断,后面的广播接收器就收不到广播了;
缺点:效率低,一个一个处理。

例如:

开机后:系统会在执行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.本地广播比一开始说的两种广播(系统全局广播)更加高效。

上一篇下一篇

猜你喜欢

热点阅读