9

我正在制作一个应用程序,该应用程序将在设备锁定时运行,通过Activity#setShowWhenLocked(true). 我不想阻止设备进入低功耗状态。我知道系统使用 来执行此操作Always-On Display,并且显示器具有相关的电源模式:

/frameworks/base/core/java/android/view/Display.java

286    /**
287     * Display state: The display is dozing in a low power state; it is still
288     * on but is optimized for showing system-provided content while the
289     * device is non-interactive.
290     *
291     * @see #getState
292     * @see android.os.PowerManager#isInteractive
293     */
294    public static final int STATE_DOZE = ViewProtoEnums.DISPLAY_STATE_DOZE; // 3
295
296    /**
297     * Display state: The display is dozing in a suspended low power state; it is still
298     * on but the CPU is not updating it. This may be used in one of two ways: to show
299     * static system-provided content while the device is non-interactive, or to allow
300     * a "Sidekick" compute resource to update the display. For this reason, the
301     * CPU must not control the display in this mode.
302     *
303     * @see #getState
304     * @see android.os.PowerManager#isInteractive
305     */
306    public static final int STATE_DOZE_SUSPEND = ViewProtoEnums.DISPLAY_STATE_DOZE_SUSPEND; // 4

/frameworks/base/core/java/android/os/PowerManagerInternal.java中也有此部分:

51     * Wakefulness: The device is dozing.  It is almost asleep but is allowing a special
52     * low-power "doze" dream to run which keeps the display on but lets the application
53     * processor be suspended.  It can be awoken by a call to wakeUp() which ends the dream.
54     * The device fully goes to sleep if the dream cannot be started or ends on its own.
55     */
56    public static final int WAKEFULNESS_DOZING = 3;

如果可能的话,我想避免使用 root来执行此操作,但如果所有其他方法都失败了,我可以使用这些命令手动控制打瞌睡,但这听起来很混乱,我不想弄乱任何其他应用程序的打瞌睡交互。

此外,我只特别关注 Android Pie (9.0) 及更高版本。

更新:

我也试过获取一个DOZE_WAKE_LOCK,但它需要系统权限DEVICE_POWER。我尝试adb shell pm grant了对我的应用程序的权限,但它不是可更改的权限类型。

4

2 回答 2

1

您可以通过屏幕保护程序DreamService执行此操作。你不能通过活动来做到这一点。Activity 阻止设备进入睡眠模式。

Dreams 是在充电设备空闲或停靠在桌面底座时启动的交互式屏幕保护程序。Dreams 为应用程序提供了另一种表达自我的方式,专为展览/靠背体验而定制。

于 2018-10-31T09:37:23.820 回答
0

你想要的是 android wear 中的环境模式,它让一个活动可以在设备处于睡眠状态时显示一个可绘制的(通常是一些带有黑色背景的白线)。据我所知,手机设备的代码没有此功能,因为您的活动必须扩展一个名为 WearableActivity 的类,并由一个名为 Ambient 的系统应用程序管理。您找到的唤醒锁DOZE_WAKE_LOCK用于此 Ambient 应用程序。

于 2018-11-29T15:19:44.850 回答