Broadcast相关问题总结

广播

定义

在Android中,Broadcast是一种广泛运用在应用程序之间传输信息的机制,Android中我们要发送的广播内容是一个Intent,这个Intent中可以携带我们要传送的数据;

1.广播可以在不同应用程序之间传递信息,即应用定义了相应的action,就可以接收到数据;(这个也不一定)
2.可以通过广播来实现service与Activity的数据交互,比如通知Activity更新UI;(这个一般不这么做)

场景

  1. 同一个app内,多个进程的不同组件之间的消息通信;
    比如app内有一个主进程,一个定位地图的进程,可以通过广播来进行两个进程之间的通信(我的观点是不如老老实实用binder)

  2. 不同app之间的组件之间消息通信;
    两个app之间通过发送广播来传递消息

种类

  1. Normal Broadcast: Context.sendBroadcast (无序广播)

  2. System Broadcast: Context.sendOrderedBroadcast (有序广播)

  3. local Broadcast: 只在自身app内部传播 (本地广播)

实现广播

1. 静态广播

注册完成就一直运行
将广播接收者写在Manifest.xml文件中;
静态广播的特点是:
所依赖的Activity被销毁后,依然能接收到广播,甚至app进程被杀掉后也能接收到广播

2. 动态广播

跟随Activity的生命周期
在代码中调用registerReceiver方法来注册广播;
动态注册广播一定要注意:
在onDestroy方法中执行unRegisterReceiver方法解除注册,否则会引起内存泄漏;
同时动态注册的广播生命周期是跟随Activity生命周期的,所以当Activity被销毁了,动态注册的广播也就失效了;

3. 动态广播和静态广播的区别

  1. 动态广播是在代码中注册,静态广播是在manifest.xml文件中写死的

  2. 动态广播受Activity生命周期的影响,Activity销毁了,广播也就失效了;静态注册广播即使Activity被销毁了,甚至进程被杀掉,也能收到广播;

广播实现机制

  1. 自定义广播接收者BroadcastReceiver,并复写onReceive方法;
  2. 通过Binder机制向ams进行注册;
  3. 广播发送者通过Binder机制向ams发送广播;
  4. ams查找符合响应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;
  5. 消息循环执行拿到此广播,回调BroadcastReceiver中的onReceiver方法;

LocalBroadcastManager 详解

本地广播有如下几个特点:

  1. 使用它发送的广播将只在自身app内传播,不必担心泄漏隐私数据;
  2. 其他的app无法对你的app发送该广播,因为你的app根本就不可能接收到非自身应用发送的该广播,因此不必担心安全漏洞
  3. 比系统的全局广播更加高效

分析:

  1. LocalBroadcastManager高效的原因主要是因为它内部是通过Handler实现,它的sendBroadcast方法含义并非我们平时所用到的那样,它的sendBroadcast方法实际上是通过handler发送一个Message实现的

  2. 既然它内部是通过Handler来实现广播的发送,那么相比系统广播通过binder来实现肯定更加高效了,同时使用Handler来实现,别的应用也无法像我们的应用发送广播,而我们的应用广播也不会离开我们的应用。

  3. LocalBroadcastManager内部协作主要是靠两个map集合:MReceivers和mActions,当然还有一个list集合mPendingBroadcasts,这个主要存储待接收的广播对象

posted @ 2022-07-06 12:39  cfdroid  阅读(76)  评论(0编辑  收藏  举报