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

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

相关推荐
高林雨露22 分钟前
RecyclerView中跳转到最后一条item并确保它在可视区域内显示
android
移动开发者1号3 小时前
ReLinker优化So库加载指南
android·kotlin
山野万里__3 小时前
C++与Java内存共享技术:跨平台与跨语言实现指南
android·java·c++·笔记
Huckings3 小时前
Android 性能问题
android
移动开发者1号3 小时前
剖析 Systrace:定位 UI 线程阻塞的终极指南
android·kotlin
移动开发者1号3 小时前
深入解析内存抖动:定位与修复实战(Kotlin版)
android·kotlin
whysqwhw3 小时前
OkHttp深度架构缺陷分析与革命性演进方案
android
Digitally5 小时前
如何将文件从 iPhone 传输到 Android(新指南)
android·ios·iphone
whysqwhw6 小时前
OkHttp深度架构缺陷分析与演进规划
android
用户7093722538516 小时前
Android14 SystemUI NotificationShadeWindowView 加载显示过程
android