Jeśli moja aplikacja jest uruchomiona i naciskam przycisk ekranu głównego, aplikacja działa w tle. Teraz, jeśli długie naciśnięcie przycisku home i zabić aplikację, przesuwając go z niedawnym liście aplikacji, żaden z wydarzeń podoba onPause()
, onStop()
czy onDestroy()
pobiera nazywane raczej proces jest zakończony. Jeśli więc chcę, aby moje usługi zatrzymywały się, wyłączały powiadomienia i wyrejestrowywały słuchaczy, jak mogę to zrobić? Przeczytałem sporo artykułów i blogów, ale nie znalazłem żadnych przydatnych informacji i nie znalazłem na ten temat żadnej dokumentacji. Każda pomoc będzie mile widziana. Z góry dziękuję.
104
Odpowiedzi:
Właśnie rozwiązałem podobny problem.
Oto, co możesz zrobić, jeśli chodzi tylko o zatrzymanie usługi, gdy aplikacja zostanie zabita, przesuwając palcem z listy ostatnich aplikacji.
W pliku Manifest zachowaj flagę
stopWithTask
jaktrue
dla usługi. Lubić:Ale skoro mówisz, że chcesz wyrejestrować słuchaczy i zatrzymać powiadomienia itp., Proponuję następujące podejście:
W pliku Manifest zachowaj flagę
stopWithTask
jakfalse
dla usługi. Lubić:Teraz do Twojej
MyService
usługi, zastąp metodęonTaskRemoved
. (ZostaniestopWithTask
uruchomiony tylko wtedy, gdy jest ustawiony nafalse
).Odnieś się do mojego pytania, aby uzyskać więcej informacji, które zawiera również inną część kodu.
Mam nadzieję że to pomoże.
źródło
Znalazłem jeden sposób, aby to zrobić
zrobić jedną taką usługę
}
2) zarejestruj tę usługę w pliku manifest.xml
3) Następnie uruchom tę usługę na swojej aktywności splash
A teraz za każdym razem, gdy wyczyścisz swoją aplikację z androida latest Następnie ta metoda onTaskRemoved () zostanie wykonana.
źródło
Rozwiązałem podobny problem. Jeśli chcesz, aby po przesunięciu z ostatniego zadania i następnym uruchomieniu zachowywało się poprawnie, wykonaj poniższe czynności: -
1) Zapisz identyfikator procesu we wspólnych preferencjach:
SharedPreferencesUtils.getInstance().putInt(SharedPreferencesUtils.APP_PROCESS_ID, android.os.Process.myPid());
2) Gdy aplikacja jest uruchamiana z programu uruchamiającego po usunięciu ostatniego zadania, wykonaj następujące czynności:
źródło
Kiedy naciskasz do domu -
onPause
ionStop
Twoja aktywność jest wywoływana, więc w tej chwili musisz dokonać wszystkich oszczędności i wyczyścić, ponieważ platforma Android nie gwarantuje dalej, żeonDestroy
zostanie wywołana żadna inna metoda cyklu życia, więc proces może zostać zabity bez powiadomienia.źródło
onPause()
ionstop()
trzeba je zabijać tylko wtedy, gdy użytkownik wyjdzie z aplikacji, tj. Wyloguje się.Musisz zapisać swoje dane, gdy ktoś
onPause()
dzwoni. Spójrz na ten diagram cyklu życia: Android DeveloperMożesz zobaczyć, że aplikację można zabić po
onPause()
lubonStop()
.Przetwórz tam swoje dane i odzyskaj je w
onRestart()
\onCreate()
.powodzenia!
źródło
Nie możesz sobie poradzić ze swipe, ponieważ system po prostu usuwa twój proces z pamięci bez wywoływania żadnego oddzwaniania.
Sprawdziłem, że przed wywołaniem przez użytkownika ekranu „ostatnie aplikacje” zawsze będzie wywoływana funkcja onPause (). Musisz więc zapisać wszystkie dane w metodzie onPause bez sprawdzania isFinishing ().
Aby sprawdzić przycisk wstecz, użyj metody onBackPressed.
źródło
ViewModel.onCleared () może być przydatna, jeśli celem jest zwolnienie jakiegoś zasobu (na przykład systemu działającego w innym miejscu w sieci), gdy użytkownik wykonuje niespodziewane wyjście, przesuwając palcem, a nie naciskając przycisk „stop” lub przycisk. [W ten sposób pierwotnie doszedłem do tego pytania].
Aplikacja nie otrzymuje powiadomienia, a Activity.onDestroy () jest wywoływana w przypadku zmian konfiguracji, takich jak zmiany orientacji, więc nie ma odpowiedzi. Ale ViewModel.onCleared jest wywoływana, gdy aplikacja jest usuwana (a także gdy użytkownik wycofuje się z działania). Jeśli zasób, którego chcesz użyć, jest powiązany z więcej niż jednym działaniem na stosie, możesz dodać liczniki odwołań lub inny mechanizm, aby zdecydować, czy ViewModel.onClear powinien zwolnić zasób.
To kolejny z wielu dobrych powodów, dla których warto używać ViewModel.
- Bob
źródło
Naprawdę nie wiem, dlaczego powyższe podejścia nie działają w moim przypadku, nawet jeśli ustawiłem,
android:stopWithTask="false"
żeonTaskRemoved()
nie wywołałem.Innym dobrym podejściem byłoby użycie
AndroidViewModel
. Ten działa nawet w przypadku, gdy użytkownik wychodzi z aplikacji po naciśnięciu przycisku Wstecz.Po prostu połącz
ViewModel
klasę ze swoją,MainActivity
a następnie wykonajonCleared()
wywołanie zwrotne zadania .Przykład:
następnie powiąż go z MainActivity:
~ Voila!
źródło
To działało dla mnie na Androidzie 6,7,8,9.
Wykonaj jedną usługę w ten sposób:
2) Zarejestruj tę usługę w
manifest.xml
:3) Następnie uruchom tę usługę na swojej aktywności splash
źródło
Jak wspomniał Bob Cram w swojej odpowiedzi, odpowiedzią jest metoda onCleared () View Model . Działa w obu przypadkach:
Funkcja onTaskRemoved () usługi będzie działać, gdy użytkownik przesunie aplikację z tła, ale nie będzie działać, gdy aplikacje zostaną wyczyszczone za pomocą przycisku zabicia wszystkiego.
Ale metoda onCleared () viewModel działa w obu przypadkach. Możesz użyć if, aby zatrzymać trwający proces lub wyczyścić dowolne zadanie na serwerze zdalnym.
źródło