广播的类型
- 标准广播(Normal Broadcasts)是完全异步执行的广播,在广播发出后,几乎所有的广播接受器都同一时间接收到这条广播消息,放射性传播的消息。
- 有序广播(Ordered Broadcasts)是同步执行的广播,在广播发出后,只有一个广播接收器接收到这条广播消息,它在处理完消息后可以选择继续串型传播这条消息,也可以选择截断这条消息的传播。
接受系统广播
要接收广播,首先当然要创建广播接收器啦!
- 动态注册广播接收器
- 自定义一个继承自BroadcastReceiver的类并重写其中的onReceive()方法,写处理接收到的广播的具体逻辑。
- 创建该自定义广播接收器的实例。
- 创建一个intentFilter实例,调用addAction()方法配置具体要接收什么广播消息。
- 调用registerReceiver()方法关联intentFilter和自定义广播接收器,完成注册
- 在onDestroy()方法调用unRegisterReceiver()解除注册。
- 静态注册广播接收器
- 自定义一个继承自BroadcastReceiver的类并重写其中的onReceive()方法,写处理接收到的广播的具体逻辑。
- 在AndroidManifest的XML文件中注册广播接收器。
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.example.BROADCAST_TEST"/>
</intent-filter>
</receiver>
总结:无论哪一种注册方式,注册广播接收器都需要为之配置好intentFilter,添加action属性。
发送自定义广播
介绍自定义广播之前,我们要回顾一下,什么是Intent。intent能在运行过程中连接两个组件component(众所周知,android的四大组件吧)。Android的三个基本组件——Activity,Service和Broadcast Receiver——都是通过Intent机制激活的,不同类型的组件有不同的传递Intent方式。
- 发送广播,前提肯定要先自定义一个广播接受器啦。
- 在AndroidManifest.XML文件中注册广播接收器,在< action_filter>内添加一个自定义的action属性,而这个action属性就是自定义广播的“内核”了。
- new一个Intent,构造函数传入我们自定义的action属性(内核)。如果要发送标准广播就调用sendBroadcast(intent,null),而要发送有序广播就调用sendOrderedBroadcast(intent, null)发送广播。
- 注意,发送有序广播时,注册的广播接受器还要添加一个android:priority属性,可以在广播接收器的onReceive()中调用abortBroadcast()截断广播的传播。
使用本地广播
为了解决广播的安全性问题,android引入了一套本地广播机制,本地广播只能在应用程序内部进行传播。本地广播无法通过静态注册的方式来接收。
本地广播特殊的地方是它需要一个LoadBroadcastManager来对广播进行管理,如注册广播接收器和发送本地广播都要经由LoadBroadcastManager的手才行。
localBroadcastManager=LocalBroadcastManager.getInstance(this);
intentFilter=new IntentFilter();
forceOfflineReceiver=new ForceOfflineReceiver();
intentFilter.addAction("com.example.broadcasttest.FORCEOFFLINE");
localBroadcastManager.registerReceiver(forceOfflineReceiver, intentFilter);
Button forceOffline=(Button)findViewById(R.id.force_offline);
forceOffline.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("com.example.broadcasttest.FORCEOFFLINE");
localBroadcastManager.sendBroadcast(intent);
Toast.makeText(MainActivity.this,"click",Toast.LENGTH_SHORT).show();
}
});
另外如果要在广播接收器中启动活动,需要给intent加入FLAG_ACTIVITY_NEW_TASK这个标志。
FLAG_ACTIVITY_NEW_TASK: 设置此状态,记住以下原则,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性一样),如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity。参考资料和文献:
Task与Activity详解 http://blog.csdn.net/mayingcai1987/article/details/6200909
Android Intent.FLAG_NEW_TASK详解,包括其他的标记的一些解释 http://my.oschina.net/AaronCN/blog/407461?fromerr=eCYA1KDe
android Intent机制详解 http://blog.csdn.net/t12x3456/article/details/7688154