广播接收器的实现:继承BroadcasrReceiver,重写BroadcastReceiver里的onReceiver方法
注册广播有2中方式:
代码动态注册
MyReceiver receiver=new MyReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction(Intent.ACTION_EDIT);
super.registerReceiver(receiver, filter);
AndroidManifest.xml 中配置广播
<receiver android:name="com.ghp.receiver.MyReceiver">
<intent-filter>
<action android:name="android.intent.action.EDIT"/>
<action android:name="wakeup"/>
</intent-filter>
</receiver>
两种注册类型的区别是:
1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。
2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系
统调用自动运行。
Android 引入广播机制的用意:
1.从MVC考虑,Android的四大组件本质上就是为了实现移动或者说嵌入式设备的MVC架构,它们之间有时候是一种相互依存,补充的关系,引入广播机制可以方便它们的信息和数据的交互 2.程序间互通消息,一处发送广播,接收广播处获得相应的信息,并做相应的处理
3.效率上方便
4.设计模式上应用了反转控制的模式,类似监听者模式
广播接收者生命周期
广播接收器只有一个回调方法:
void onReceive(Context curContext, Intent broadcastMsg)
当广播消息抵达接收器时,Android 调用它的 onReceive()方法并将包含消息的 Intent 对象传递给它。广播接收器仅在它执行这个方法时处于活跃状态。当 onReceive()返回后,它即为失活状态。
拥有一个活跃状态的广播接收器的进程被保护起来而不会被杀死。 但仅拥有失活状态组件的进程则会在其它进程需要它所占有的内存的时候随时被杀掉。
这种方式引出了一个问题:如果响应一个广播信息需要很长的一段时间, 我们一般会将其纳入一个衍生的线程中去完成,而不是在主线程内完成它,从而保证用户交互过程的流畅。 如果 onReceive()衍生了一个线程并且返回,则包涵新线程在内的整个进程都被会判为失活状态(除非进程内的其它应用程序组件仍处于活跃状态) ,于是它就有可能被杀掉。这个问题的解决方法是令 onReceive()启动一个新服务,并用其完成任务,于是系统就会知道进程中仍然在处理着工作。