* 一、简单介绍 BroadcastReceiver 也就是广播接收者,它就是用来接收来自系统和应用中的广播。
* 应用的UI界面需要随着后台事物的进度而实时显示。目前我就接触了两种办法。一个是通过Handler,
* 发送消息通知UI界面更新。另外一个就是通过发送自己定义的广播, UI界面的Activity里面定义 自己的
* BroadcastReceiver并且去更新。例如服务器正在播放音乐,自动播放下一首的时候我们可
* 以发送一个广播,在UI界面接收这个广播,并且等待广播的内容(正在播放的音乐曲目),然后就可以更新UI显示正确的播放曲目。
*
* 其实 在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能,
* 当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作,当电池电量改变时,系统会产生一条广播,
* 接收到这条广播就能在电量低时告知用户及时保存进度等等。
*
* 二、广播的使用 同代码一样定义一个BroadcastReceiver。然后需要对这个BroadcastReceiver进行注册。<br>
* 注册方式<br>
* 1:在Manifest里面注册,将是永久的,即使应用退出来,但是还是能够接受到广播,这是静态注册
* 2:如果在代码中通过register注册,则应用退出的时候可以/必须通过unregister进行解除,不会再接受广播 这是动态编译
*
* 在Mainfest注册入下,目前就使用到了 intent-filter。如果没有intent-filter的话,这个receiver是不会接收任何广播的。下面添加了3个aciton,两个是自己定义的。一个是系统的action接收信息。如果广播的是这三种action中的一种,receiver都能够接收到信息。第三个action是接收信息。主要是验证退出应用后自己给自己发送信息看能不能接收到广播。通过验证,给自己发送信息的时候。下面的FirstReceiver是接收到广播的。
<receiver android:name="com.wyd.study.receiver.FirstReceiver" >
<intent-filter>
<action android:name="com.wyd.study.receiver.action_TEST" />
<action android:name="com.wyd.study.receiver.action_TEST1" />
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
上面的类似于下面的代码。只是下面的是动态注册。退出应用后这个receviver是不能够接受到任何东西。通过验证,给自己发送信息的时候。下面的mFifthReceiver是接收到广播的。
<span style="white-space:pre"> </span>IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_TEST);//ACTION_TEST = <span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">com.wyd.study.receiver.action_TEST</span>
filter.addAction(ACTION_TEST1);
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(mFifthReceiver, filter);
发送广播的代码如下:
<span style="white-space:pre"> </span>Intent intent = new Intent();
intent.setAction(ACTION_TEST); //还可以在这个intent里面放数据putExtra
sendBroadcast(intent);
DBG.log(TAG, "SendBtn1");
每个接收者都类似下面的代码
BroadcastReceiver mFifthReceiver = new BroadcastReceiver() {
private static final String TAG = "mSixthReceiver";
@Override
public void onReceive(Context context, Intent intent) {
DBG.log(TAG, DBG._FUNC_()); //通过打log知道有没有接收到广播
//通过getAction()可以知道是那个广广播;因为这个recevier可能会有很多action
//通过各种getExtras()可以得到广播的附带东西;
<span style="white-space:pre"> </span>//可以在这里更新UI
}
};
三、权限控制 。如果发送广播的时候增加了权限。则应用也有有相应的权限才能够接受到广播。
intent.setAction(ACTION_TEST1);
/** 加了权限控制,需要在Manifest里面增加相应的权限才能收到广播 */
sendBroadcast(intent, BROADCAST_PERMISSION);
Manifest定义权限如下:
<!-- 定义自己的权限 -->
<permission
android:name="wyd.permission.BROADCAST_PERMISSION"
android:protectionLevel="normal" />
<!-- 使用这个权限 -->
<uses-permission android:name="wyd.permission.BROADCAST_PERMISSION" />
四、有序广播
有序广播比较特殊,它每次只发送到优先级较高的接收者那里, 然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个,同时我们也可以通过setResultExtras方法将一个Bundle对象设置为结果集对象, 传递到下一个接收者那里,这样以来,优先级低的接收者可以用getResultExtras获取到最新的经过处理的信息集合。也可以通过abortBroadcast()终止广播。
看下面定义的BroadcastReceiver
public class FourthReceiver extends BroadcastReceiver {
private final static String TAG = "FourthReceiver";
@Override
public void onReceive(Context context, Intent intent) {
DBG.log(TAG, DBG._FUNC_());
Bundle bundle = new Bundle();
bundle.putString("MSG", "wangyd");
setResultExtras(bundle);// 这个是把内容整理后给下一级
// abortBroadcast(); //这个会终止广播到下一级
}
}
public class ThirdReceiver extends BroadcastReceiver {
<span style="white-space:pre"> </span>private final static String TAG = "ThirdReceiver";
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public void onReceive(Context context, Intent intent) {
<span style="white-space:pre"> </span>DBG.log(TAG, DBG._FUNC_());
<span style="white-space:pre"> </span>}
}
在activity里面也定义一个BroadcastReceiver
BroadcastReceiver mSixthReceiver = new BroadcastReceiver() {
private static final String TAG = "mSixthReceiver";
@Override
public void onReceive(Context context, Intent intent) {
DBG.log(TAG, DBG._FUNC_());
String s = getResultExtras(true).getString("MSG");
DBG.log(TAG, s);
}
};
分别的注册信息如下
<receiver android:name="com.wyd.study.receiver.ThirdReceiver" >
<intent-filter android:priority="999" >
<action android:name="com.wyd.study.receiver.action_TEST2" />
</intent-filter>
</receiver>
<receiver android:name="com.wyd.study.receiver.FourthReceiver" >
<intent-filter android:priority="998" >
<action android:name="com.wyd.study.receiver.action_TEST2" />
</intent-filter>
</receiver>
IntentFilter filter1 = new IntentFilter();
filter1.addAction(ACTION_TEST2);
filter1.setPriority(997);
registerReceiver(mSixthReceiver, filter1);
现在这三个接收者的<intent-filter>多了一个android:priority属性,并且依次减小。 这个属性的范围在-1000到1000,数值越大,优先级越高。
下面发送我们的广播:
Intent intent = new Intent();
intent.setAction(ACTION_TEST2);
sendOrderedBroadcast(intent, BROADCAST_PERMISSION);
可以等到的结果是在先进入ThirdReceiver再进入FourthReceiver最后进入mSixthReceiver,而且在mSixthReceiver中打印了wangyd
如果在 FourthReceiver 中增加了 abortBroadcast(); 则会终止广播到下一级,mSixeReceiver 则不会接收到广播
源码下载:http://download.csdn.net/detail/yidong_wang/8975697