2010-07-21 14 views
21

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 :-)

Respuesta

12

¿Cómo se inicia el servicio? ¿Has probado startForeground()? Eso no es una garantía absoluta, por supuesto, pero al menos debería alargar la vida útil.

+0

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

+0

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 ... –

+0

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

6

Pruebe anulando el método onCreate() de su servicio. Si el servicio se cancela y luego se reinicia, se llama a onCreate(), pero no a onStart(). Por lo tanto, puede, por ejemplo, agregar una llamada a onStart() desde onCreate para que se comporte como RunKeeperService.

+2

Vote up. Totalmente de acuerdo en que la solución debe ser invocar un método de inicio en onCreate. No estoy de acuerdo con llamar a Start: no se debe invocar directamente. Solo invoque su propio método para iniciar el servicio en general. –

+0

Solo una nota al margen, estaba teniendo este mismo problema. Parece que onStart se llama automáticamente. logcat muestra "Programando el reinicio del servicio bloqueado ..." y después de 5 segundos, mi servicio se reinicia. Mismo comportamiento en froyo e ICS/JB. – black

+1

Añadiendo a lo anterior, si su comando onStartCommand devuelve START_STICKY, Android llamará aCreate y onStartCommand. – black

Cuestiones relacionadas