Abbiamo un servizio che raccoglie continuamente i dati del sensore sul telefono. Questo servizio dovrebbe essere eseguito "per sempre", ad es. fino a quando l'utente vuole, e non essere ucciso dal sistema.Servizio Android ucciso con "non più desiderato" - come riavviarlo?
Per chiarimenti, questo servizio è non destinato a un'app da immettere sul mercato al pubblico, è stato scritto per uno studio scientifico. Quindi le persone che eseguono l'app sono pienamente consapevoli del fatto che la batteria si svuoterà più velocemente del solito, non è un problema.
In ogni caso, il mio problema è che il servizio viene ucciso dopo un po 'di corsa. A volte dopo un'ora, a volte solo dopo 7 o 10 ore.
Le voci di registro quando il servizio viene ucciso assomigliano a questo. Dice solo "non vuoi più", a volte senza nemmeno chiamare suDestroy(), per quanto posso dire.
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 successivo (dopo ho riavviato 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}
vedo spesso altri servizi di essere uccisi con "vogliono più" e poi subito riavviato con "Scheduling riavvio del caduto servizio ". Per esempio qui 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}
I registri non mostrano alcuna registrazione di memoria insufficiente. Il test viene eseguito su (diversi) Nexus One con 2.2 (Froyo FRF91).
C'è un modo per ottenere questo comportamento con la mia app? Riavvio automatico dopo essere stato ucciso?
O questo qualcosa di completamente diverso che sembra simile in logcat?
Se avete bisogno di ulteriori informazioni, basta chiedere e cercherò di fornire :-)
Grazie per la risposta. Non usiamo startForeground(), ma sembra una buona idea. L'ho implementato e attualmente sto testando per vedere se funziona. Questo può richiedere un po 'di tempo, dal momento che il servizio era già in grado di sopravvivere diverse ore senza essere ucciso. – pableu
Non sono sicuro se esiste un modo standard di Android per garantire che il servizio rimanga attivo, mentre si lavora nello spazio Java (un servizio watchdog separato, pianificato per essere eseguito periodicamente e controllare che il servizio sia ancora attivo?). In caso contrario, potrebbe essere necessario andare nel livello NDK e Linux ... –
Grazie per l'idea di startForeground(), il servizio è stato eseguito per quasi 24 ore su due telefoni separati e non è stato ucciso. Sembra fare il trucco :-) – pableu