Tenemos un servicio que recopila continuamente los datos del sensor en el teléfono. Este servicio debe ejecutarse "para siempre", p. siempre que el usuario lo desee y no sea asesinado por el sistema.Servicio Android anulado con "ya no quiero", ¿cómo reiniciarlo?
Para aclarar, este servicio es no destinado a una aplicación que se lanzará en el mercado al público en general, está escrito para un estudio científico. Entonces, las personas que ejecutan la aplicación son plenamente conscientes de que su batería se vaciará por vacío más rápido de lo habitual, esto no es ningún problema.
De todos modos, mi problema es que el servicio se mata después de un tiempo de ejecución. Algunas veces después de una hora, a veces solo después de 7 o 10 horas.
Las entradas de registro cuando el servicio se mata se ven así. Simplemente dice "ya no quiero", a veces incluso sin llamar a Destroy(), por lo que puedo ver.
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()
o posterior (después de reiniciar manualmente):
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}
A menudo veo otros servicios que son matados con "ya no quieren" y se reinicie inmediatamente con "Programación reinicio del estrellado servicio ". Por ejemplo aquí con 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}
Los registros no muestran ningún registro de poca memoria. La prueba se realiza en (varios) Nexus One con 2.2 (Froyo FRF91).
¿Hay alguna manera en que pueda lograr este comportamiento con mi aplicación? Reinicio automático después de ser asesinado?
¿O es esto algo totalmente diferente que simplemente se ve similar en logcat?
Si necesita más información, pregunte y voy a tratar de proporcionarla :-)
Gracias por su respuesta. No usamos startForeground(), pero parece una buena idea. Lo implementé y actualmente estoy probando para ver si funciona. Esto puede llevar un tiempo, ya que el servicio ya pudo sobrevivir varias horas sin que lo mataran. – pableu
No estoy seguro de si existe una forma estándar de Android de garantizar que el servicio se mantenga actualizado, mientras trabajas en el espacio de Java (un servicio de vigilancia independiente, programado para ejecutarse periódicamente y verificar que tu servicio aún esté funcionando). De lo contrario, es posible que deba bajar a la capa de NDK y Linux ... –
Gracias por la idea de startForeground(), el servicio se ha estado ejecutando durante casi 24 horas en dos teléfonos distintos y no fue destruido. Parece que hace el truco :-) – pableu