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:大家多多交流,共同进步~

posted @ 2019-09-19 20:03  ming3  阅读(4347)  评论(0编辑  收藏  举报