2025-05-03 21:25:37

文章目录

1. 概念介绍2 静态广播2.1 Android 8.0以上静态广播受限

3. 动态广播

1. 概念介绍

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

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

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

2 静态广播

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

public class MyBroadcastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

// 收到广播消息

}

}

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

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

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

接下来就可以使用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);

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

Copyright © 2088 英式橄榄球世界杯_世界杯女篮 - tylpr.com All Rights Reserved.
友情链接