• 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,前面那个链接必须通过FQ,当然我们提倡科学上网,所以国内镜像网站链接:https://developer.android.google.cn/about/versions/oreo/android-8.0.html

    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文件中任何的代码
        效果图:


     




  • 相关阅读:
    定义enum,我用struct { enum Type{};};
    喧嚣中的iPad与iPhone
    [Architecture]zheye.org(者也)
    Driveworks Online Configurator
    [Buzz.Today]2012.05.02
    C++中的默认构造函数
    安装Ubuntu,尝尝鲜
    在cs文件中控制控件的 css样式。
    如何生成静态页面的五种方案
    在服务器上 .netFramework2.0 环境下,如何能在不改变服务器设置下,让站点能够运行 AJAX 程序
  • 原文地址:https://www.cnblogs.com/fuyaozhishang/p/8580610.html
Copyright © 2020-2023  润新知