Android 正確判斷螢幕解鎖事件
阿新 • • 發佈:2019-02-17
之前在專案裡需要監聽螢幕解鎖事件,所以做了點調研,其實很簡單 就是動態監聽螢幕解鎖廣播:”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);