发送和接收无序广播或有序广播需要注意的问题

一:发送无序广播或有序广播

public class BroadcastActivity extends FragmentActivity implements View.OnClickListener {
    private Button bt_send_non_orderbroadcast,bt_sendOrderBroadcast;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broadcasttest);
        bt_send_non_orderbroadcast = (Button) findViewById(R.id.bt_send_non_orderbroadcast);
        bt_send_non_orderbroadcast.setOnClickListener(this);
        bt_sendOrderBroadcast = (Button) findViewById(R.id.bt_sendOrderBroadcast);
        bt_sendOrderBroadcast.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            //发送无序广播
            case R.id.bt_send_non_orderbroadcast:
                System.out.println("开始发送无序广播");
                /**
                 * 无序广播的广播接收者不可以使用setResultData()方法和abortBroadcast()方法,
                 * 如果使用了会报错。
                 * 另外虽然使用getResultData()方法不报错,但是一般没什么意义,结果应该是null,但是在有序广播的第三个参数对应的广播接收者收到的无序
                 * 广播仍然可以使用该方法获取到数据,请看下面的发送有序广播的注释。
                 * 也就是说无序广播不可以被拦截,不可以被终止,不可以被修改.
                 * 无序广播任何接收者都可以接收到,无优先级问题。如果想通过无序广播传递数据,则可以调用intent.putExtra方法传递,
                 * 接收者可通过intent.get...接收,不可通过getResultData接收。
                 */
                Intent nonOrderIntent = new Intent();
                nonOrderIntent.setAction("com.yin.testbroadcast");
                nonOrderIntent.putExtra("info","领导发了5000块钱");
                //nonOrderIntent.setPackage(packageName);该广播仅对指定包名的应用有效
                sendBroadcast(nonOrderIntent);
                //sendBroadcast(intent,permission);带权限发送广播
                break;
            //发送有序广播
            case R.id.bt_sendOrderBroadcast:
                System.out.println("开始发送有序广播");
                /**
                 * 发送有序广播:可以被拦截、被终止、被修改,在
                 * sendOrderedBroadcast(intent, null, new Receiver2(), null, 0, "给五保户10000块", null)
                 * 方法中第三个参数是resultReceiver,该广播的各个接收者(包括resultReceiver)接收到广播之
                 * 后(中途被setResultData了,则广播数据是set后的),resultReceiver会最终再次接收一次广播(前面可能接
                 * 收一次了),且接收到的广播数据是最后一次被setResultData的数据。即使该广播被某个接收者终止了,resultReceiver
                 * 仍然可以最终再次(同样,前面可能接到一次了)接收广播(最后收到的这个广播其实已经变成了无序广播)。另外,广播接收者中的setResultData,
                 * getResultData,abortBroadCast方法只适用于有序广播。
                 *
                 * sendOrderedBroadcast()的第三个参数需要特别注意,第三个参数是指当该有序广播的所有广播接收者都接收到了该广播后或者某个广播接收者终止了该
                 * 广播后,第三个参数对应的广播接收者仍然可以再收到一次广播,但是,此时收到的广播已经是无序广播了,可以通过调用setResultData()或者abortBroadcast()
                 * 看日志是否报错来验证。也可以根据BroadcastReceiver的isOrderedBroadcast()方法来验证,若其返回值是true,说明是接收到的是有序广播,若为false说明
                 * 接收到的是无序广播
                 */
                Intent intent = new Intent();
                intent.setAction("com.yin.testbroadcast2");
                sendOrderedBroadcast(intent,null,new Receiver1(),null,0,"党中央给发了10000块",null);
                //sendOrderedBroadcast(intent,permission);给广播指定权限
                break;
            default:
                break;
        }

    }
}


二:注册广播接收者

<receiver android:name="com.mycompany.mysimple.broadcastOrder.Receiver1">
            <intent-filter android:priority="1000">
                <action android:name="com.yin.testbroadcast2"/>
            </intent-filter>
        </receiver>
        <receiver android:name="com.mycompany.mysimple.broadcastOrder.Receiver2">
            <intent-filter android:priority="500">
                <action android:name="com.yin.testbroadcast2"/>
            </intent-filter>
        </receiver>
        <receiver android:name="com.mycompany.mysimple.broadcastOrder.Receiver3">
            <intent-filter android:priority="0">
                <action android:name="com.yin.testbroadcast2"/>
            </intent-filter>
        </receiver>
三:接收无序广播或有序广播

public class Receiver1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        boolean orderedBroadcast = isOrderedBroadcast();
        if(orderedBroadcast){
            System.out.println("第1个广播接收者是有序广播");
        }else{
            System.out.println("第1个广播接收者是无序广播");
        }
        String resultData = getResultData();//获取有序广播的数据
        System.out.println("第1个接收者接收到的有序广播数据resultData:" + resultData);
        setResultData("党中央给发了8000块");//修改有序广播的数据
//        abortBroadcast();
    }
}

public class Receiver2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String resultData = getResultData();//获取有序广播的数据
        System.out.println("第2个接收者接收到的有序广播数据resultData:" + resultData);
        setResultData("党中央给发了5000块");//修改有序广播的数据
    }
}
public class Receiver3 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String resultData = getResultData();//获取有序广播的数据
        System.out.println("第3个接收者接收到的有序广播数据resultData:" + resultData);
        setResultData("党中央给发了2000块");//修改有序广播的数据
//        abortBroadcast();
    }
}





  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值