Android 8.0新特性-取消大部分静态注册广播

    今天楼主在写一个广播的demo,功能非常的简单,就是一个应用发送一个自定义的广播,同时在这个应用里面定义了一个广播接受者,并且在AndroidManifest文件中进行静态的注册。Demo看上去非常的简单,但是在Android 8.0的设备运行这个应用,始终不能接收到这个发送出去的广播,感觉非常的蒙蔽。关键是,在Android 7.0的设备是能够接收到的!

1. 原因

    看到这个情况,我就觉得不是我的代码问题,应该是Android 8.0相较于Android 8.0之前的设备有所变换,于是Google了一把,果然被我找到了问题所在。在Google爸爸的Android官网找到了Android 8.0行为变更的介绍,其中有一句说的是:


    这句话的意思就是说,在Android 8.0的平台上,应用不能对大部分的广播进行静态注册,也就是说,不能在AndroidManifest文件对有些广播进行静态注册,这里必须强调是有些广播,因为有些广播还是能够注册的。比如,经过楼主测试,对接收Android 开机的广播通过静态注册还是能够正常接收的。
    Android 8.0行为变更的介绍链接:https://developer.android.com/about/versions/oreo/android-8.0-changes.html?hl=zh-cn

2. 解决办法

    前面我们知道了是什么原因导致的,只要知道了原因,解决办法就非常容易的想出来的。
    我们知道广播的注册方式分为两种:

1. 静态注册,也就是说在AndroidManifest文件中对BroadcastReceiver进行注册,通常还会加上action用来过滤。
2. 动态注册,调用Context中的registerReceiver对广播进行动态注册,使用unRegisterReceiver方法对广播进行取消注册的操作。

3. 代码

    MainActivity文件的代码

public class MainActivity extends AppCompatActivity {

    private Button mButton = null;

    private IntentFilter mIntentFilter = null;

    private MyBroadcastReceiver mMyBroadcastRecvier = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //过滤器
        mIntentFilter = new IntentFilter("pby");
        //创建广播接收者的对象
        mMyBroadcastRecvier =  new MyBroadcastReceiver();
        //注册广播接收者的对象
        registerReceiver(mMyBroadcastRecvier, mIntentFilter);
        mButton = (Button) findViewById(R.id.id_button);
        mButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("pby");
                //发送一个广播
                sendBroadcast(intent);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消广播接收者的注册
        unregisterReceiver(mMyBroadcastRecvier);
    }
}

    MyBroadcastReceiver文件的代码

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "收到了自定义的广播", Toast.LENGTH_LONG).show();
    }
}

    只有上面的简单配置,没有修改AndroidManifest文件中任何的代码
    效果图:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 详细区分广播注册中的动态注册和静态注册的差异 首先是静态注册广播,来发送有序广播. 发送代码是通过Intent来发...
    小徐andorid阅读 1,860评论 0 2
  • 广播机制 简介 标准广播完全异步执行的广播同一时刻多个接收器收到消息不能阻断 有序广播同步执行的广播同一个时刻只有...
    Mason_Xu阅读 305评论 0 0
  • 隐式广播权限被收窄,大多数隐式广播已经不能被静态注册的广播接收者接收到了。建议采用动态注册广播接收者 如果非要使用...
    roky_e阅读 686评论 0 0
  • BroadcastReceiver作为Android四大组件之一,在Android日常开发中有着不可或缺的作用,主...
    陕E_沙僧阅读 1,726评论 0 1
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,596评论 16 22