在Kotlin中注册Keyguard状态变化回调时,Intent.ACTION_KEYGUARD_LOCKED不存在怎么办?
锁屏/解锁状态监听解决方案
首先明确:Intent.ACTION_KEYGUARD_LOCKED并非Android系统标准常量,监听锁屏与解锁状态需使用以下系统提供的Intent Action:
Intent.ACTION_SCREEN_OFF:屏幕熄灭(通常触发锁屏)Intent.ACTION_USER_PRESENT:用户成功解锁屏幕Intent.ACTION_SCREEN_ON:屏幕点亮(可选监听)
优化后的LockStateReceiver(Java)
public class LockStateReceiver extends BroadcastReceiver { public static boolean CURRENT_KEYGUARD_STATE = false; static { Context context = VectorApplication.Companion.getAppContext(); KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); CURRENT_KEYGUARD_STATE = keyguardManager.isKeyguardLocked(); } @Override public void onReceive(final Context context, final Intent intent) { String action = intent.getAction(); KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); if (Intent.ACTION_SCREEN_OFF.equals(action) || Intent.ACTION_USER_PRESENT.equals(action)) { CURRENT_KEYGUARD_STATE = keyguardManager.isKeyguardLocked(); System.out.println(">>> 锁屏状态变更:" + CURRENT_KEYGUARD_STATE); } } }
Kotlin中动态注册接收器的正确写法
val mLockStateReceiver = LockStateReceiver() val intentFilter = IntentFilter().apply { addAction(Intent.ACTION_SCREEN_OFF) addAction(Intent.ACTION_USER_PRESENT) addAction(Intent.ACTION_SCREEN_ON) // 可选,用于监听屏幕点亮事件 } // 注册广播(若使用自定义BroadcastManager封装,替换为对应方法即可) VectorApplication.getAppContext().registerReceiver( mLockStateReceiver, intentFilter )
关键注意事项
- Android 8.0(API 26)及以上版本,静态注册上述广播会失效,必须使用动态注册方式。
- 需在组件销毁(如Activity的
onDestroy、Service的onDestroy)时调用unregisterReceiver(mLockStateReceiver),避免内存泄漏。 - 依赖
KeyguardManager.isKeyguardLocked()获取实时锁屏状态,结合广播事件可保证状态监听的准确性。
内容的提问来源于stack exchange,提问作者Amir reza Riahi
相关产品推荐
相关产品推荐

