Android服务重启不工作

标签 android service kill restart

我已经构建了一个服务来向各种 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/

相关文章:

linux - 长时间后如何通过 bash 脚本 SIGINT 多个后台程序?

android - 显示被另一个 ImageView 覆盖的 ImageView 的一部分

java - 将微调器选择保存到共享首选项

android - 从 Google TV 应用程序打开监视器

windows - tcp 错误代码 10060 调用 WCF 服务

java - 当设备进入休眠模式时服务无法正常工作

warnings - libpng 警告 : Ignoring bad adaptive filter type

java - 将物体放置在人上方 30 米处

model-view-controller - 将 MEF 插件导入 MVC Controller

c - 是什么杀死了父进程?