1.什么是广播?
简单来说,它是一个系统全局的监听器,用于监听系统全局的Broadcast消息,所以它可以很方便的进行系统组件之间的通信。但是注意,广播不适合做耗时的操作。
2.广播的种类
普通广播:Normal Broadcase,它是完全异步的,也就是说,在逻辑上,当一个Broadcast被发出之后,所有的与之匹配的BroadcastReceiver都同时接收到Broadcast。优点是传递效率比较高,但是也有缺点,就是一个BroadcastReceiver不能影响其他响应这条Broadcast的BroadcastReceiver。
有序广播:Ordered Broadcast,它是同步执行的,也就是说有序广播的接收器将会按照预先声明的优先级依次接受Broadcast,是链式结构,优先级越高(-1000~1000),越先被执行。因为是顺序执行,所有优先级高的接收器,可以把执行结果传入下一个接收器中,也可以终止Broadcast的传播(通过abortBroadcast()方法),一旦Broadcast的传播被终止,优先级低于它的接收器就不会再接收到这条Broadcast了。
粘性消息:粘性消息在发送后就一直存在于系统的消息容器里面,等待对应的处理器去处理,如果暂时没有处理器处理这个消息则一直在消息容器里面处于等待状态。
注意:普通广播和粘性消息不能被截获,而有序广播是可以被截获的
3.广播的注册
1)动态注册:
//在活动中自定义一个类继承广播
BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 相关处理,如收短信,监听电量变化信息
}
};
代码中注册:
IntentFilter intentFilter = new IntentFilter( "android.provider.Telephony.SMS_RECEIVED " );
registerReceiver( mBatteryInfoReceiver , intentFilter);
在活动销毁时调用unregisterReceiver()方法 把广播销毁
2)静态注册:
在AndroidManifest.xml中注册广播接收器:
<!--在这里注册广播接收器-->
<!--
.TestReceiver是接收器类的类名。
过滤器intent-filter定义了动作类型为EDIT,
说明这个接收器只有遇到EDIT这个动作才会接收
-->
<receiver android:name=".TestReceiver">
<intent-filter>
<action android:name="android.intent.action.EDIT" />
</intent-filter>
</receiver>
实现广播接收器:
public class TestReceiver extends BroadcastReceiver
重写 onReceive方法
动态注册 和 静态注册的区别 :
动态注册:是与窗口有关的,也就说只有相应的活动打开了,才可以接受广播
静态注册: 是全局的,并不需要程序运行也能接受广播,如:开机自动打开某个app
4.发送广播的方式
⑴、 发送普通广播:
// 发送一个普通消息
Intent intent = new Intent();
intent.setAction("asdfasdf");
this.sendBroadcast(intent);
⑵、 发送有序广播:
// 发送一个有序消息
Intent intent = new Intent();
intent.setAction("asdfasdf");
this.sendOrderedBroadcast(intent,null);
⑶、 发送粘性广播:
// 发送一个粘性消息
Intent intent = new Intent();
intent.setAction("qwerqwer");
this.sendStickyBroadcast(intent);
一篇非常详细的广播文章:http://yangguangfu.iteye.com/blog/1063732
待续。。