Android中的静态广播与动态广播

本文介绍了Android中的静态广播和动态广播概念,包括在Manifest中静态注册、Android8.0后对静态广播的限制,以及动态广播的代码注册与解除。还讨论了如何处理隐式和显式广播,以及发送广播的方法。
摘要由CSDN通过智能技术生成

1. 概念介绍

上篇文章我们介绍了Android中广播的基础知识,对Android广播有了初步认识,本文我们按照注册方式,介绍静态广播动态广播

  • 静态广播,就是在Manifest文件中注册的广播。常驻内存中,可在App未启动时就监听广播,如监听短信、充电等系统广播事件。
  • 动态广播,在代码中注册以及解除注册的广播。

注:同时注册时,动态广播优先于静态广播。

2 静态广播

首先创建广播接收器类:MyBroadcastReceiver.java

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 收到广播消息
    }
}

然后,在Manifest文件中注册广播接收器:

<receiver android:name=".receiver.MyBroadcastReceiver">
    <intent-filter>
        <action android:name="my_broadcaster_action" />
    </intent-filter>
</receiver>

<action>标签是用来过滤广播信息的,其值是一个字符串。

以上便完成了广播的静态注册,即静态广播。

接下来就可以使用Intent发送广播了, 比如:

// 创建Intent
Intent intent = new Intent();
intent.setAction="my_broadcaster_action");
intent.putExtra("key_data", filePath);
// 发送广播
sendBroadcast(intent);

2.1 Android 8.0以上静态广播受限

Android 8.0及以上禁止了后台执行,因此无法收到静态注册的隐式广播。

错误日志:W/BroadcastQueue: Background execution not allowed: receiving Intent

对于我们自己定义的广播,可通过以下方式解决:

  • 方法一:发送广播时改为显式广播:intent.setPackage(getPackageName())

  • 方法二:添加可后台执行的flag: intent.addFlags(0x01000000)

这里的 0x01000000 是 Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND 的值

而对于系统广播,如充电器连接,由于我们无法修改系统发送广播时的行为,因此无法用静态注册来接收该类广播。

当然,也有一些系统广播是不受该限制的,如:开机完成、设置系统时间、设置当前时区等。
详细见:https://developer.android.google.cn/guide/components/broadcast-exceptions

3. 动态广播

所谓动态广播,就是在代码中动态注册的广播。

同意,首先需要创建广播接收器类:MyBroadcastReceiver.java

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 收到广播消息
    }
}

然后,在代码中注册,一般是在Activity的onCreate方法中:

private MyBroadcastReceiver receiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_broadcast_test);
    // new 出广播接收器的对象
    receiver = new MyBroadcastReceiver();
    // 设置Action过滤
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("my_broadcaster_action");
    // 注册广播接收器
    registerReceiver(receiver, intentFilter);
}

动态广播不要忘记解除注册,一般是在Activity的onDestroy中:

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(receiver);
}

以上便是动态广播的注册过程。

发送广播的方法与静态广播一致:

// 创建Intent
Intent intent = new Intent();
intent.setAction="my_broadcaster_action");
intent.putExtra("key_data", filePath);
// 发送广播
sendBroadcast(intent);

以上就是静态广播与动态广播的区别和用法了,感谢支持~

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子林Android

感谢老板,老板大气!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值