#BroadcastReceiver综述
广播接收器,顾名思义,用来接收广播的。
一个广播关联两个角色,广播发送方、广播接收方,BroadcastReceiver是接收方角色。
广播发送方可以是应用内组件、其它应用,也可以是系统,BroadcastReceiver根据自己设置的过滤器IntentFilter来选择性接收。
BroadcastReceiver通过接收这些广播,实现了与其它组件、应用间的通信。
1.
广播接收器注册时是被注册到系统,发送广播时也是发送到系统,然后系统在全部已注册的广播接收器中根据它们的IntentFilter找到匹配的接收器,经过一系列处理,
发送消息到对应线程的循环消息队列(默认为相应app的UI线程),
最后调用其onReceiver()方法。
BroadcastReceiver默认情况下,其 onReceiver()方法执行在App对应的默认进程中的UI线程中。
BroadcastReceiver静态注册时,可通过android:process属性来指定运行在哪个进程。如不设置,则其 onReceiver()方法默认运行在App对应的默认进程的主线程(UI线程)中。
2.BroadcastReceiver的onReceive()回调方法也是运行在UI主线程中的,所以不能执行耗时操作,耗时操作应交给其它组件来执行。
若
onReceive()方法10s内未执行完毕,则会出现ANR错误。
但UI操作5s无应答就会抛出ANR,所以若
onReceive()执行时间超过5s,而此过程中恰好有UI交互,有可能提前就会出现ANR。
相关剪藏: Broadcast的onReceive是在UI线程里面调用吗? - 程序园
如何在BroadcastReceiver中执行耗时操作 - 简书
相关联想到的问题:
1)Java父线程、子线程的关闭有无依赖关系?
要看子线程的类型是否为守护线程,若为非守护线程(用户线程),则二者生命周期无依赖关系。
参考剪藏: java主线程结束和子线程结束之间的关系 - 邱明成 - 博客园
Java的守护线程与非守护线程 - balvender - 博客园
java------守护线程与非守护线程 - wwfy - 博客园
#.两种注册方式 和 广播分类
#.两种注册方式及相关要点:静态注册、动态注册
###1.在
AndroidManifest.xml中
静态注册
1.1两种方式下向系统注册时机的差异
在AndroidManifest.xml中静态注册的Receiver,在应用包安装时就会被系统解析,并注册到系统。
若是java代码动态注册,则需要app启动后执行到注册相关代码,才会被注册。
1.2
静态注册的广播接收器何时有效
从
Android 3.1
开始,APP静态注册的广播接收器,能有效收到广播的前提是:
1.需要启动过一次该APP,
2.APP未被手动停止或其它情况强行停止。
注意:
如果是系统在内存不足时
自动
杀死了这个
BroadcastReceiver
所在进程,该BroadcastReceiver仍然还是生效的。
原因:
Android 3.1
开始,虽然广播接收器注册,但以下情况,系统不会给广播接收器分发广播
从
Android 3.1
开始,系统为所有的广播都默认添加了
FLAG_EXCLUDE_STOPPED_PACKAGES
标志。所有处于停止状态的应用将无法接受到该标志的广播。注意,只有两种情况下应用才会处于停止状态:
1.
应用安装后未运行
2.
应用被手动(设置
-
应用
-
强制停止)或者被其他应用强制停止了