Android服务停止启动的线程,直到设备开启

时间:2017-06-18 13:26:50

标签: android multithreading service sleep

在我的应用程序中我有一个后台服务,这个服务启动一个线程来进行定期操作(I / O操作无法在UI线程上运行),线程代码如下所示:

while(!stop){
    do_io_things();
    Thread.sleep(5000);
    print_log();
}

我注意到当设备进入睡眠模式时,线程会睡眠超过5秒,有时它会睡眠一分钟左右,但是当设备处于唤醒状态时(即使我的应用程序处于后台),线程仍可正常工作正如所料。我可以通过观察日志来检查这一点。

AFAIK睡眠方法应该承诺传递给它的时间,任何身体是否知道发生了什么? Android系统会在设备处于睡眠模式时延长休眠时间吗?

任何帮助表示赞赏。

编辑:

我尝试检查多个设备,实际上在较新的设备上,由于时间的变化不是很大,因此在运行Kitkat 4.4的旧设备上,睡眠时间的变化非常大。

1 个答案:

答案 0 :(得分:2)

如果您想了解电池优化,请阅读以下文章:

https://developer.android.com/training/monitoring-device-state/doze-standby.html

在breaf中,Android设备在几秒钟后就睡着了。即使您尝试使用前台任务唤醒,一些供应商也会终止所有进程。

解决方案:

  • 使用AlarmManager来说出设备,"请醒来一段时间"。
mutation addCommentToPost {
  updatePost(
    id: "POST-1",
    comments_push: [{
      body: "Hello!"
    }]
  ) {
    id,
    comments {
      id,
      body
    }
  }
}
  • 开启唤醒模式'为您当前的服务。
am = (AlarmManager) ctx.getSystemService(Activity.ALARM_SERVICE);
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nexttime, pi);

尽管如此,第二种解决方案被所有现代设备杀死。