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

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

相关推荐
似霰29 分钟前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder
大风起兮云飞扬丶29 分钟前
Android——网络请求
android
干一行,爱一行31 分钟前
android camera data -> surface 显示
android
断墨先生1 小时前
uniapp—android原生插件开发(3Android真机调试)
android·uni-app
无极程序员2 小时前
PHP常量
android·ide·android studio
萌面小侠Plus3 小时前
Android笔记(三十三):封装设备性能级别判断工具——低端机还是高端机
android·性能优化·kotlin·工具类·低端机
慢慢成长的码农3 小时前
Android Profiler 内存分析
android
大风起兮云飞扬丶3 小时前
Android——多线程、线程通信、handler机制
android
L72564 小时前
Android的Handler
android
清风徐来辽4 小时前
Android HandlerThread 基础
android