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