以打盹模式启动前台服务

Posted

技术标签:

【中文标题】以打盹模式启动前台服务【英文标题】:Starting foreground service in doze mode 【发布时间】:2017-08-06 13:31:13 【问题描述】:

我正在开发一个通过 wifi 连接到特殊设备的应用程序。我需要在短时间内进行状态更新,分别。使我的特殊设备在应用程序中的状态保持最新。 FCM 不是一种选择。我的想法是给用户两个选择:使用前台服务的快速更新或使用定期更新机制的“慢速”更新以节省电池。

我的问题是关于第二个选项。间隔应该在五分钟左右。因此无法使用JobScheduler。但即使使用AlarmManager 似乎也不是一种选择,因为在打瞌睡维护窗口期间我无法获得网络访问权限。

我考虑使用WakefulBroadcastReceiver 来接收AlarmManagerIntent,需要WakeLock 并通过调用startForeground() 将我长期运行的Service 变为前台。但是,只要设备处于打盹模式,startForeground() 方法似乎对Service 没有影响。

我阅读了很多关于打瞌睡和服务的页面,但不知道如何解决我的问题...有人知道吗?

【问题讨论】:

唯一可以真正将设备从打盹中唤醒的是 FCM 消息,除此之外,我认为您真的没有任何选择可以做您想做的事,除非您想告诉所有用户排除您的应用处于打盹模式 【参考方案1】:

您应该使用GcmTaskService。您可以为您的操作安排一些时间间隔,即使在打瞌睡模式下也能正常工作,请通过链接查看更多信息

【讨论】:

谢谢!以前没见过这个。不错的解决方案! 对于其他对此感兴趣的人:Here 是一个很棒的教程 通过使用 GcmTaskService,我可以让我的应用始终连接互联网以确保应用不会丢失通知吗? @kavie 不,gcm 只会在特殊的时间段内执行。为了接收通知,您可以使用push notifications 我正在使用第三方服务器在我的 android wear 应用中接收通知。有没有办法让我的应用在 android 设备进入打盹模式时不会丢失通知? (* 我现在不能使用 FCM)【参考方案2】:

您可以使用 setAlarmClock,但不建议您使用它。 相反,您可以使用 setExactAndAllowWhileIdle 手动重新编程,间隔为 15 分钟。 最佳方式:GCM。

【讨论】:

以上是关于以打盹模式启动前台服务的主要内容,如果未能解决你的问题,请参考以下文章

打盹模式 - 前台服务是不是继续运行?

在打盹模式下在前台服务中重复任务

打盹模式如何影响后台/前台服务,有/没有部分/全部唤醒锁?

打盹模式停止了定位服务

Android 7.0 (Nougat) 打盹模式停止 Web 服务

打盹模式处理