android - 如何可靠地获取 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
}
}
}
解决方案
推荐阅读
- javascript - 如何将 .roundSlider() 应用于 Array 的所有元素?
- assembly - 如果系统调用号在缓冲区溢出攻击中为 0 怎么办?
- c# - Dapper Resolve Invalid cast 异常
- python - 每次我进行迁移时,我的博客帖子都会消失。Heroku-Django 博客
- powerbi - 在切片器中显示当前用户,然后在其他用户,Power BI
- xamarin - Xamarin 表单中的月份选择器
- angular - Angular 10 - 无法绑定到“formGroup”,因为它不是“form”的已知属性
- mysql - MariaDB 主到主复制自动增量不是顺序的
- ios - 我的应用程序在 ios14 上崩溃 应用程序在闪屏上崩溃?
- python - 在 Pandas 中将多列分组为一列