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

Posted

技术标签:

【中文标题】打盹模式如何影响后台/前台服务,有/没有部分/全部唤醒锁?【英文标题】:How does doze mode affect background/foreground services, with/without partial/full wakelocks? 【发布时间】:2016-10-18 13:28:53 【问题描述】:

这是一个简单的问题,在 G+ (here) 上有大量关于此的帖子,而官方文档 (here) 上缺乏相关信息:

当设备进入“打瞌睡”模式时,应用的服务会发生什么?

它对后台/前台服务(绑定/未绑定、已启动/未启动)有什么作用,有/没有部分/全部唤醒锁?

例如,为了创建一个在设备屏幕关闭时播放音频流的服务,您会怎么做?如果音频流不是来自本地文件,而是来自网络怎么办?

看到 Google 开发者提出了声明:

一直在运行前台服务的应用程序(带有关联的 通知)不受打瞌睡的限制。

-然而之后有很多讨论,声称这并不完全正确,我认为知道特殊的后台操作应用程序应该做什么是相当混乱的。

【问题讨论】:

我试图在我的应用程序中解决这个问题 2 周,但我没有找到解决方案...我有一个无线电流应用程序,但我不知道如何解决这个问题。 . :( @Terranology 我在某处读到 android N 在打盹模式下存在错误,您的服务应在新进程上运行以解决此问题。你试过了吗? 【参考方案1】:

当前正在运行前台服务的进程应该不受 Doze 的影响。绑定/未绑定、已启动/未启动和唤醒锁不影响此白名单过程。

但是,在 Android M 设备上存在an issue,当前台服务与***活动处于同一进程中且未正确打瞌睡时,前台服务未正确列入白名单。

该修复程序在on AOSP 可用,并将包含在 Android N 版本中。OEM 可以将该补丁程序集成到他们生产的任何 Android M 版本中。

【讨论】:

服务不是特别是前台服务(即,它们没有调用 [startForeground](developer.android.com/reference/android/app/…, android.app.Notification)))会收到打瞌睡时适用的所有限制 - 它们未列入白名单。根据Best Practices in Media Playback talk at I/O 2016,在主动播放音频时,音乐播放应用应始终作为前台服务,强烈建议将其置于单独的进程中(因为这是一个好主意和错误) 打盹会影响所有应用,无论他们使用什么 targetSdkVersion @user1026605 - 不,这是设置服务使用的进程的唯一方法。 用示例应用程序测试,我有一个后台粘性服务连续运行(服务有一个无限线程)它可以工作并休眠 1 分钟,然后再次唤醒以使其工作,仍然是后台服务正在被杀死并且正在运行的线程被暂停。此外,尝试在单独的进程中运行该服务但徒劳无功。如果任何人都可以确认这种行为,因为这种行为没有记录在任何地方? 前台服务是否需要(部分)唤醒锁?我想不通。

以上是关于打盹模式如何影响后台/前台服务,有/没有部分/全部唤醒锁?的主要内容,如果未能解决你的问题,请参考以下文章

Android O 在打盹模式下前台服务未接收位置更新

以打盹模式启动前台服务

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

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

如何在 Android 上测试打盹模式?

与设备一起移动时,Android 不会退出打盹模式