基于某些测试,使用已安装最终版(?)的Android 6.0的Nexus 5:
持有PARTIAL_WAKE_LOCK
无法阻止Doze模式,即使您持有WakeLock
正在进行常规工作(例如使用setExactAndAllowWhileIdle()
每分钟获取控制权)。
使用android:keepScreenOn
(或Java等效代码)让屏幕保持亮屏状态足以阻止Doze模式。
使用android:keepScreenOn
(或Java等效代码)让屏幕保持黑屏状态(用户按下电源按钮)无法阻止Doze模式。
换句话说,在用户观看视频时不应影响视频播放器等,尽管播放器可能未移动或充电。但是,如果用户按下电源按钮,则会重新出现Doze风险。
我还没有尝试使用FULL_WAKE_LOCK
(我预计其行为与android:keepScreenOn
相同,但我远非确定)。
有趣
Android 6.0中的Google自带闹钟应用程序能够完全阻止Doze模式:
状态保持为“Stepped to: ACTIVE”
如果您设置的闹钟时间> 60分钟,它会正常工作(设备可能进入空闲状态)。但是一旦闹钟还有不到60分钟的时间,设备似乎会静默地从Doze空闲状态中唤醒,因为状态再次返回为“ACTIVE”(而不是“IDLE_MAINTENANCE”)。
我真的想知道他们是如何做到这一点的!
-编辑 -
它似乎是默认情况下由setAlarmClock()
产生这种行为。这对某些用例可能有所帮助。
setAlarmClock()
和待机模式之间的区别,以及页面下方关于白名单应用如何仍然使用部分唤醒锁的部分。这一点在JavaDocs中没有提到。 - Jerry101setExactAndAllowWhileIdle()
打破Doze模式或应用程序待机状态...那么这一切都没有意义,对开发人员来说是一场不必要的斗争... - Opiatefuchsstatic final int DOZE_WAKE_LOCK = 0x00000040;
只有内部包才能使用此唤醒锁,它需要此权限 *需要{@link android.Manifest.permission#DEVICE_POWER}权限。
.. 这就是闹钟应用程序的工作原理,以及为什么它可以像魅力一样唤醒设备....感到对Android API平台失望 - Arthur Melo1 2015-09-04 - 12:14 GPS ok (device left stationary unplugged)
2 2015-09-04 - 12:16 GPS ok
3 2015-09-04 - 12:18 GPS ok
4 2015-09-04 - 12:20 GPS ok
5 2015-09-04 - 12:22 GPS ok
6 2015-09-04 - 12:24 GPS ok
7 2015-09-04 - 12:26 GPS ok
8 2015-09-04 - 12:28 GPS ok
9 2015-09-04 - 12:30 GPS ok
10 2015-09-04 - 12:32 GPS ok
11 2015-09-04 - 12:34 GPS ok
...
31 2015-09-04 - 13:14 GPS ok
32 2015-09-04 - 13:16 GPS ok
33 2015-09-04 - 13:18 GPS ok
34 2015-09-04 - 13:20 GPS ok
35 2015-09-04 - 13:22 GPS ok
36 2015-09-04 - 13:24 GPS ok
37 2015-09-04 - 13:26 GPS ok (entering Doze mode some time after)
38 2015-09-04 - 13:42 GPS failed, active millis: 60174 (idle)
39 2015-09-04 - 13:57 GPS failed, active millis: 60128 (idle)
40 2015-09-04 - 14:12 GPS failed, active millis: 60122 (idle)
41 2015-09-04 - 14:16 GPS ok (idle maintenance)
42 2015-09-04 - 14:18 GPS ok (idle maintenance)
43 2015-09-04 - 14:20 GPS ok (idle maintenance)
44 2015-09-04 - 14:22 GPS ok (idle maintenance)
45 2015-09-04 - 14:38 GPS failed, active millis: 60143 (idle)
46 2015-09-04 - 14:53 GPS failed, active millis: 60122 (idle)
47 2015-09-04 - 15:08 GPS failed, active millis: 60068 (idle)
48 2015-09-04 - 15:23 GPS failed, active millis: 60138 (idle)
49 2015-09-04 - 15:38 GPS failed, active millis: 60140 (idle)
50 2015-09-04 - 15:53 GPS failed, active millis: 60131 (idle)
51 2015-09-04 - 16:08 GPS failed, active millis: 60185 (idle)
52 2015-09-04 - 16:12 GPS ok (ending Doze mode - power button on)
其中一个直接的结果是,系统将停止为您保持唤醒锁。
我在使用Google Pixel 7 Pro上的Android 13中发现,只要用户手动禁用应用程序的电池优化,setExactAndAllowWhileIdle()
实际上是有效的。这可以在应用程序的电池使用设置中完成,如此处所述。
我无法在Huawei P20 Pro上的Android 10中找到如何做到这一点,但我没有尝试太努力。
因此,我的建议是首先尝试使用多种手机进行实验,以更好地了解各种Android版本和手机网络的工作原理。
然后更改您的应用程序以检查设置,并告知用户是否需要更改,并提供打开应用程序设置的选项。(请记住,通常不知道手机制造商或网络如何自定义手机,因此如果说明过于详细,则可能与现实不符。)
此外,在您的应用程序中,检查您的功能是否被调用晚了,如果是,请告诉用户联系您以进行故障排除。
我认为电池使用设置无法通过编程进行更改。即使在添加了我认为必要的权限后,我甚至无法打开相应的设置界面,只能打开通用设置页面,用户可以从那里导航。所以:
// Check doze setting
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean ignoring = pm.isIgnoringBatteryOptimizations(getPackageName());
// Show the app's setting window
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);