Android服务因"不再需要"而死亡 - 如何重启?

pab*_*leu 23 service android

我们有一项服务,可以持续收集手机上的传感器数据.该服务应该"永久"运行,例如只要用户想要,而不是被系统杀死.

为了澄清,该服务不适用于在市场上向公众发布的应用程序,它是为科学研究而编写的.所以运行该应用程序的人都充分意识到他们的电池将比平时更快地吸空,这是没问题的.

无论如何,我的问题是服务在运行一段时间后被杀死了.有时一小时后,有时仅在7小时后10小时.

服务被杀死时的Log-Entries看起来像这样.它只是说" 不再需要 ",有时甚至没有调用onDestroy(),据我所知.

07-20 17:07:11.593 I/ActivityManager(   85): No longer want my.project.datalogging (pid 23918): hidden #16
07-20 17:07:11.593 I/WindowManager(   85): WIN DEATH: Window{44c61570 my.project.datalogging/my.project.datalogging.DataLoggingApp paused=false}
07-20 17:07:11.603 I/BackgroundService(23925): onDestroy()
Run Code Online (Sandbox Code Playgroud)

或者稍后(在我手动重启之后):

07-20 19:00:49.677 I/ActivityManager(   85): No longer want my.project.datalogging:BackgroundService (pid 24421): hidden #17
07-20 19:00:49.677 I/ActivityManager(   85): No longer want my.project.datalogging (pid 24415): hidden #18
07-20 19:00:49.807    85 10707 I WindowManager: WIN DEATH: Window{44f1ea58 my.project.datalogging/my.project.datalogging.DataLoggingApp paused=false}
Run Code Online (Sandbox Code Playgroud)

我经常看到其他服务被" 不再需要 " 杀死,然后立即重新启动" 调度重启崩溃服务 ".例如,这里有runkeeper:

07-20 17:30:45.503 I/ActivityManager(   85): No longer want com.fitnesskeeper.runkeeper (pid 24090): hidden #16
07-20 17:30:45.603 W/ActivityManager(   85): Scheduling restart of crashed service com.fitnesskeeper.runkeeper/.services.RunKeeperService in 5000ms
07-20 17:33:52.989 I/ActivityManager(   85): Start proc com.fitnesskeeper.runkeeper for service com.fitnesskeeper.runkeeper/.services.RunKeeperService: pid=24292 uid=10099 gids={3003, 1015}
Run Code Online (Sandbox Code Playgroud)

日志显示没有低内存记录.测试在(几个)Nexus One 2.2(Froyo FRF91)上进行.

有什么办法可以用我的应用程序实现这种行为吗?被杀后自动重启?

或者这个完全不同的东西,只是在logcat中看起来相似?

如果您需要更多信息,请询问,我会尽力提供:-)

Pon*_*gge 14

你是如何开始服务的?你试过startForeground()吗?当然,这不是绝对的保证,但至少应该延长寿命.


小智 6

尝试覆盖服务的onCreate()方法.如果服务被终止然后重新启动,则调用onCreate(),但不调用onStart().例如,您可以从onCreate添加对onStart()的调用,使其行为类似于RunKeeperService.

  • 投票.完全同意解决方案应该是在onCreate中调用start方法.我不同意调用onStart - 它不应该直接调用.只需调用您自己的方法来启动服务. (2认同)