BroadCast详解
1.广播的作用?
(1)实现不同程序之间的数据传输和共享,只要和发送广播的action相同的接收者都能接收这个广播,比如Android的短信电话广播,只要我们实现了他们的action广播,就能接收他们的数据,以便进行下一步处理。
(2)起到一个通知的作用,比如在Service中通知主程序,更新主程序的UI等。因为Service是没有界面的,所以不能直接获得主程序的控件,这样我们就能在主程序中实现一个广播接收器来专门接收Service发过来的数据和通知。
2.广播的注册方式
(1)清单文件注册(静态注册)
只要应用程序被部署到手机上,就立刻生效,不管进程是否处于运行状态。
(2)代码注册(动态注册)
只有代码运行了,广播接收器才有效,如果代码运行结束,广播接收器就失效了。要注意在Activity销毁时一定要解注册。
3.发送广播的方式
(1)普通广播
普通广播对于多个接收者是完全异步的,通常每个接收者无需等待即可接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。
(2)有序广播
每次只发生到优先级高的接收者那里,然后有优先级高的接收者再转递给优先级低的接收者那里,优先级高的接收者有能力终止这个广播。
4.广播的生命周期
(1)广播接收者的生命周期非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁;
(2)广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框;
(3)最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉;
(4)耗时的较长的工作最好放在Service中完成;
5.注意
如果在广播的回调方法中启动Activity必须设置 i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);因为每个Activity必须建立在一个任务栈中,这个flag指定了Activity的启动模式,这个flag的意思就是在一个新的任务栈中启动。在Activity里面用startActivity这个方法去启动一个新的Activity的时候,Intent有默认的启动模式。而在Activity之外调用startActivity方法时候没有默认的启动模式。比如在service或者broadcastReceiver等,中都需要指定Activity一个启动模式。