Android Oreo 中的上下文注册 BroadcastReceiver - 当应用程序不在前台时

Context Registered BroadcastReceiver in Android Oreo - when app not in foreground

Oreo 之前,我有一个后台服务,我会启动它,它会在上下文中注册一些 BroadcastReceivers。

当其中一个接收者收到一个意图时,它会在服务中处理它。

示例: 当它收到 android.bluetooth.device.action.ACL_DISCONNECTED 时,打开 WiFi。

问题是,由于新的后台限制,我的服务将在我的应用程序关闭后不久关闭。

我可以用前台服务解决问题,但用户不需要一直看到通知。

Migration Guide 建议使用作业调度程序轮询会触发隐式意图的状态。这似乎比在后台服务中注册接收器要浪费得多。在其中一个接收器被触发之前,该服务实际上并没有做任何事情。

侦听蓝牙断开连接并立即做出反应的新正确方法是什么? (没有您的应用程序在前台)

经过一些研究,我发现有一个简短的 white-list 隐式意图可能仍然在清单中注册。因此,虽然服务不会继续 运行,但我可以重构并使用带有清单注册 BroadcastReceiver 的隐式意图过滤器。

这并不能解决我的所有问题,因为我的一些事件不在 white-list 上,但至少我可以保持我的大部分功能。

我仍然缺少的操作是 PHONE_STATE 和 HEADSET_PLUG。如果我找到解决方案,我会更新这个 post。