Android9:后台限制应用设置

Android 9: Background Restriction App Setting

我正在开发一个音乐播放器应用,当用户启用 "Background Restriction" 设置(设置 -> 应用 -> [应用名称] -> 电池 -> 背景限制)。

这是我正在做的事情: 我通过调用 Service.startService() 启动我的音乐播放器服务,然后在我的应用程序处于前台时通过 Service.startForeground() 将其设置为前台。

这是我在 "Background Restriction" 开启时看到的: 1) Service.startForeground() 不会发布通知 2) 我的前台服务在我的应用进入后台

的一分钟内被 OS 杀死

这是我在日志中看到的内容: 1) "Service.startForeground() not allowed due to bg restriction" 调用 Service.startForeground() 时 2) "Stopping service due to app idle" 当我的应用程序被 OS

自动终止时

这是我的问题: 我认为前台服务的全部意义在于允许在用户知情的情况下进行后台处理(持续通知); "Background Restriction" 设置真的是为了禁止所有背景 activity 吗?

有趣的发现: 查看 Google 在 GitHub 上的 "Universal Music Player" 示例项目,我注意到他们的示例项目没有像我的应用程序那样被终止。挖掘后我注意到这是因为它们绑定到他们的服务并且从不在 Activity.onPause() 中解除绑定。根据 Google 的文档,绑定服务不受相同的后台限制。这真的能解决我的问题吗?好像有点hacky/fragile.

在此先感谢您的帮助!

这是我的发现:

  • "Background Restriction"(或某些设备上的 "Allow Background Activity")旨在停止所有后台 activity,无论您的服务是否已调用 setForeground()

  • 无法绕过此设置。您不能以编程方式禁用它。您唯一的选择是使用 ActivityManager.isBackgroundRestricted() 以编程方式检查它是否已启用并显示 pop-up 通知您的用户如何禁用此设置

  • Google 在 GitHub 上的 Universal Music Player 示例项目恰好可以工作(截至撰写此答案时)只是因为当main Activity 已暂停。然而,当主要 Activity 被垃圾收集时(通常为 30-45 分钟,具体取决于设备),示例项目的服务被终止。