zoukankan      html  css  js  c++  java
  • 特殊广播如何实现后台监听

    前言

    Android8.0版本开始,对静态注册广播事件做了限制。但开发中,有时候却需要实现在后台长期运行一些广播事件的监听,处理一些业务。如:时间的监听。

    既然Google对配置文件中静态注册做了限制,那我们该如何在后台长期维护一个监听事件呢?下面咱们就来一起学习下吧。

    正文

    • 由于特殊广播静态注册无效,必须动态注册,而在Activity中动态注册后,当Activity退出后,就无法接收指定的特殊广播事件了。
    • 但Services(服务)是可以长期运行在后台的,那么在Service中动态注册指定的特殊广播事件监听,是否可以有效的保证广播监听长期运行?答案是肯定的。(废话不多说了,直接上代码)

    需求:应用A实现对屏幕开、关的监听,且要求即便应用A退出后,依然可以监听到屏幕的开、关事件(以Log打印为例)

    • SpecialListenerReceiver(创建一个广播接收者)
    //定义一个特殊的广播接收者:监听特殊广播。如:屏幕的开与关
    public class SpecialListenerReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            //获取广播事件类型
            String action = intent.getAction();
            if ((Intent.ACTION_SCREEN_ON).equals(action)) {
                Log.e("特殊的广播", "开...");
            } else if ((Intent.ACTION_SCREEN_OFF).equals(action)) {
                Log.e("特殊的广播", "关...");
            }
        }
    }
    
    • SpecialListenerService(创建一个服务,服务内注册特殊广播事件)
    //为监听:特殊广播 而创建的服务
    public class SpecialListenerService extends Service {
    
        private SpecialListenerReceiver listenerReceiver;
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
        @Override
        public void onCreate() {
            super.onCreate();
            //创建一个意图过滤器对象,并添加广播事件
            IntentFilter filter = new IntentFilter();
            filter.addAction(Intent.ACTION_SCREEN_ON);
            filter.addAction(Intent.ACTION_SCREEN_OFF);
            listenerReceiver = new SpecialListenerReceiver();
            //注册广播事件
            this.registerReceiver(listenerReceiver, filter);
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            if(listenerReceiver!=null){
                this.unregisterReceiver(listenerReceiver);
            }
        }
    }
    
    • 特别注意:在 AndroidManifest.xml 文件中配置服务
      广播接收者无序清单文件中再次注册了(服务中已经动态注册)
    <service android:name=".SpecialListenerService" />
    
    • 在 Activity 中开启服务
    public class MainActivity extends BaseActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Intent intent = new Intent(this, SpecialListenerService.class);
            this.startService(intent);//开启服务
            Log.e("特殊的广播", "MainActivity的【onCreate】方法执行");
        }
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.e("特殊的广播", "MainActivity的【onDestroy】方法执行");
        }
    }
    

    Log 打印展示

    • 当 MainActivity 的onCreate方法执行后,服务开启,关闭屏幕和点量屏幕,服务内注册的广播可以监听(此时应用还未退出)
    • 当 MainActivity 的onDestroy方法执行后,表示当前应用已退出(不再是前台进程),再次操作屏幕的关闭和点亮,依然可以接收到广播事件。实现了后台长时间接收特殊广播事件的操作!

    Surface: getSlotFromBufferLocked: unknown buffer: 0xb40bd840是我使用模拟器的原因,忽略即可。

  • 相关阅读:
    mockito测试final类/static方法/自己new的对象
    flink 1.11.2 学习笔记(5)-处理消息延时/乱序的三种机制
    linux查找操作
    分析MongoDB架构案例
    legend3---bootstrap modal框出现蒙层,无法点击modal框内容(z-index问题)
    legend3---laravel报419错误
    laravel自定义中间件实例
    laravel中间件Middleware原理解析及实例
    git: Failed to connect to github.com port 443: Timed out
    记忆规律
  • 原文地址:https://www.cnblogs.com/io1024/p/11574240.html
Copyright © 2011-2022 走看看