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

作为一项业务需求,我必须在android应用程序中始终保持后台服务的运行,android,alarmmanager,background-service,Android,Alarmmanager,Background Service,经过近3周的研究,我决定问这个问题 要求是我的应用程序只有一个后台服务,并且它必须一直搜索BLE设备。(不要惊慌,我已经设置了一个慢速扫描模式,当没有BLE设备在我暂停并恢复扫描的范围内时)。该应用程序并不适用于所有人,因为它意味着每当有人进入范围时,都要对BLE设备进行一些身份验证。希望这确立了服务始终运行的重要性。我不能使用前台服务(业务需求) 每当安卓终止我的服务时,onDestroy()不会被调用。因此,我最好的办法是使用一个报警管理器,它每5分钟触发一次,检查服务是否被终止,如果服务被

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

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

每当安卓终止我的服务时,
onDestroy()
不会被调用。因此,我最好的办法是使用一个报警管理器,它每5分钟触发一次,检查服务是否被终止,如果服务被终止,它将调用
startService()
。警报在一段时间内触发正常,但在随机时间(1、2、3小时)后,警报甚至被终止,不再触发

我正在通过报警发送广播,如果服务被终止,其
onReceive()
负责启动服务。我没有解决办法了。有人能解释或建议为什么报警管理器在一段随机时间后出现故障。我目前正在nexus 6p、Galaxy s7 edge、三星A5、华为P9上测试我的应用程序

可以提供更多的解释

警报在一段时间内触发正常,但在随机时间(1、2、3小时)后,警报甚至被终止,不再触发

如果
adb shell dumpsys alarm
未显示您的报警,则您可能会说“报警被终止”。除非用户在设置中使用强制停止,否则通常不会发生这种情况

然而,最有可能的是,警报本身就在那里。但是,设备已进入,因此您的警报将被忽略。你的选择是:

  • 请尝试
    setAndAllowHileIDLE()
    ,该文件可能不会像您希望的那样频繁发送,或者

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

  • 让用户始终保持设备的插入状态,记住用户可能选择不这样做

我正在通过报警发送广播,其onReceive()负责在服务被终止时启动服务


除非您(小心地)使用WakeLock(唤醒锁),否则在您的服务真正开始之前,设备可能会再次进入睡眠状态。

谢谢您的回复。我明天会和亚洲开发银行确认警报是否真的存在。如何使用
setAndAllowHileIDLE()
并使警报每5分钟重复一次?关于“WakeLock”,我在我的广播接收机的
onReceive()
中获取它,然后在调用
startService()
后释放它。“这不是应该的吗?”@madking:“如何使用setandallowhileidle()并让闹钟每5分钟重复一次?”——你不能。我想广告上的最短时间是9分钟,甚至可能没有那么频繁。“这不是它应该是什么样子吗?”——这意味着你的
WakeLock
大约需要一微秒的时间
startService()
是异步的;
startService()
返回时服务未启动。我希望您的服务需要一个
WakeLock
来完成它的工作,这就是用户可能对您的应用不满意的原因。另外,我正在使用
RTC_WAKEUP
,并且我在
onReceive()
中发出通知,因此无论服务是否启动或手机处于睡眠模式(安卓6中引入)当警报触发时,通知应显示,因为它会唤醒CPU一小段时间。但是通知会在一段时间后停止发送。9分钟对我来说没问题,但不会
setandAllowHileidle()
triigers只发送一次吗?那么也许我应该释放服务中的锁?我已经在一个广播接收器中的服务中获得了一个wakelock,它在屏幕状态改变时进行广播。问题是,用户希望我一直运行该服务,因为它是一个商业应用程序client@madking:“但是setAndAllowHileIDLE()triigers不是只有一次吗?”--当警报触发时,您的部分工作是安排下一个警报。“那么也许我应该释放服务中的锁?”--是的,在
广播接收器中获取它,但在
服务中释放它。这就是WakefulBroadcastReceiver的工作原理。“问题是用户希望我一直运行这项服务,因为它是一款面向商业客户的应用程序”——当用户意识到你的应用程序使用了多少电池时,用户可能会改变主意。