Android 6.0 marshmallow 了解及;测试安卓M+;打盹模式

Android 6.0 marshmallow 了解及;测试安卓M+;打盹模式,android-6.0-marshmallow,android-doze,Android 6.0 Marshmallow,Android Doze,我正在努力使我的Android应用程序成为后Android M世界的好公民,这对应用程序在设备打瞌睡时可以/不能做什么施加了严格的限制。我对所涉及的问题的理解仍然相当零碎,因此我希望在座的人能够填补这一空白 打瞌睡的持续时间 这里是我自己的经验发现 打瞌睡首先在静止、屏幕关闭、不活动的半小时内开始 第一个维护窗口在30分钟内出现 下一次大约一小时后发生 在ca2、4、6h时,后三个时间段的细胞凋亡率明显高于后三个时间段。除此之外,我还没有测试过 这是安卓的正式打盹期,还是仅仅是一个经验观察

我正在努力使我的Android应用程序成为后Android M世界的好公民,这对应用程序在设备打瞌睡时可以/不能做什么施加了严格的限制。我对所涉及的问题的理解仍然相当零碎,因此我希望在座的人能够填补这一空白

打瞌睡的持续时间

这里是我自己的经验发现

  • 打瞌睡首先在静止、屏幕关闭、不活动的半小时内开始
  • 第一个维护窗口在30分钟内出现
  • 下一次大约一小时后发生
  • 在ca2、4、6h时,后三个时间段的细胞凋亡率明显高于后三个时间段。除此之外,我还没有测试过
这是安卓的正式打盹期,还是仅仅是一个经验观察

所有这些都在安卓N设备上实现

在打瞌睡模式下测试应用程序

  • 将设备连接到具有ADB的计算机
  • 将应用程序带到前台
  • 关闭设备屏幕
  • 从命令行问题
    adb shell dumpsys电池拔出
  • 现在循环执行命令'adb shell dumpsys deviceidle step light或deep'
  • 最后发布adb外壳转储系统电池重置
进入/退出打瞌睡

  • 当屏幕关闭且设备未移动时发生

  • 大概这是因为手机里有运动传感器,所以安静地坐在平稳行驶的火车上的手机仍然会打瞌睡

  • 如果我拿起一部打瞌睡的手机,开始拿着它四处走动,而不与它进行交互,它会自动退出打瞌睡吗

  • 假设我的应用程序在主机设备进入doze时不在前台。然后我再次开始使用该设备,但没有访问该应用程序。它是否会自动重新开始“工作”,即

  • 它的广播接收器会起作用吗

  • 它的处理程序将开始工作

  • 它的带有
    setRequiresDeviceIdle(true)
    的计划作业将停止被调用

打盹和作业调度的各种模式

  • 据我所知,有两种打盹模式:轻打和深打。它们都有子模式

  • :激活、空闲、空闲\维护、超越。我不明白各种模式的作用。我已在屏幕打开的情况下从ADB发出了
    步进灯
    ,并看到返回值
    处于活动状态
    。在屏幕关闭的情况下,
    步进灯
    返回
    空闲

  • DEEP:屏幕打开时的Active、IDLE_PENDING、SENSING、LOCATION、IDLE、IDLE_MAINTENANCE返回
    Active
    ,但屏幕关闭时返回
    IDLE_PENDING
    。那么其他的子模式,空闲,感应,到底是什么时候。。。发生了什么

我假设当设备从DOZE进入维护窗口并尝试运行来自各种应用程序的挂起的作业请求时,
IDLE\u MAINTENANCE
就会发生

但是如果是这样的话,为什么当我在应用程序中运行调度作业时检查它们时,
PowerManager.isDeviceIdleMode()
PowerManger.isPowerSaveMode()
总是返回
false

JobInfo.Builder
非常友好地允许您设置标准,如
setMinimumLatency
setoverridedadline
,但据我所知,操作系统会自动运行,并愉快地忽略它们-有时我的作业彼此相隔几秒钟运行,有时相隔两小时

为什么没有API函数来测试Doze及其子模式?我希望能在
PowerManager
中找到它,但我只找到了
isDeviceIdleMode
isPowerSaveMode
,它们在测试时始终返回false

应用程序处于打瞌睡模式

  • 其所有后台服务都将被销毁吗

  • 无法获取正常优先级推送消息

  • 不会对报警作出响应-但这是除
    设置和允许空闲之外的报警吗

  • 不会从任何广播接收器获得通信

  • 将无法通过套接字连接到外部世界-因此推送消息、发布/订阅等将无法工作

  • 将立即销毁Android清单中声明的任何广播接收器。这是我自己的发现——我从Java代码创建的接收器保持不变,尽管它们在打瞌睡时不工作

我自己的应用程序通过设置广播接收器并调用
.FusedLocationApi.requestLocationUpdate
来监视地理位置的变化。此接收器在打盹/唤醒循环中生存。但是,是否有保证我的
LocationUpdates
请求在醒来后仍然得到满足

我遇到了一只相当奇怪的虫子。我发现我在doze中的计划作业有时彼此之间的距离太近,尽管我给了它们900000毫秒(15分钟)的延迟和1000000毫秒的截止时间。我想我可以通过跟踪我这样做的最后一次运行时间来测试作业的最后一次运行来绕过这个问题

private static Boolean shortInstantGap()
{
  Long instantNow = Instant.now().getEpochSecond();
  if (300 > (instantNow - this.lastInstant)) return true;
  //ignore the job opportunity if the last one was
  //less than 300s (5 minutes) ago
  this.lastInstant = instantNow;
  return false;
 }
然后中止作业槽

private static Runnable timeRunner = new Runnable() 
{
 @Override
 public void run() 
 {
  if (shortInstantGap()) return;
  callMyHandlerCode();
 }
};
然而,我发现,当我在屏幕外循环时,如果我的应用程序在屏幕上,该代码会导致操作系统突然终止我的应用程序。为什么会这样


最后,我是否可以使用一个API调用来测试设备是否刚刚从睡梦中返回,这样我就有机会做一些睡后整理工作?

您在这里问了很多问题。我会修剪它。你可以很容易地把它分成两个独立但相互关联的问题。我想回答,但有太多的问题要解决。很多重要的问题,太糟糕了