美文网首页
Android详解广播

Android详解广播

作者: 雁度寒崖 | 来源:发表于2019-09-28 17:24 被阅读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.本地广播比一开始说的两种广播(系统全局广播)更加高效。

    相关文章

      网友评论

          本文标题:Android详解广播

          本文链接:https://www.haomeiwen.com/subject/bmvdyctx.html