2010-07-21 6 views
21

Mamy usługę, która nieprzerwanie zbiera dane z czujników w telefonie. Ta usługa powinna działać "na zawsze", np. tak długo, jak chce tego użytkownik, a nie być zabijanym przez system.Usługa Android zabity z "już nie chcesz" - jak go uruchomić ponownie?

W celu wyjaśnienia, usługa ta jest nie przeznaczona do publikacji na rynku dla ogółu społeczeństwa, została napisana dla celów badań naukowych. Tak więc osoby korzystające z aplikacji są w pełni świadome, że ich bateria wysysa pustkę szybciej niż zwykle, nie stanowi to problemu.

W każdym razie, moim problemem jest to, że usługa zostaje zabita po pewnym czasie biegu. Czasami po godzinie, czasem dopiero po 7 lub 10 godzinach.

Wpisy do dziennika, gdy usługa zostanie zabita, wyglądają tak. Po prostu mówi "nie chce już", czasami nawet bez wywoływaniaDestroy(), o ile mogę powiedzieć.

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

czy później (po I ręcznie uruchomić ponownie go):

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} 

Często widzę innych usług ginie z „nie chcą już”, a następnie niezwłocznie wznowiona "Scheduling restarcie rozbił usługa ". Na przykład tutaj z użytkownikiem:

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} 

W dziennikach nie ma zapisu o niskiej ilości pamięci. Testowanie odbywa się na (kilku) Nexusie z wersją 2.2 (Froyo FRF91).

Czy mogę to osiągnąć za pomocą mojej aplikacji? Automatyczne ponowne uruchomienie po zabiciu?

Czy to coś zupełnie innego, co wygląda podobnie w logcat?

Jeśli potrzebujesz więcej informacji, wystarczy poprosić, a ja postaram się dostarczyć go :-)

Odpowiedz

12

Jak uruchomić usługę? Czy próbowałeś już startForeground()? Oczywiście nie jest to bezwzględna gwarancja, ale powinna przynajmniej wydłużyć żywotność.

+0

Dziękuję za odpowiedź. Nie używamy funkcji startForeground(), ale wydaje się to dobrym pomysłem. Zaimplementowałem to i obecnie testuję, aby sprawdzić, czy to jest hels. Może to chwilę potrwać, ponieważ usługa była już w stanie przetrwać kilka godzin bez zabicia. – pableu

+0

Nie jestem pewien, czy istnieje standardowy system Android gwarantujący, że usługa pozostanie w górze, podczas pracy w przestrzeni Java (osobna usługa nadzoru, zaplanowana do okresowego uruchamiania i sprawdzania, czy twoja usługa wciąż się podnosi?). Jeśli nie, może zajść potrzeba przejścia do warstwy NDK i Linux ... –

+0

Dzięki za pomysł startForeground(), usługa działa już od 24 godzin na dwóch oddzielnych telefonach i nie została zabita. Wydaje się, że to możliwe :-) – pableu

6

Spróbuj przesłonić metodę onCreate() swojej usługi. Jeśli usługa zostanie zabita, a następnie uruchomiona ponownie, zostanie wywołana funkcja onCreate(), ale nie onStart(). Możesz więc na przykład dodać wywołanie onStart() z onCreate, aby zachowywał się jak RunKeeperService.

+2

Głosuj. Całkowicie zgadzam się, że rozwiązaniem powinno być wywołanie metody startowej w onCreate. Nie zgadzam się z tym, aby zadzwonić na StartStart - nie należy się do niego bezpośrednio odwoływać. Wystarczy wywołać własną metodę, aby ogólnie uruchomić usługę. –

+0

Nawiasem mówiąc, miałem ten sam problem. Wydaje się, że onStart jest automatycznie wywoływany. logcat pokazuje "Zaplanowanie restartu usługi zawieszonej ..." i po 5 sekundach moja usługa zostanie uruchomiona ponownie. Takie samo zachowanie w froyo i ICS/JB. – black

+1

Dodając powyższe, jeśli twoja funkcja onStartCommand zwróci START_STICKY, wtedy Android wywoła onCreate i onStartCommand. – black

Powiązane problemy