2015-08-29 45 views
12

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

+0

请检查[这个答案](http://stackoverflow.com/a/35914341/2826147)。 “在后台处理战争”欢迎 –

回答

11

基于一些测试,使用的是Nexus 5安装的Android 6.0的最终的预览(?):

  • 拿着PARTIAL_WAKE_LOCK不足以阻止打盹模式—器件仍将打瞌睡,甚至虽然你有WakeLock和正在尝试做的日常工作(例如,setExactAndAllowWhileIdle()得到控制每分钟)

  • 保持在屏幕上使用android:keepScreenOn(或相当于Java),与在屏幕上,足以阻挡打盹模式

  • 保持使用android:keepScreenOn屏幕(或Java当量),与屏幕关闭(用户按下电源按钮),不足以阻止打盹模式

IOW,视频播放器等应该不会在用户观看视频时受到影响,即使播放器可能没有移动或充电。但是,如果用户按下电源按钮,则会重新产生打盹风险。

我还没有尝试过使用FULL_WAKE_LOCK(我预计行为与android:keepScreenOn相同,但我很不确定)。

+1

哇,这样在背景屏幕关闭运行的应用程序已经不:(感谢您的答复@ greywolf82工作 – greywolf82

+9

。 AndAllowWhileIdle()如果激活锁定被忽略,我怎么能在这种情况下处理数据在处理CPU可以睡:(我失去了什么 – CommonsWare

+0

在这一点上我无法理解的方法: – greywolf82

2

回应上面的评论讨论,这不是对问题的回答。 这是为了澄清一般在打盹模式下的应用程序行为。 在我的测试应用程序中,我试图每2分钟获得一个GPS位置,GPS信号强度在任何时候都足够。

试验条件:

  • 的Nexus 9,机器人M预览版,构建MPA44I
  • “忽略优化” 用2分钟的时间间隔
  • ON
  • setExactAndAllowWhileIdle()的每个操作具有1分钟的超时获取GPS定位并被部分唤醒包围
  • 将日志写入SQLiteOpenHelper.getWritableDatabase()

GPS测试日志打盹模式:

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

现在,我在我的日志看了一遍,我发现一个很奇怪的现象: 与“忽略优化”同样的测试停止时显示基本相同的结果(如它应该),但大部分时间超时没有按预期的那样工作,在空闲时,我得到了〜330000(〜5倍超时时间)或甚至〜580000(〜10倍超时时间)范围内的“有效毫秒数” 。 这个奇怪的行为我无法解释,但它似乎表明,实际上在打盹模式下设置“忽略优化”会产生一些影响。

编辑:上述“奇怪”的行为是刚才documented:只能用“忽略优化”,您可能持有打盹空闲模式下的部分激活锁定。

7

有趣

在安卓6.0谷歌自己的时钟应用程序能够阻断完全打盹模式:

  1. 在设定时间闹铃时钟程序从<60分钟现在
  2. 关闭设备
  3. 在控制台设置$ adb shell dumpsys电池拔下
  4. 在控制台E设置$亚行外壳dumpsys deviceidle一步

状态保持为“走到:ACTIVE”

如果设置的警报从现在时间> 60分钟,它正常工作(设备可以进入空闲状态)。但是一旦报警为< 60分钟,看起来该设备安静地从睡眠瞌睡中醒来,因为状态再次返回'ACTIVE'(而不是'IDLE_MAINTENANCE')。

我真的不知道他们是如何做!

- 编辑 -

这似乎是有默认这种行为setAlarmClock()。 这可能对某些用例有帮助。

+0

查看关于'setAlarmClock()'与打盹模式相关的文档https://developer.android.com/training/monitoring-device-state/doze-standby.html#restrictions,以及关于如何将应用程序列入白名单的页面部分。仍然可以使用部分唤醒锁。 JavaDocs没有提到这一点。 – Jerry101

+3

嗯,是的:“系统在这些警报发生之前不久就打瞌睡了”,如果*很短*就意味着60分钟:-)。打盹模式的文档非常糟糕,许多行为实际上根本没有记录,例如,前景服务进入打瞌睡(http://stackoverflow.com/a/33077301/4301846),像Doze这样的硬件功能在Doze(http://stackoverflow.com/a/32521940/4301846)中不可用,谁知道还有什么。对于相当复杂的行为,这会影响许多用例,这是非常不可思议的。 –

+0

@sec_aw,setAlarmClock()似乎是明确的方法,使我们的行为良好的警报管理器的应用程序。但是,当大多数支持闹钟的应用程序(包括不良行为的应用程序)开始使用setAlarmClock(),将API升级到21级或更高级别时,Google在Android 6.0中的(疯狂)尝试将完全无用。我非常欢迎setAlarmClock()是一种解决方法,但无法理解Google的意图。 – Tomcat

0

据我已经探索了,所有的唤醒锁(除非应用程序与当前的前景保持服务的那些)是更深层次的瞌睡时开始下降。整个瞌睡的目的是让系统在'相关条件'启动时进入睡眠状态。所以,是的,锁并不是他们会太在意的事情。

我看到它的jobscheduler是去调度,后台任务等,在未来的道路的方式。虽然对开发人员有一些控制权,但这是我猜框架大家为电池续航所做的。这更像是“触发器,希望事情或多或少会按时发生”。

来到你的使用情况,JobScheduleronStopJob回调知道什么时候你的任务的执行已停止[出于任何原因 - 说的WiFi被切换]你需要采取适当的措施,如重新安排你的工作到下一个维护窗口。从文档:

一个直接的影响是系统将停止为你启动唤醒锁。