Android 四大组件之 BroadcastReceiver_2 例子

BroadcastReceiver 概述上一篇参考:https://blog.csdn.net/whjk20/article/details/113182525

以下为简单学习的例子。

目录

一、 接收器

1. 创建接收器, 继承 BroadcastReceiver

2. 注册广播接收器

二、广播(发送广播)

1. 一般广播

2. 有序广播

三、注意事项


一、 接收器

1. 创建接收器, 继承 BroadcastReceiver

public class MyBroadcastReceiver1 extends BroadcastReceiver {
    private final static String TAG = "MyBroadcastReceiver1";

    private void log(String msg) {
        Log.d(TAG, msg);
    }

    public MyBroadcastReceiver1() {
        log("constructor");
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getStringExtra("action");
        log("onReceive action=" + action);
    }
}
public class MyBroadcastReceiver2 extends BroadcastReceiver {
    private final static String TAG="MyBroadcastReceiver2";

    private void log(String msg) {
        Log.d(TAG, msg);
    }

    public MyBroadcastReceiver2() {
        log("constructor");
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getStringExtra("action");
        log("onReceive action=" + action);
        if(isOrderedBroadcast()) { //注意判断,否则会抛异常
            //abortBroadcast();
            //log("onReceive abortBroadcast" );
        }

        log("onReceive done" );
    }
}
public class MyBroadcastReceiver3 extends BroadcastReceiver {
    private final static String TAG="MyBroadcastReceiver3";

    private void log(String msg) {
        Log.d(TAG, msg);
    }

    public MyBroadcastReceiver3() {
        log("constructor");
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getStringExtra("action");
        log("onReceive action=" + action);
    }
}

其中MyBroadcastReceiver2 可以中断广播。

2. 注册广播接收器

(1 )MyBroadcastReceiver1、MyBroadcastReceiver2 使用静态方式注册

并且MyBroadcastReceiver2 设置优先级为 50

        <receiver android:name=".MyBroadcastReceiver1">
            <intent-filter>
                <action android:name="com.example.broadcastreceiverpart.MyBroadcastReceiver1.action1" />
            </intent-filter>
        </receiver>

        <receiver android:name=".MyBroadcastReceiver2" >
            <intent-filter android:priority="50">
                <action android:name="com.example.broadcastreceiverpart.MyBroadcastReceiver1.action1"/>
            </intent-filter>
        </receiver>

(2) MyBroadcastReceiver3使用动态注册, 其中在Activity 的onCreate 注册, 在Activity 的onDestroy 中解注册。

    private MyBroadcastReceiver3 myBroadcastReceiver3;

    private void register() {
        if (myBroadcastReceiver3 == null) {
            Intent intent = new Intent(this, MyBroadcastReceiver3.class);
            myBroadcastReceiver3 = new MyBroadcastReceiver3();
            IntentFilter intentFilter = new IntentFilter("com.example.broadcastreceiverpart.MyBroadcastReceiver1.action1");
            registerReceiver(myBroadcastReceiver3, intentFilter);
            log("register done");
        } else {
            log("register return because it is already registered");
        }
    }

    private void unregister() {
        if(myBroadcastReceiver3 !=null) {
            unregisterReceiver(myBroadcastReceiver3);
            myBroadcastReceiver3 = null;
            log("unregister done");
        } else {
            log("unregister return because it is not register");
        }
    }

二、广播(发送广播)

1. 一般广播

    public void sendBroadcast(View view) {
        log("sendBroadcast start");

        Intent intent = new Intent("com.example.broadcastreceiverpart.MyBroadcastReceiver1.action1");
        intent.putExtra("action", "no order");
        intent.setPackage("com.example.broadcastreceiverpart");
        sendBroadcast(intent);

        log("sendBroadcast end");
    }

2. 有序广播

    public void sendOrderBroadcast(View view) {
        log("sendOrderBroadcast start");

        Intent intent = new Intent("com.example.broadcastreceiverpart.MyBroadcastReceiver1.action1");
        intent.putExtra("action", "with order");
        intent.setPackage("com.example.broadcastreceiverpart");
        sendOrderedBroadcast(intent, null);

        log("sendOrderBroadcast end");
    }
}

其中这里两个方法是响应两个Button 的onClick 操作,可以忽略View view 这个参数。

三、注意事项

1. 静态注册广播, 发送一般广播后,无法收到的问题。 例如报错: Background execution not allowed: receiving Intent

解决方法: (原因为隐式发送), 改为显式发送,即在发送广播前,为intent 设置包名:  intent.setPackage("com.example.broadcastreceiverpart");

2. 静态注册,每次接收到,都会重现创建一个BroadcastReceiver 的实例对象,使用完后销毁

2021-01-26 10:43:18.690 23603-23603/com.example.broadcastreceiverpart D/MyBroadcastReceiver1: constructor
2021-01-26 10:43:18.691 23603-23603/com.example.broadcastreceiverpart D/MyBroadcastReceiver1: onReceive action=no order

2021-01-26 11:02:06.945 25259-25259/com.example.broadcastreceiverpart D/MyBroadcastReceiver1: constructor
2021-01-26 11:02:06.946 25259-25259/com.example.broadcastreceiverpart D/MyBroadcastReceiver1: onReceive action=no order

3. 发送一般广播时,对于同个action, intent-filter设置的优选级高(android:priority数值大)先收到,
如果都没有设置priority 则接收顺序跟注册的顺序有关(Android manifest)

4. 发送有序广播时,优选级高的先收到,并且可以中断广播。

  MyBroadcastReceiver2 中

   @Override
    public void onReceive(Context context, Intent intent) {
        ...
        if(isOrderedBroadcast()) { //注意判断,否则会抛异常
            abortBroadcast();
            log("onReceive abortBroadcast" );
        }
    }

2021-01-26 11:16:35.606 28445-28445/com.example.broadcastreceiverpart D/MyBroadcastReceiver2: constructor
2021-01-26 11:16:35.607 28445-28445/com.example.broadcastreceiverpart D/MyBroadcastReceiver2: onReceive action=no order
2021-01-26 11:16:35.607 28445-28445/com.example.broadcastreceiverpart D/MyBroadcastReceiver2: onReceive abortBroadcast

MyBroadcastReceiver1 则不会收到。

并且需要判断isOrderedBroadcast(), 然后才调用abortBroadcast, 否则会抛出异常 (非有序广播 使用了 中断之类的)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值