android Wakelock和打盹模式

txu3uszq  于 2023-01-07  发布在  Android
关注(0)|答案(5)|浏览(154)

根据Android Marshmallow文档,当系统处于休眠模式时,任何唤醒锁都会被忽略。但是我不清楚唤醒锁是否会阻止休眠模式。

dkqlctbz

dkqlctbz1#

根据一些测试,使用安装了Android 6.0最终(?)预览版的Nexus 5:

  • 按住PARTIAL_WAKE_LOCK不足以阻止低电耗模式-即使您有WakeLock并尝试执行常规工作(例如,setExactAndAllowWhileIdle()以获得每分钟的控制权),设备仍将低电耗
  • 使用android:keepScreenOn(或Java等效程序)保持屏幕打开,在屏幕打开的情况下,* 足以 * 阻止低电耗模式
  • 使用android:keepScreenOn(或Java等效程序)保持屏幕打开,关闭屏幕(用户按下电源按钮),不足以阻止低电耗模式

IOW、视频播放器等设备在用户观看视频时不应受到影响,即使播放器可能没有移动或充电。但是,如果用户按下电源按钮,您将再次面临瞌睡风险。
我还没有尝试过使用FULL_WAKE_LOCK(我希望行为与android:keepScreenOn相同,但我还远不能确定)。

kkbh8khc

kkbh8khc2#

"有趣"
Google在Android 6.0中的时钟应用可以完全阻止低电耗模式:
1.在时钟应用程序中设置一个闹钟,从现在起的时间小于60分钟
1.关闭设备
1.在控制台中设置$adb shell dumpsys电池拔出
1.在控制台中设置$adb shell dumpsys deviceidle步骤
状态保持为"步进到:主动'
如果您将闹钟设置为从现在开始的时间〉60分钟,它将正常工作(设备可能会进入空闲状态)。但一旦闹钟设置为距离现在的时间〈60分钟,设备似乎会悄悄地从低电耗空闲状态唤醒,因为状态再次返回"活动"(而不是"IDLE_MAINTENCE")。
我真不知道他们是怎么做到的!

  • -编辑-*

看起来setAlarmClock()在默认情况下有这种行为,这可能对某些用例有帮助。

7rfyedvj

7rfyedvj3#

作为对上述评论讨论的回应,这并不是对问题的回答。这是为了澄清应用程序在低电耗模式下的总体行为。在我的测试应用程序中,我尝试每2分钟获取一次GPS定位,GPS信号强度始终充足。
检测条件:

  • Nexus 9,Android M预览版,内部版本MPA44I
  • "忽略优化"打开
  • setExactAndAllowWhileIdle(),间隔为2分钟
  • 每个操作都有1分钟的超时时间来获取GPS定位,并且被部分唤醒锁包围
  • 日志已写入SQLiteOpenHelper. getWritableDatabase()

低电耗模式的GPS测试日志:
现在我又看了看我的日志,我注意到一个非常奇怪的行为:将"忽略优化"设置为OFF的相同测试显示出基本相同的结果(就像它应该的),但大多数时候超时并没有像预期的那样工作,我得到的"活动millis"范围要么~330000(~5倍超时时间)或甚至~580000(~10倍超时时间)而空闲。这种怪异的行为我无法解释,但似乎表明"忽略优化"的设置对打瞌睡模式实际上有一些影响。

    • 编辑:**上面描述的"奇怪"行为只是现在的documented:只有当"忽略优化"为ON时,您才可以在低电耗空闲模式下保持部分唤醒锁。
w6mmgewl

w6mmgewl4#

据我所知,所有的唤醒锁(除了当前前台服务的应用程序所持有的唤醒锁)在深度休眠开始时都会被丢弃。休眠的全部意义在于让系统在“相关条件”设置时休眠。所以我猜他们不会太在意是锁。
在我看来,JobScheduler是未来处理调度、后台任务等的方式。虽然它从开发人员那里拿走了一些控制权,但我猜这就是框架开发人员对电池寿命的要求。它更像是“触发并希望事情或多或少会按时发生”。
回到您的用例,JobScheduler有一个onStopJob回调函数,可以知道作业何时停止执行[无论出于何种原因-比如wifi被切换],您需要采取适当的措施,例如重新安排作业的下一个维护窗口。
一个直接的React是系统将停止为你保持唤醒锁。

92dk7w1h

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);

相关问题