作为业务需求,我必须始终在我的 android 应用程序中保留我的后台服务 运行

As a business requirement, i have to keep my background service running at all times in my android application

经过将近 3 周的研究,我决定问这个问题。

要求是我的应用程序只有一个后台服务,并且必须一直搜索 BLE 设备。 (当没有 BLE 设备在我暂停和恢复扫描的范围内时,不要惊慌我已经设置了慢速扫描模式)。该应用程序并不适合所有人,因为它的目的是在 BLE 设备进入范围时对其进行一些身份验证。希望这始终确立了服务 运行 的重要性。我不能使用前台服务(业务需求)。

每当 android 终止我的服务时 onDestroy() 就不会被调用。所以我最好的选择是使用一个警报管理器,它每 5 分钟触发一次,并检查服务是否被终止,如果被终止,它会调用 startService()。警报可以正常触发一段时间,但在随机时间(1、2、3 小时)后,甚至警报也会被终止,并且不再触发。

我正在通过 onReceive() 负责在服务被杀死时启动服务的警报发送广播。我没有解决方法,任何人都可以解释或建议为什么警报管理器在某个随机时间后出现故障。我目前正在 nexus 6p、Galaxy s7 edge、三星 A5、华为 P9 上测试我的应用程序。

可以提供任何更多的解释。

Alarm triggers fine for some time but after random times (1, 2 3 hours) even the alarm gets killed and it doesn't trigger anymore.

如果 adb shell dumpsys alarm 没有显示您的闹钟,那么您可能会说 "the alarm gets killed"。这通常不会发生,除非用户在设置中使用强制停止。

但是,很可能警报本身就在那里。但是,设备已进入 Doze mode,因此您的警报将被忽略。您的选择是:

  • 尝试setAndAllowWhileIdle(),它可能不会像您希望的那样频繁发送,或者

  • 让用户将您的应用添加到电池优化白名单,请记住用户可能会选择不这样做,或者

  • 让用户始终保持设备接通电源,记住用户可以选择不这样做

I'm sending a broadcast thrugh the alarm whose onReceive() is responsible for starting the service if it is killed

除非您正在使用 WakeLock(小心),否则设备有可能会在您的服务真正开始之前重新进入睡眠状态。