# BroadcastReceiver

广播是一种广泛运用的在应用程序之间传输信息的机制,主要用来监听系统或者应用发出的广播信息,然后根据广播信息作为相应的逻辑处理,也可以用来传输少量、频率低的数据。例如,在实现开机启动服务和网络状态改变、电量变化、短信和来电时通过接受系统的广播让应用程序作出相应的处理。

# 动态注册和静态注册的区别

  • 静态注册:在AndroidManifest.xml中进行注册。常驻系统,不受组件生命周期的影响。即便应用退出了,广播还是可以被接收、耗电、占内存等;
  • 动态注册:在代码中使用IntentFilter进行注册。非常驻系统,跟随组件的生命变化,组件结束了广播就结束了。在组件结束前,需要先移除广播,否则容易造成内存泄漏。动态注册的广播永远要快于静态注册的广播,不论静态注册的优先级多高。

# 广播的各种形式

  • 普通广播:使用sendBroadcast()发送,是最常用的广播。一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接受到这条广播信息,因此它们接受的先后是随机的;
  • 有序广播:使用sendOrderedBroadcast(),发送出去的广播会被接收者按照顺序接收,而广播接收者按照优先级Priority属性值从大到小排序(优先级相同,则动态注册的广播优先)。是一种同步执行的广播,在广播发出之后,同一时刻就只有一个广播接收器能够收到这条广播信息;
  • 本地广播:发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能本应用程序发出的广播;
  • 粘性广播:这种类型的广播会一直逗留,当有匹配该广播的接收器被注册后,该接收器就会收到这条广播。

# 顺序

我们知道动态注册的广播的优先级始终高于静态注册的广播,而静态注册的广播的优先级主要根据Priority属性值的大小排序,那么如果都是静态注册的广播,优先级大小又一样,那接收的顺序是怎么样的呢?

在都是静态注册的情况下,最高安装的程序优先级别最高 | 按照字符排列顺序决定谁先接收到广播信息。

所以,有序广播的优先级遵循如下的规则:

  1. 动态注册优先级级别最高,其次是静态注册
  2. 在动态注册中,最早动态注册的优先级别最高
  3. 在静态注册中,最早安装的程序,静态注册的优先级别最高
  4. 如果都是静态注册,按照字符排列顺序决定谁先收到广播信息
  5. adb install安装的比adb push到其它目录的应用程序优先级更高