关于android广播监听亮灭屏的学习

    BroadcastReceiver是安卓中四大组件之一,用于接受广播通知。常用于监听系统的事件,比如:开机、锁屏、解锁屏、电量变化、网络变化、短信收发等。有时候还有收发自定义的广播的需求。
    广播注册分为静态注册和动态注册。区别如下:

1.动态注册广播不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收  
          器。 静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
2.当广播为有序广播时:
          1 优先级高的先接收
          2 同优先级的广播接收器,动态优先于静态
          3 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。
3.当广播为普通广播时:
         1 无视优先级,动态广播接收器优先于静态广播接收器
         2 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。
在高版本安卓中,部分频繁发送的广播事件只能动态注册,也就是代码方式注册。比如:电量变化、锁屏、解锁等广播事件。
至于这么设计,大概是考虑到在配置文件中注册,将会一直运行接收者的代码,
而通过代码方式注册的,在应用退出后,就无法接收了,这样省电省资源。

    静态注册的格式:在AndroidManifest.xml文件中配置

  
              
                  
              

    动态注册的格式:

    //放在文件申明部分
    // add: detect screen status, false for power off, ture for power up.
    boolean mScreenPowerStatus = true;//全局标识位,方便收到广播后针对性操作
    ScreenStatusReceiver mScreenStatusReceiver;//全局广播接受对象
   //广播接受类
    private class ScreenStatusReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if("android.intent.action.SCREEN_ON".equals(intent.getAction())) {
                Log.d(TAG, "Detect screen on and set mScreenPowerStatus false");
                mScreenPowerStatus = true;
            } else if("android.intent.action.SCREEN_OFF".equals(intent.getAction())) {
                Log.d(TAG, "Detect screen off and set mScreenPowerStatus ture");
                mScreenPowerStatus = false;
            }
        }
    }
  //广播在哪里使用就在哪里进行注册
  //Register Receiver
  ScreenStatusReceiver mScreenStatusReceiver = new ScreenStatusReceiver();//new一个接受者
  IntentFilter filterIF = new IntentFilter();//new一个intent过滤器
  filterIF.addAction("android.intent.action.SCREEN_ON");//增加亮屏操作
  filterIF.addAction("android.intent.action.SCREEN_OFF");//增加灭屏操作
  registerReceiver(mScreenStatusReceiver, filterIF);//注册监听
 //在ondestory里面进行对象的销毁
     public void onDestroy() {
        unregisterReceiver(mScreenStatusReceiver);//注销监听
        mScreenStatusReceiver = null;//清空对象
        if (mBtInputDeviceService != null) {
            mAdapter.closeProfileProxy(BluetoothProfile.INPUT_DEVICE, mBtInputDeviceService);
        }
        isCancel = true;
        super.onDestroy();
    }
  //然后就可以根据标识位进行相应的操作

    局部广播已经说过了,关于普通广播和有序广播后面有应用到就再研究一下。

你可能感兴趣的:(关于android广播监听亮灭屏的学习)