android - Android 9:后台限制应用设置
问题描述
我正在开发一个音乐播放器应用程序,当用户启用“后台限制”设置(设置 -> 应用程序 -> [应用程序名称] -> 电池 -> 后台限制)时,我注意到 Android 9 设备上的奇怪行为。
这就是我正在做的事情:我通过调用 Service.startService() 来启动我的音乐播放器服务,然后在我的应用程序处于前台时通过 Service.startForeground() 将其设置为前台。
这是打开“后台限制”时看到的内容:1)Service.startForeground()不会发布通知2)我的前台服务在我的应用程序进入后台后一分钟内被操作系统杀死
这是我在日志中看到的内容:1)调用 Service.startForeground() 时,“Service.startForeground() 由于 bg 限制而不允许” 2) 当我的应用程序被操作系统自动终止时,“由于应用程序空闲而停止服务”
这是我的问题:我认为前台服务的全部意义在于允许在用户知道的情况下进行后台处理(持续通知);“后台限制”设置真的是为了禁止所有后台活动吗?
有趣的发现:在 GitHub 上查看 Google 的“通用音乐播放器”示例项目,我注意到他们的示例项目并没有像我的应用程序那样被杀死。挖掘后我注意到这是因为它们绑定到他们的服务并且从未在 Activity.onPause() 中解除绑定。根据谷歌的文档,绑定服务不受相同的背景限制。这真的可以解决我的问题吗?似乎有点老套/脆弱。
在此先感谢您的帮助!
解决方案
这是我发现的:
“后台限制”(或某些设备上的“允许后台活动”)旨在停止所有后台活动,无论您的服务是否已调用 setForeground()
没有办法绕过这个设置。您不能以编程方式禁用它。您唯一的选择是使用 ActivityManager.isBackgroundRestricted() 以编程方式检查它是否已启用,并显示一个弹出窗口,通知您的用户如何禁用此设置
GitHub 上的 Google 通用音乐播放器示例项目恰好可以工作(在撰写此答案时),只是因为在主 Activity 暂停时未释放服务绑定。然而,当主要活动被垃圾收集时(通常 30-45 分钟,具体取决于设备),示例项目的服务被终止。
推荐阅读
- telegram - 如何从 Telethon 中的 MessageService 对象获取 Message 对象
- c# - 使用给定的起点和终点从 html 中分离出特定的数据
- angular - Angular 材料:是否可以使用 ng-template 创建模态(或对话框)?
- javascript - 无法在 React 中正确设置 PropTypes 在几个备选方案之间弹跳
- go - 地图范围循环中的空接口
- c# - MVC 在属性内调用资源文件
- c++ - 如何在 C++ 中从客户端取消服务器端流式调用?
- d3.js - 如何在使用 d3.js 显示数据的鼠标上绘制垂直线
- yaml - ruamel 压缩评论并注入 0x07
- google-chrome-extension - 我怎样才能将“文本”转换为“可下载的 url”?