首页 > 解决方案 > 如何可靠地获取 API 级别 >= 26 的屏幕解锁事件?

问题描述

根据官方文档,屏幕锁定/解锁事件的 BroadcastReceiver 只能从 Android O(API 26)开始动态注册(通过在 Activity 中调用 registerReceiver)。在 AndroidManifest.xml 中注册这些事件不再有效,因此当应用程序未运行时(之前已被 Android 杀死或用户强制关闭),应用程序不再能够接收这些事件(ACTION_SCREEN_ON/ACTION_USER_PRESENT)。

帖子中也提到了相同的内容: Android - 检测手机解锁事件,而不是屏幕开启

是否有任何其他可靠且可能的方法来获取屏幕锁定/解锁事件?

通过在应用程序的 AndroidManifest .xml 文件中注册 ACTION_USER_PRESENT 来尝试接收屏幕锁定/解锁事件的隐式广播。但根据文档,除了一些例外情况外的隐式广播将不起作用。您必须在活动类中使用 registerReceiver 进行动态注册。因此,如果应用程序被 Android 操作系统杀死或者可能被用户强制停止,则应用程序不会接收到屏幕锁定/解锁广播。

Activity 类动态广播接收器

 registerReceiver(new PhoneUnlockedReceiver(), 
                  new  IntentFilter("android.intent.action.USER_PRESENT"));

public class PhoneUnlockedReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {

            KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(
                    Context.KEYGUARD_SERVICE);
            if (keyguardManager.isKeyguardSecure()) {

                //phone was unlocked, add handling here          

            }
        }
}

标签: androidandroid-api-levels

解决方案


推荐阅读