之前在项目里需要监听屏幕解锁事件,所以做了点调研,其实很简单 就是动态监听屏幕解锁广播:”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);
本文介绍了如何在Android中正确监听并判断屏幕解锁事件。通过监听"Intent.ACTION_USER_PRESENT"广播,可以确保在系统设置锁屏的情况下捕获解锁行为。但要注意,当Android版本小于等于19时,只有"Intent.ACTION_SCREEN_ON"广播。在高于19的版本中,需要额外判断,结合isLock状态来确认解锁状态。
280

被折叠的 条评论
为什么被折叠?



