我正在开发一个音乐播放器应用程序,当用户启用“背景限制”设置(设置 -> 应用程序 -> [应用程序名称] -> 电池 -> 背景)时,我注意到 Android 9 设备上的奇怪行为限制)。
这是我正在做的: 我通过调用 Service.startService() 启动我的音乐播放器服务,然后在我的应用程序处于前台时通过 Service.startForeground() 将其设置为前台。
这是我在“背景限制”打开时看到的内容: 1) Service.startForeground() 不会发布通知 2) 我的前台服务在我的应用程序进入后台后的一分钟内被操作系统杀死
这是我在日志中看到的内容: 1) 调用 Service.startForeground() 时出现“Service.startForeground() not allowed due to bg restriction” 2) 当我的应用程序被操作系统自动终止时,“由于应用程序空闲而停止服务”
这是我的问题: 我认为前台服务的全部意义在于允许在用户知情的情况下进行后台处理(持续通知); “后台限制”设置真的是为了禁止所有后台 Activity 吗?
有趣的发现: 查看 GitHub 上 Google 的“Universal Music Player”示例项目,我注意到他们的示例项目并没有像我的应用那样被终止。挖掘后我注意到这是因为它们绑定(bind)到他们的服务并且从不在 Activity.onPause() 中取消绑定(bind)。根据谷歌的文档,绑定(bind)服务不受同样的后台限制。这真的能解决我的问题吗?看起来有点老套/脆弱。
在此先感谢您的帮助!
最佳答案
这是我发现的:
“后台限制”(或某些设备上的“允许后台 Activity ”)旨在停止所有后台 Activity ,无论您的服务是否已调用 setForeground()
无法绕过此设置。您不能以编程方式禁用它。您唯一的选择是使用 ActivityManager.isBackgroundRestricted() 以编程方式检查它是否已启用,并显示一个弹出窗口,通知您的用户如何禁用此设置
Google 在 GitHub 上的 Universal Music Player 示例项目恰好可以正常工作(截至撰写本回答时)只是因为当主 Activity 暂停时未释放服务绑定(bind)。然而,当主要 Activity 被垃圾回收时(通常为 30-45 分钟,具体取决于设备),示例项目的服务被终止。
关于安卓 9 : Background Restriction App Setting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55679868/