Android静态注册广播无法接收的问题(8.0+版本)
如果你静态注册的广播无法接收到消息,请先检查下:你的安卓版本是不是8.0+
前言
Google官方声明:Beginning with Android 8.0 (API level 26), the system imposes additional restrictions on manifest-declared receivers. If your app targets API level 26 or higher, you cannot use the manifest to declare a receiver for most implicit broadcasts (broadcasts that do not target your app specifically).
大概意思就是说:从android 8.0(API26)开始,对清单文件中静态注册广播接收者增加了限制,建议大家不要在清单文件中静态注册广播接收者。
其实说白点:就是因为在清单文件中静态注册广播接收者,容易让一些"不法分子"获取用户的隐私(如:电话监听、短信监听等等),所以google限制了静态注册(Android在保护用户隐私上坚持不懈的努力着...也许google还要其他的考虑吧。咱也不知道...咱也不敢问呐😁)
言归正传
虽然Google限制了清单文件中的静态注册方式,但是并不是说广播接收者的静态注册方式不能使用了!
那么该如何使用呢 ???(直接上代码说明)
清单文件 AndroidManifest.xml
<!--在配置文件中:静态注册一个广播接收者-->
<receiver android:name=".receiver.TestDemoReceiver">
<!--定义一个意图过滤器来接收(监听)指定的action-->
<intent-filter>
<!--配置自定义的 action(事件类型)-->
<action android:name="x.xx.xxx.xxx" />
</intent-filter>
</receiver>
广播接收者
public class TestDemoReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("onReceive", "我是广播接收者");
}
}
应用中针对静态注册的广播接收者。发送广播的方式如下:
- 向其他应用中静态注册的广播接收者发送广播
//获取 Intent 对象
Intent intent = new Intent();
//使用隐式意图,为intent添加指定的广播事件类型
intent.setAction("x.xx.xxx.xxx");
//该方式适用:给其他应用的广播接收者发送消息(指定应用的包名、指定类的全类名)
//intent.setComponent(new ComponentName("包名", "包名.receiver.TestDemoReceiver"));
//intent.setClassName("包名", "包名.receiver.TestDemoReceiver");
//发送广播
sendBroadcast(intent);
- 给本应用中静态注册的广播接收者发送广播
//获取 Intent 对象
Intent intent = new Intent();
//使用隐式意图,为intent添加指定的广播事件类型
intent.setAction("x.xx.xxx.xxx");
//如果是给自身应用内广播接收者发送广播
//intent.setComponent(new ComponentName(this, TestDemoReceiver.class));
intent.setClassName(this,"包名.receiver.TestDemoReceiver");
//发送广播
sendBroadcast(intent);
@Everyone:大家多多交流,共同进步~