论动态注册广播的利弊

来源:互联网 发布:淘宝小卖家死了大半 编辑:程序博客网 时间:2024/05/16 12:30

BroadcastReceiver广播接收器,是Android的四大组件之一;

在使用时,先设置Intent的action,再把要发送的内容打包放进Intent中,通过发送广播sendBroadcast(intent)来发送Intent消息;通过在程序的另一边注册广播接收器来判断action并接收Intent;

BroadcastReceive广播接收器生命周期

它的生命周期为从回调onReceive()方法开始到该方法返回结果后结束

所以说广播接收器仅在它执行这个方法时处于活跃状态。当onReceive()返回后,它即为失活状态。

拥有一个活跃状态的广播接收器的进程被保护起来而不会被杀死,但仅拥有失活状态组件的进程则会在其它进程需要它所占有的内存的时候随时被杀掉。所以,如果响应一个广播信息需要很长的一段时间,我们一般会将其纳入一个衍生的线程中去完成,而不是在主线程内完成它,从而保证用户交互过程的流畅。


所以说动态注册广播时要特别注意以下两点:

1.生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报ANR(Application No Response) 程序无响应的错误信息,如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由Service 来完成 . 这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的

2. 动态注册广播接收器还有一个特点,就是当用来注册的Activity关掉后,广播也就失效了(动态注册的广播和所在的activity是绑定的)。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用。所以当一个activity中同时存在动态注册的注册器和接收器时就要注意了,有可能你发送广播时,activity并未开启,其中的注册和接收代码也就无法完成其功能,从而达不到接收广播的效果。




0 0
原创粉丝点击