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

o279642707 · · 471 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

前言

代码优化过程中发现好多app的全局网络监听使用动态注册广播方式,而没有采用在清单文件中进行注册
产生了疑问,研究开来知识点还是有一些。总结如下

这里写图片描述

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

总结:

本文是说明静态和动态注册广播针对app内网络监听应用问题,最后知道为什么app中全局网络监听采用动态注册广播原因,不采用静态注册方式(在清单文件中声明广播),是因为静态注册广播,无法及时反注册,会造成同一个广播导致所有能接收到的类(Activity,Fragment)执行相应的网络切换逻辑,当然可以去控制只刷新当前前台类。这是一个隐患。原因2,采用静态广播和采用动态注册的广播代码量差不多,那什么时候使用静态广播呢,我能想到的就是系统应用。

引用:
https://zhidao.baidu.com/question/553907466323177572.html

本文来自:CSDN博客

感谢作者:o279642707

查看原文:android 静态、动态注册广播浅析

471 次点击  
加入收藏 微博
上一篇:Kotlin协程向导
下一篇:Android 线程池
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet