Android 广播接收器BroadcastReceiver(五)

来源:互联网 发布:免费本地记账软件 编辑:程序博客网 时间:2024/04/28 02:17

这节课学习广播的优先级问题。假如两个广播接收器监听同一个广播,会出现什么样的问题呢?新建一个工程测试下。创建两个广播接收器,代码如下:

public class FirstReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        // TODO Auto-generated method stub        Log.i("info", "FirstReceiver 收到消息");    }}public class SecondReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        // TODO Auto-generated method stub        Log.i("info", "SecondeReceiver 收到消息");    }}

注册时,监听同一个广播

 <receiver android:name="com.example.priorityreceiver.FirstReceiver" >     <intent-filter>         <action android:name="com.example.priorityreceiver.MY_BROADCAST" />     </intent-filter> </receiver> <receiver android:name="com.example.priorityreceiver.SecondReceiver" >     <intent-filter>         <action android:name="com.example.priorityreceiver.MY_BROADCAST" />     </intent-filter> </receiver>

在主程序中添加广播发送按钮。

Button button = (Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View v) {        // TODO Auto-generated method stub        Intent intent = new Intent(                "com.example.priorityreceiver.MY_BROADCAST");        sendBroadcast(intent);    }});

点击发送按钮,查看Logcat:
这里写图片描述
现在有一个问题,某个程序需要第二个接收器要先接收到消息,这该怎么办呢,这就要用到广播的优先级。在第二个广播接收器的注册代码中修改如下:

<receiver android:name="com.example.priorityreceiver.SecondReceiver" >    <intent-filter android:priority="100" >        <action android:name="com.example.priorityreceiver.MY_BROADCAST" />    </intent-filter></receiver>

android:priority=”100”代表优先级的高低,默认优先级为0;重新运行程序点击发送按钮,查看Logcat:
这里写图片描述
可以看到第二个接收器就先接到消息了。同时,假如第二个接收器接到了广播,不想要第一个接收器再接收了该怎么办了?就像boss在群里说谁去给我打杯水,同事A去做了,同事B就不用去做了。Android提供了一个函数abortBroadcast();来阻断广播,在第二个广播接收器中添加这个函数,代码如下:

public class SecondReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        // TODO Auto-generated method stub        Log.i("info", "SecondeReceiver 收到消息");        abortBroadcast();    }}

重新运行程序,查看Logcat:
这里写图片描述
第一个接收器还是收到了广播,而且系统还发出了提示信息。可见标准广播是无法阻断,假如要用到阻断该怎么办呢?修改发送的广播类型为有序广播,代码如下:

Intent intent = new Intent(        "com.example.priorityreceiver.MY_BROADCAST");sendOrderedBroadcast(intent, null);

重新运行程序,查看Logcat:
这里写图片描述
这样目的就达到了。
项目地址:明天更新
心记不如淡墨,哈哈。

0 0