思维导图
广播接收器
• 广播(Broadcast)是在组件之间传播数据的一种机制,这些组件可以位于不
同的进程中,起到进程间通信的作用。
• 广播接收器(BroadcastReceiver) 是对发送出来的 Broadcast 进行过滤、接
受和响应的组件。
标准广播
• 完全的异步执行的广播,发出广播后所有的广播接收器几乎会在同一时间接收
到这条广播,没有先后顺序。效率比较高,且无法截断。
• 通过sendBroadcast(Intent intent)方法发送。
有序广播
• 同步执行的广播,广播发出后只有一个广播接收器能够接收到这个广播,优先
级高的先接收到这个广播,只有当这个广播接收器执行完onReceive()方法
后,下一个广播接收器才能收到这个广播,并且上一个广播接收器可以截断这
个广播。
• 通过sendOrderedBroadcast(Intent intent,String s)方法发送。
• 通过receiver注册时的priority属性设置优先级,越大优先级越高。
• 可以通过abortBroadcast()方法截断广播,这样低优先级的就接收不到了。
静态注册
• 静态注册是通过在AndroidManifest.xml配置文件中配置receiver属性注册,
并配置<intent-filter>标签设置过滤器。
• 这种方式的话接收器的生命周期伴随着整个应用,如果这种方式处理的是系统
广播,则即使应用没有打开,该广播接收器都会收到该广播。
动态注册
• 动态注册时通过在代码中设置一个IntentFIlter,然后添加一个Action,通过
context.registerReceiver(receiver,intentFilter)注册广播接收器。
• 通过使用context.registerReceiver(receiver)取消注册。
• 生命周期随着Activity的变化而变化。
本地广播
• 本地广播只有应用内部可以接收到,并且这个广播接收器只能接受应用内的广
播。本地广播通过LocalBroadcastManager来管理。
• 注册接收器的方法:
LocalBroadcastManager.getInstance(this).registerReceiver(BroadcastReceiver, IntentFilter)
• 注销接收器的方法:
LocalBroadcastManager.getInstance(this).unregisterReceiver(BroadcastR
eceiver);
• 发送异步广播:
LocalBroadcastManager.getInstance(this).sendBroadcast(Intent)
• 发送同步广播:
LocalBroadcastManager.getInstance(this).sendBroadcastSync(Intent)
全局广播
• 通过context.sendBroadcast()和context.sendOrderedBroadcast()方法发送
的广播为系统全局广播,发出的广播可以被其他应用接收到,也可以接收到其
他应用的广播。
总结
- 动态注册不是常驻型的,生命周期伴随着Activity的生命周期,应在Activity销毁前注销接收器。
- 静态注册时常驻型,应用关闭后,如果收到符合要求的广播信息,程序也会被系统调用运行。
- 当广播为有序广播时,优先级高的先接收到(不分静态和动态),优先级相同时,动态优先于静态。
- 当广播为标准广播时,无视优先级,动态优先于静态。
异常记录
• 静态注册时 一直收不到广播 查看日志 发现报错 Background execution not
allowed:
• 原因:Android8.0开始已经对隐式广播做了限制。
• 解决办法:
-
既设置action,也设置package。
-
将sdk版本降到26以下
-
使用动态注册