文章目录
- [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);
以上就是静态广播与动态广播的区别和用法了,感谢支持~