1. 程式人生 > >Android 正確判斷螢幕解鎖事件

Android 正確判斷螢幕解鎖事件

之前在專案裡需要監聽螢幕解鎖事件,所以做了點調研,其實很簡單 就是動態監聽螢幕解鎖廣播:”Intent.ACTION_USER_PRESENT”,當手機設定了鎖屏,這個方法是沒問題的。
但是這裡有一個坑,那就是:如果系統沒有設定鎖屏,對於我們來說,此時亮屏相當於解鎖螢幕,當android 版本號 <= 19時,系統只會發出廣播”Intent.ACTION_SCREEN_ON”;而在之後的版本,系統會先後發出廣播:”Intent.ACTION_USER_PRESENT” ,”Intent.ACTION_SCREEN_ON”。總結下情況是這樣的:

android 版本號 螢幕解鎖時機 是否設定鎖屏
<= 19 Intent.ACTION_USER_PRESENT yes
>19 Intent.ACTION_USER_PRESENT yes
<= 19 Intent.ACTION_SCREEN_ON no
>19 Intent.ACTION_USER_PRESENT no

也就是說 ,只要我們能監聽到廣播”Intent.ACTION_USER_PRESENT”,那麼肯定可以確認螢幕已經解鎖了。當監聽到廣播”Intent.ACTION_SCREEN_ON”,>19 的版本可以忽略這個廣播,而 <= 19版本,此時還要判斷下螢幕是否真正解鎖了,判斷方法如下:

KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
boolean isLock = keyguardManager != null && keyguardManager.inKeyguardRestrictedInputMode();

螢幕處於鎖屏狀態時,isLock =為 true,螢幕解鎖後 isLock 為false。最終程式碼如下:

IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_USER_PRESENT);
filter.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(new
BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(TextUtils.isEmpty(action)){ return; } if(action.equals(Intent.ACTION_USER_PRESENT)){ //do somthing return; } if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT){ if(action.equals(Intent.ACTION_SCREEN_ON)){ KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); boolean isLock = keyguardManager != null && keyguardManager.inKeyguardRestrictedInputMode(); if(!isLock){ //do somthing } } } } },filter);