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

文章目录

  • [1. 概念介绍](#1. 概念介绍)
  • [2 静态广播](#2 静态广播)
    • [2.1 Android 8.0以上静态广播受限](#2.1 Android 8.0以上静态广播受限)
  • [3. 动态广播](#3. 动态广播)

1. 概念介绍

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

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

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

2 静态广播

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

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

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

xml 复制代码
<receiver android:name=".receiver.MyBroadcastReceiver">
    <intent-filter>
        <action android:name="my_broadcaster_action" />
    </intent-filter>
</receiver>

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

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

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

java 复制代码
// 创建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

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

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

java 复制代码
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中:

java 复制代码
@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(receiver);
}

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

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

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

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

相关推荐
非凡ghost16 分钟前
LSPatch官方版:无Root Xposed框架,自由定制手机体验
android·智能手机·软件需求
_extraordinary_16 分钟前
MySQL 库的操作 -- 增删改查,备份和恢复,系统编码
android·mysql·oracle
西瓜本瓜@3 小时前
在Android中如何使用Protobuf上传协议
android·java·开发语言·git·学习·android-studio
似霰6 小时前
安卓adb shell串口基础指令
android·adb
fatiaozhang95278 小时前
中兴云电脑W102D_晶晨S905X2_2+16G_mt7661无线_安卓9.0_线刷固件包
android·adb·电视盒子·魔百盒刷机·魔百盒固件
CYRUS_STUDIO9 小时前
Android APP 热修复原理
android·app·hotfix
鸿蒙布道师10 小时前
鸿蒙NEXT开发通知工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
鸿蒙布道师10 小时前
鸿蒙NEXT开发网络相关工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
大耳猫10 小时前
【解决】Android Gradle Sync 报错 Could not read workspace metadata
android·gradle·android studio
ta叫我小白10 小时前
实现 Android 图片信息获取和 EXIF 坐标解析
android·exif·经纬度