Android 学习笔记(十一):广播和广播接收器的学习

思维导图

在这里插入图片描述

广播接收器

• 广播(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()方法发送

的广播为系统全局广播,发出的广播可以被其他应用接收到,也可以接收到其

他应用的广播。

总结

  1. 动态注册不是常驻型的,生命周期伴随着Activity的生命周期,应在Activity销毁前注销接收器。
  2. 静态注册时常驻型,应用关闭后,如果收到符合要求的广播信息,程序也会被系统调用运行。
  3. 当广播为有序广播时,优先级高的先接收到(不分静态和动态),优先级相同时,动态优先于静态。
  4. 当广播为标准广播时,无视优先级,动态优先于静态。

异常记录

• 静态注册时 一直收不到广播 查看日志 发现报错 Background execution not

allowed:

• 原因:Android8.0开始已经对隐式广播做了限制。

• 解决办法:

  1. 既设置action,也设置package。

  2. 将sdk版本降到26以下

  3. 使用动态注册

发布了167 篇原创文章 · 获赞 230 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_39240270/article/details/99486884