android 亮屏,暗屏,解锁,锁屏广播监听

时间:2021-12-30 14:34:27
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.button_layuout);  

    final IntentFilter filter = new IntentFilter();  
    // 屏幕灭屏广播 
    filter.addAction(Intent.ACTION_SCREEN_OFF);  
    // 屏幕亮屏广播 
    filter.addAction(Intent.ACTION_SCREEN_ON);  
    // 屏幕解锁广播 
    filter.addAction(Intent.ACTION_USER_PRESENT);  
    // 当长按电源键弹出“关机”对话或者锁屏时系统会发出这个广播 
    // example:有时候会用到系统对话框,权限可能很高,会覆盖在锁屏界面或者“关机”对话框之上, 
    // 所以监听这个广播,当收到时就隐藏自己的对话,如点击pad右下角部分弹出的对话框 
    filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);  

    BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() {  
        @Override  
        public void onReceive(final Context context, final Intent intent) {  
            Log.d(TAG, "onReceive");  
            String action = intent.getAction();  

            if (Intent.ACTION_SCREEN_ON.equals(action)) {  
                Log.d(TAG, "screen on");  
            } else if (Intent.ACTION_SCREEN_OFF.equals(action)) {  
                Log.d(TAG, "screen off");  
            } else if (Intent.ACTION_USER_PRESENT.equals(action)) {  
                Log.d(TAG, "screen unlock");  
            } else if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {  
                Log.i(TAG, " receive Intent.ACTION_CLOSE_SYSTEM_DIALOGS");  
            }  
        }  
    };  
    Log.d(TAG, "registerReceiver");  
    registerReceiver(mBatInfoReceiver, filter);  
}  


    1. 亮屏广播的接收

不需要添加权限那些,我在xml 中配置action 都是不生效的,没有接收到广播。

//亮屏监听 
private BroadcastReceiver receiver = new BroadcastReceiver() {  
    @Override  
    public void onReceive(Context context, Intent intent) {  
    if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {  
        Log.e(TAG, "亮屏啦,,");  
    }  
    }  
};  

注意:但是注册广播时候需要代码java 动态注册否则监听不到。

    //注册亮屏广播 
    IntentFilter filter = new IntentFilter();  
    filter.addAction(Intent.ACTION_SCREEN_ON);  
    registerReceiver(receiver, filter);  


    1. 灭屏(锁屏)的广播同上

  • filter.addAction(Intent.ACTION_SCREEN_OFF);
    然后监听
  • (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) 即可

注意:也是需要动态注册广播才能接受到的。

对于这两个action:

android.intent.action.SCREEN_OFF
android.intent.action.SCREEN_ON

在AndroidManifest.xml中注册是不可以的。
这有点不同于其他的action,你只有在Service中通过动态注册去监听这个事件

这个问题我的理解是google故意这么做的,有两点考虑:
1.提高监听screen_on screen_off门槛
这两个事件是android的基本事件,如果呗大多数程序监听,会大大的拖慢整个系统,所以android也应该不鼓励我们在后台监听这两个事件。
2.有让我们在service后台监听
这也是提供了一个解决问题,强调和service共存亡,不会一直在后台无限情运行。
3.解锁广播

    filter.addAction(Intent.ACTION_USER_PRESENT);
    if(Intent.ACTION_USER_PRESENT.equals(intent.getAction()))

解锁或者可以使用xml 配置

<!-- 解锁广播 -->  
     <receiver android:name="com.example.applock.demos.UserpresentReceiver">   
               <intent-filter>   
                   <action android:name="android.intent.action.USER_PRESENT" />   
               </intent-filter>   
     </receiver>  

然后广播监听

public class UserpresentReceiver extends BroadcastReceiver{  
    private String TAG="UserpresentReceiver";  

    @Override  
    public void onReceive(Context context, Intent intent) {  
        String action=intent.getAction();  
        Log.e(TAG, "action="+action);  
        if (Intent.ACTION_USER_PRESENT.equals(intent.getAction())) {  
            Log.e(TAG, "竟然可以解锁");  
        }  
    }  
}