showWhenLocked 和 showOnLockScreen的区别
showWhenLocked 和 showOnLockScreen 是在 Android 开发中用于控制Activity在锁屏状态下显示的两个标志,让Activity在设备处于锁屏状态时依旧能够显示在屏幕最前端,用户无需解锁即可看到并操作该界面。典型用途:
·来电界面、闹钟响铃、计时器结束提醒
·运动/导航实时状态、门禁/乘车二维码
·紧急呼叫、医疗急救等关键场景
这两个标志的作用相似但有区别。
1、showWhenLocked
作用:允许 Activity 在设备锁屏时显示在最前面,即覆盖锁屏界面。API 级别:从 Android 8.1(API 27)开始支持。
/**
* Specifies whether an {@link Activity} should be shown on top of the lock screen whenever
* the lockscreen is up and the activity is resumed. Normally an activity will be transitioned
* to the stopped state if it is started while the lockscreen is up, but with this flag set the
* activity will remain in the resumed state visible on-top of the lock screen. This value can
* be set as a manifest attribute using {@link android.R.attr#showWhenLocked}.
*
* @param showWhenLocked {@code true} to show the {@link Activity} on top of the lock screen;
* {@code false} otherwise.
* @see #setTurnScreenOn(boolean)
* @see android.R.attr#turnScreenOn
* @see android.R.attr#showWhenLocked
*/
public void setShowWhenLocked(boolean showWhenLocked) {
ActivityClient.getInstance().setShowWhenLocked(mToken, showWhenLocked);
} 使用方式有两种,可以通过代码调用:
setShowWhenLocked(true); // 允许在锁屏时显示
或者直接在manifest清单文件声明, 在 Activity 的标签中添加:
<activity
android:name=".MainActivity"
android:showWhenLocked="true">
2、showOnLockScreen*
与 showWhenLocked 类似,但主要用于更老的 API 版本,从 Android 4.2(API 17)开始支持。官方在 API 26(Android 8.0)起将其标记为 deprecated,文档推荐改用 android:showForAllUsers 并在运行时调用 setShowWhenLocked(true)。
仅能通过在清单文件中声明使用:
<activity
android:name=".MainActivity"
android:showOnLockScreen="true">
在新版 Android 中,showOnLockScreen的行为和 showWhenLocked 基本一致。,但在 Android 8.1 及以后推荐使用 showWhenLocked。如果同时设置了 showWhenLocked="true" 和 showOnLockScreen="true",系统会优先使用 showWhenLocked(因为它是新版的替代方案)。
另外值得注意的是需要配合 FLAG_TURN_SCREEN_ON(点亮屏幕)和 FLAG_DISMISS_KEYGUARD(解锁设备)等标志才能完整实现“绕过锁屏”的功能,
window.addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
)
参考Android中屏幕常亮的方法一文。
精彩的人生需要浪漫、无畏和勇气。