Study-android BroadcastReceiver总结

来源:互联网 发布:淘宝怎样充话费 编辑:程序博客网 时间:2024/06/05 14:08
/**
 * 一、简单介绍 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里面放数据putExtrasendBroadcast(intent);DBG.log(TAG, "SendBtn1");

每个接收者都类似下面的代码

BroadcastReceiver mFifthReceiver = new BroadcastReceiver() {private static final String TAG = "mSixthReceiver";@Overridepublic 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";@Overridepublic 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";@Overridepublic 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









0 0