我已经构建了一个服务来向各种 Activity 广播定时器数据。通常它运行正常没有问题,但是当 android 重新启动时它不能按预期工作。
它还有三个广播接收器:
1 - 屏幕关闭事件:为了停止广播计时器数据并在服务结束时在 alarmanager 中设置警报,以便我能够播放结束通知以供用户参加。
2 - 屏幕开启事件:为了继续广播定时器数据。我还取消了任何先前未决的警报。
3 - 警报接收器。这通常在屏幕关闭时触发,如 1 中所述。
我的服务以 startForeground 启动并返回 START_REDELIVER_INTENT。由于启动 Intent 具有初始计时器日期,因此我可以毫无问题地重新创建服务状态。广播警报接收器和 onStartCommand 共享相同的处理 Intent 例程来启动或继续服务。
这一切都很完美。对于较短的计时器(< 30 分钟),我没有发现任何问题。屏幕可以打开,关闭,同时从打开到关闭和从关闭到打开。 Activity 也可以在前面或后面。我玩弄那些所有可能的状态。在所有情况下,我的服务和 Activity 都运行正常。
当某些计时器较长时(> 30 分钟,通常我设置为 35 分钟),我的问题就来了。有时可能是由于内存原因导致 Android kill me 服务。没关系,据我所知,Android 这样做是为了改善用户体验。问题是,当我转到“设置/应用程序/服务”时,我可以看到我的服务处于“重新启动”状态。我怀疑这意味着 Android 还没有启动它,它已经被安排好了。它显示了很长时间的状态(我没有耐心说它是否改变了另外半小时......)
问题是,当处于那种状态时,它会永远长存(我一直在研究它,但服务从未启动过),计时器(在我的 watch 中)达到超时,alarmmanager 启动我的 Intent ,但是因为我的服务还没有开始,广播也没有注册,我不能做超时工作人员(播放通知)。所以用户不知道服务定时器已经结束,这是一个沉重的问题。
它很好奇。由于该服务几乎在 30 分钟后的任何运行中都被杀死,而其他服务没有被杀死。
我的问题是:到底发生了什么?我如何才能正确处理这种情况以检测是否正确触发了警报,或者更重要的是:我如何强制我的服务正确重启?
添加一些帮助数据:
与其他服务相比,我的服务确实占用很少的内存,而且不会运行长时间的操作,它只在屏幕打开时使用 handler.postdelayed("sendUpdatesToUI",250),在屏幕关闭时不使用任何东西,只等待 alarmmanager 发送超时 Intent 。
当时间到了,用户打开 Activity 时,它从服务接收到定时器数据广播 Intent ,当它看到时间到了,然后它停止服务。
我理解并接受用户可以在需要时终止服务,我接受这一点。这里的问题不是用户,而是Android重启服务。
当服务终止时,onDestroy 不会被调用。
使用 2.3.4 版本。
最佳答案
经过大量调查,我找到了解决问题的办法。这都是关于 startForeGround 函数的。我正在使用:
startForeground(0,not);
虽然这看起来不错并且在网络上有很多示例,但正确的方法不是使用 0,而是使用任何其他随机值:
startForeground(2765, 不是),
这解决了问题。
关于Android服务重启不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8587022/