天天看点

android 静态、动态注册广播浅析

前言

代码优化过程中发现好多app的全局网络监听使用动态注册广播方式,而没有采用在清单文件中进行注册

产生了疑问,研究开来知识点还是有一些。总结如下

android 静态、动态注册广播浅析

1.广播的注册方式

在Android中有两种方式,即动态注册(代码注册)、静态注册(清单文件注册)

静态:

<receiver android:name=".persenter.reciver.InternetStaticBroadCastReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>      

动态:

private void registerReceiver(BroadcastReceiver bc, String action) {
        IntentFilter mFilter = new IntentFilter();
        mFilter.addAction(action);
        context.registerReceiver(bc, mFilter);
    }      

反注册

unregisterReceiver(BroadcastReceiver);      

2.广播注册方式优缺点

静态注册广播

1.优先级低于动态广播

2.注册后一直运行,尽管Activity、进程、App被杀死还是可以接收到广播

(官网解释:从Android的源代码中找到了这样的注释:If this BroadcastReceiver was launched through a

tag, then the object is no longer alive after returning from this function.

This means you should not perform any operations that return a result to you asynchronously.

这段文字告诉我们:如果通过标签来注册的BroadcastReceiver,

那么该对象的实例在onReceive被调用之后就会在任意时间内被销毁。也就是说,我们并需要担心静态注册的BroadcastReceiver的销毁问题。)

3.广播注册到系统广播队列。受到全局广播影响。

动态广播

1.优先级高于静态广播

2.可以随意控制广播的创建和销毁

3.自由,灵活度较高

4.app内注册的广播,对系统广播进行隔离。作用域在app内

3、Broadcast Receiver的使用场景

同一App具有多个进程的不同组件之间的消息通信(发送广播吊起拨打电话,contentprivader)

不同App之间的组件之间的消息通信

4、Broadcast Receiver的种类

普通广播

有序广播

本地广播

Sticky广播

5、LocalBroadcastManager特点

本地广播只能在自身App内传播,不必担心泄漏隐私数据

本地广播不允许其他App对你的App发送该广播,不必担心安全漏洞被利用

本地广播比全局广播更高效

以上三点都是源于其内部是用Handler实现的

6、Android中跨进程通讯的几种方式

访问其他应用程序的Activity,如调用系统通话应用

Content Provider,如如访问系统相册

广播,如显示系统时间

AIDL

总结: