根据Android Marshmallow文档,当系统处于休眠模式时,任何唤醒锁都会被忽略。但是我不清楚唤醒锁是否会阻止休眠模式。
dkqlctbz1#
根据一些测试,使用安装了Android 6.0最终(?)预览版的Nexus 5:
PARTIAL_WAKE_LOCK
WakeLock
setExactAndAllowWhileIdle()
android:keepScreenOn
IOW、视频播放器等设备在用户观看视频时不应受到影响,即使播放器可能没有移动或充电。但是,如果用户按下电源按钮,您将再次面临瞌睡风险。我还没有尝试过使用FULL_WAKE_LOCK(我希望行为与android:keepScreenOn相同,但我还远不能确定)。
FULL_WAKE_LOCK
kkbh8khc2#
"有趣"Google在Android 6.0中的时钟应用可以完全阻止低电耗模式:1.在时钟应用程序中设置一个闹钟,从现在起的时间小于60分钟1.关闭设备1.在控制台中设置$adb shell dumpsys电池拔出1.在控制台中设置$adb shell dumpsys deviceidle步骤状态保持为"步进到:主动'如果您将闹钟设置为从现在开始的时间〉60分钟,它将正常工作(设备可能会进入空闲状态)。但一旦闹钟设置为距离现在的时间〈60分钟,设备似乎会悄悄地从低电耗空闲状态唤醒,因为状态再次返回"活动"(而不是"IDLE_MAINTENCE")。我真不知道他们是怎么做到的!
看起来setAlarmClock()在默认情况下有这种行为,这可能对某些用例有帮助。
setAlarmClock()
7rfyedvj3#
作为对上述评论讨论的回应,这并不是对问题的回答。这是为了澄清应用程序在低电耗模式下的总体行为。在我的测试应用程序中,我尝试每2分钟获取一次GPS定位,GPS信号强度始终充足。检测条件:
低电耗模式的GPS测试日志:现在我又看了看我的日志,我注意到一个非常奇怪的行为:将"忽略优化"设置为OFF的相同测试显示出基本相同的结果(就像它应该的),但大多数时候超时并没有像预期的那样工作,我得到的"活动millis"范围要么~330000(~5倍超时时间)或甚至~580000(~10倍超时时间)而空闲。这种怪异的行为我无法解释,但似乎表明"忽略优化"的设置对打瞌睡模式实际上有一些影响。
w6mmgewl4#
据我所知,所有的唤醒锁(除了当前前台服务的应用程序所持有的唤醒锁)在深度休眠开始时都会被丢弃。休眠的全部意义在于让系统在“相关条件”设置时休眠。所以我猜他们不会太在意是锁。在我看来,JobScheduler是未来处理调度、后台任务等的方式。虽然它从开发人员那里拿走了一些控制权,但我猜这就是框架开发人员对电池寿命的要求。它更像是“触发并希望事情或多或少会按时发生”。回到您的用例,JobScheduler有一个onStopJob回调函数,可以知道作业何时停止执行[无论出于何种原因-比如wifi被切换],您需要采取适当的措施,例如重新安排作业的下一个维护窗口。一个直接的React是系统将停止为你保持唤醒锁。
92dk7w1h5#
我在Android 13(在 Google Pixel 7 Pro 上)中发现,如果用户手动禁用应用的电池优化,setExactAndAllowWhileIdle()实际上可以工作。这是在应用的 * 电池使用 * 设置中完成的,如here所述。我想不出如何在 * 华为P20 Pro* 上的Android 10中做到这一点,但我没有太努力。所以我的建议是先用一些手机做实验,以便更好地了解各种Android版本和手机网络上的工作原理。然后更改应用程序,检查设置,告诉用户是否需要更改,并主动提出打开应用程序的设置。(请记住,你通常不知道手机制造商或网络是如何定制手机的,所以如果说明太详细,可能会与实际不符。)此外,在您的应用中,检查您的函数是否被延迟调用,如果是,请告诉用户与您联系以解决问题。我不认为电池使用设置可以通过编程来更改,我甚至无法打开相应的设置UI(即使添加了我认为必要的权限之后),而只能打开通用设置页面,用户可以从那里导航。因此:
// 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);
5条答案
按热度按时间dkqlctbz1#
根据一些测试,使用安装了Android 6.0最终(?)预览版的Nexus 5:
PARTIAL_WAKE_LOCK
不足以阻止低电耗模式-即使您有WakeLock
并尝试执行常规工作(例如,setExactAndAllowWhileIdle()
以获得每分钟的控制权),设备仍将低电耗android:keepScreenOn
(或Java等效程序)保持屏幕打开,在屏幕打开的情况下,* 足以 * 阻止低电耗模式android:keepScreenOn
(或Java等效程序)保持屏幕打开,关闭屏幕(用户按下电源按钮),不足以阻止低电耗模式IOW、视频播放器等设备在用户观看视频时不应受到影响,即使播放器可能没有移动或充电。但是,如果用户按下电源按钮,您将再次面临瞌睡风险。
我还没有尝试过使用
FULL_WAKE_LOCK
(我希望行为与android:keepScreenOn
相同,但我还远不能确定)。kkbh8khc2#
"有趣"
Google在Android 6.0中的时钟应用可以完全阻止低电耗模式:
1.在时钟应用程序中设置一个闹钟,从现在起的时间小于60分钟
1.关闭设备
1.在控制台中设置$adb shell dumpsys电池拔出
1.在控制台中设置$adb shell dumpsys deviceidle步骤
状态保持为"步进到:主动'
如果您将闹钟设置为从现在开始的时间〉60分钟,它将正常工作(设备可能会进入空闲状态)。但一旦闹钟设置为距离现在的时间〈60分钟,设备似乎会悄悄地从低电耗空闲状态唤醒,因为状态再次返回"活动"(而不是"IDLE_MAINTENCE")。
我真不知道他们是怎么做到的!
看起来
setAlarmClock()
在默认情况下有这种行为,这可能对某些用例有帮助。7rfyedvj3#
作为对上述评论讨论的回应,这并不是对问题的回答。这是为了澄清应用程序在低电耗模式下的总体行为。在我的测试应用程序中,我尝试每2分钟获取一次GPS定位,GPS信号强度始终充足。
检测条件:
低电耗模式的GPS测试日志:
现在我又看了看我的日志,我注意到一个非常奇怪的行为:将"忽略优化"设置为OFF的相同测试显示出基本相同的结果(就像它应该的),但大多数时候超时并没有像预期的那样工作,我得到的"活动millis"范围要么~330000(~5倍超时时间)或甚至~580000(~10倍超时时间)而空闲。这种怪异的行为我无法解释,但似乎表明"忽略优化"的设置对打瞌睡模式实际上有一些影响。
w6mmgewl4#
据我所知,所有的唤醒锁(除了当前前台服务的应用程序所持有的唤醒锁)在深度休眠开始时都会被丢弃。休眠的全部意义在于让系统在“相关条件”设置时休眠。所以我猜他们不会太在意是锁。
在我看来,JobScheduler是未来处理调度、后台任务等的方式。虽然它从开发人员那里拿走了一些控制权,但我猜这就是框架开发人员对电池寿命的要求。它更像是“触发并希望事情或多或少会按时发生”。
回到您的用例,JobScheduler有一个onStopJob回调函数,可以知道作业何时停止执行[无论出于何种原因-比如wifi被切换],您需要采取适当的措施,例如重新安排作业的下一个维护窗口。
一个直接的React是系统将停止为你保持唤醒锁。
92dk7w1h5#
我在Android 13(在 Google Pixel 7 Pro 上)中发现,如果用户手动禁用应用的电池优化,
setExactAndAllowWhileIdle()
实际上可以工作。这是在应用的 * 电池使用 * 设置中完成的,如here所述。我想不出如何在 * 华为P20 Pro* 上的Android 10中做到这一点,但我没有太努力。
所以我的建议是先用一些手机做实验,以便更好地了解各种Android版本和手机网络上的工作原理。
然后更改应用程序,检查设置,告诉用户是否需要更改,并主动提出打开应用程序的设置。(请记住,你通常不知道手机制造商或网络是如何定制手机的,所以如果说明太详细,可能会与实际不符。)
此外,在您的应用中,检查您的函数是否被延迟调用,如果是,请告诉用户与您联系以解决问题。
我不认为电池使用设置可以通过编程来更改,我甚至无法打开相应的设置UI(即使添加了我认为必要的权限之后),而只能打开通用设置页面,用户可以从那里导航。因此: