打盹模式如何影响后台/前台服务,有/没有部分/全部唤醒锁?
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 分钟,然后再次唤醒以使其工作,仍然是后台服务正在被杀死并且正在运行的线程被暂停。此外,尝试在单独的进程中运行该服务但徒劳无功。如果任何人都可以确认这种行为,因为这种行为没有记录在任何地方? 前台服务是否需要(部分)唤醒锁?我想不通。以上是关于打盹模式如何影响后台/前台服务,有/没有部分/全部唤醒锁?的主要内容,如果未能解决你的问题,请参考以下文章