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);

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

相关推荐
model200528 分钟前
android + tflite 分类APP开发-2
android·分类·tflite
彭于晏68938 分钟前
Android广播
android·java·开发语言
与衫2 小时前
掌握嵌套子查询:复杂 SQL 中 * 列的准确表列关系
android·javascript·sql
500了8 小时前
Kotlin基本知识
android·开发语言·kotlin
人工智能的苟富贵9 小时前
Android Debug Bridge(ADB)完全指南
android·adb
小雨cc5566ru14 小时前
uniapp+Android面向网络学习的时间管理工具软件 微信小程序
android·微信小程序·uni-app
bianshaopeng15 小时前
android 原生加载pdf
android·pdf
hhzz15 小时前
Linux Shell编程快速入门以及案例(Linux一键批量启动、停止、重启Jar包Shell脚本)
android·linux·jar
火红的小辣椒16 小时前
XSS基础
android·web安全
勿问东西18 小时前
【Android】设备操作
android