Nie rozumiem znaczenia stanu onStart()
przejściowego. onResume()
Metoda nazywana jest zawsze po onStart()
. Dlaczego nie może być onResume()
wywołane po, onRestart()
a onCreate()
metody po prostu wykluczają onStart()
? Jaki jest jej cel?
Dlaczego nie możemy bez tego żyć onStart()
. Nadal uważam to za zbędne (prawdopodobnie dlatego, że nie rozumiem do końca jego znaczenia).
Odpowiedzi:
OK, ponieważ moja pierwsza odpowiedź była dość długa, nie będę jej dalej rozciągać, więc spróbujmy tego ...
UWAGA: celowo pominąłem wezwania do takich rzeczy, jak
super.onCreate(...)
itp. To jest pseudokod, więc daj mi tutaj trochę artystycznej licencji. ;)Metody
DriveToWorkActivity
naśladowania ...OK, więc to kolejny długi (przepraszam ludzie). Ale oto moje wyjaśnienie ...
onResume()
jest wtedy, gdy zaczynam jechać ionPause()
chwilowo zatrzymuję się. Więc jadę, a potem docieram do czerwonego światła, więc zatrzymuję się ... światło zmienia się na zielone i wznawiam. Kolejne czerwone światło i zatrzymuję się, a potem zielone, więc wznawiam.onPause() -> onResume() -> onPause() -> onResume()
Pętla jest ciasno jeden i pojawia się wiele razy przez moją podróż.Pętla od zatrzymania z powrotem przez restart (przygotowanie do kontynuowania mojej podróży) do ponownego uruchomienia jest prawdopodobnie mniej powszechna. W jednym przypadku zauważam Sklep Spożywczy i
GroceryStoreActivity
zaczyna się (zmuszając mnieDriveToWorkActivity
do rzeczyonStop()
). Kiedy wracam ze sklepu, przechodzę przez niegoonRestart()
ionStart()
wznawiam swoją podróż.Mógłbym umieścić kod, który jest w
onStart()
obuonCreate()
ionRestart()
nie zawracać sobie głowy nadpisywaniemonStart()
w ogóle, ale im więcej trzeba zrobić międzyonCreate() -> onResume()
ionRestart() -> onResume()
, tym więcej rzeczy powielam.Tak więc, aby ponownie zareagować ...
Jeśli tego nie zrobisz,
onStart()
tak się stanie. ChociażonStart()
metodaActivity
will zostanie wywołana niejawnie, efekt w kodzie jest efektywnyonCreate() -> onResume()
lubonRestart() -> onResume()
.źródło
onCreate()
i, jak ionRestart()
mają dużo wspólnego kodu, prawda?Activity
cyklu życia. Etap tworzeniaonCreate(...)
może zdziałać wiele, jeśli chodzi o tworzenie instancji elementów członkowskich (elementów interfejsu użytkownika itp.), Ale „restart” nie powinien tego robić. W rzeczywistości wiele zActivities
nich nie musi tak naprawdę implementować więcej niżonCreate(...)
,onResume()
aonPause()
inne metody są dostępne w przypadkach, w których może być konieczne wykonanie innych czynności, a kluczem jest zrozumienie, gdzie umieścić kod.Activity
metod cyklu życia - robi to system operacyjny Android i robi to bardzo wydajnie (zakładając, że programista aplikacji wie, co robi, a także skutecznie koduje). Jeśli dużo pracujesz nad Androidem, zdasz sobie sprawę, dlaczego wszystko działa tak, jak działa - nie jest w 100% idealne, ale całkiem niezłe.onStart
ionResume
polega na „widoczności” i „interakcji użytkownika”. Ta metafora prowadzenia samochodu jest myląca i niezbyt pomocna.Krótka odpowiedź:
Nie możemy żyć bez onStart, ponieważ jest to stan, w którym aktywność staje się „widoczna” dla użytkownika, ale użytkownik nie może z nią „wchodzić w interakcję”, ale może być spowodowane tym, że nakłada się na inne małe okno dialogowe. Ta zdolność do interakcji z użytkownikiem jest tą, która odróżnia onStart i onResume. Pomyśl o tym jak o osobie za szklanymi drzwiami. Widzisz osobę, ale nie możesz z nią wchodzić w interakcje (rozmawiać / słuchać / podawać ręce). OnResume jest jak otwieracz do drzwi, po którym możesz rozpocząć interakcję.
Dodatkowo onRestart () jest najmniej zrozumiałym. Możemy zadać pytanie, dlaczego nie przejść bezpośrednio do onStart () lub onResume () po onStop () zamiast onRestart (). Łatwiej jest to zrozumieć, jeśli zauważymy, że onRestart () jest częściowo równoważne onCreate (), jeśli pominięto część kreacyjną. Zasadniczo oba stany prowadzą do onStart () (czyli działanie staje się widoczne). Zatem oba stany muszą „przygotować” materiał do wyświetlenia. OnCreate ma dodatkową odpowiedzialność za „tworzenie” rzeczy do wyświetlenia
Więc ich struktury kodu mogą pasować do czegoś takiego:
Całe zamieszanie jest spowodowane tym, że Google wybrał nieintuicyjne nazwy zamiast czegoś takiego:
Diagram aktywności można interpretować jako:
źródło
onStart()
wywoływana, gdy aktywność staje się widoczna dla użytkownika.onResume()
wywoływane, gdy działanie rozpocznie interakcję z użytkownikiem. W takich przypadkach możesz chcieć zrobić różne rzeczy.Zobacz ten link w celach informacyjnych.
źródło
onResume()
jest nazywany:onStart()
Activity
pojawia się na pierwszym planie.Z http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle :
źródło
Książka „Hello, Android, Przedstawiamy Google Mobile Development Platform” zawiera ładne wyjaśnienie cyklu życia aplikacji na Androida. Na szczęście mają oni w sieci ten rozdział jako fragment. Zobacz grafikę na stronie 39 w http://media.pragprog.com/titles/eband3/concepts.pdf
Nawiasem mówiąc, ta książka jest godna polecenia dla początkujących androidów!
źródło
Szczególnie zadziornym przykładem jest sytuacja, w której zdecydujesz się wyświetlić zarządzany dialog z działania przy użyciu
showDialog()
. Jeśli użytkownik obróci ekran, gdy okno dialogowe jest nadal otwarte (nazywamy to „zmianą konfiguracji”), wówczas główne działanie przejdzie przez wszystkie wywołania kończącego cyklu życia aż do momentuonDestroy()
, zostanie odtworzone i powróci do kolejnych cykli życia. Jednak możesz się nie spodziewać, żeonCreateDialog()
ionPrepareDialog()
(metody, które są wywoływane, gdy to robisz,showDialog()
a teraz ponownie automatycznie, w celu ponownego utworzenia okna dialogowego - automatycznie, ponieważ jest to zarządzane okno dialogowe) są wywoływane międzyonStart()
ionResume()
. Chodzi o to, że okno dialogowe nie obejmuje całego ekranu i dlatego pozostawia widoczną część głównej czynności. To szczegół, ale to ma znaczenie!źródło
onStart()
onStart()
aby monitorować zmiany, które mają wpływ na Twój interfejs użytkownika, musisz wyrejestrować go w onStop ()onResume()
onStart()
normalnie przekazuje pracę do wątku w tle, którego zwracane wartości to:START_STICKY, aby automatycznie zrestartować po zabiciu, aby był aktywny.
START_REDELIVER_INTENT
dla automatycznego restartu i ponów próbę, jeśli usługa została zabita przed stopSelf ().onResume()
jest wywoływana przez system operacyjny po przejściu urządzenia w stan uśpienia lub po alercie lub innej czynności potomnej na częściowym ekranie pozostawia widoczną część poprzedniego okna, więc metoda wymaga ponownej inicjalizacji pól (w strukturze try z wieloma wyjątkami ). Taka sytuacja nie powodujeonStop()
przywołania, gdy dziecko się zamyka.onResume()
nazywa się bezonStart()
gdy działanie jest wznawiane w tleAby uzyskać więcej informacji, odwiedź stronę Android_activity_lifecycle_gotcha i cykl życia działania
źródło
Miejmy nadzieję, że proste wyjaśnienie: -
onStart () -> wywoływana, gdy aktywność staje się widoczna, ale może nie znajdować się na pierwszym planie (np. AlertFragment jest na górze lub w innym możliwym przypadku użycia).
onResume () -> wywoływana, gdy działanie jest na pierwszym planie lub użytkownik może wchodzić w interakcję z działaniem.
źródło
onStart()
oznacza, żeActivity
wszedł w stan widoczny i układ został utworzony, ale nie może wchodzić w interakcje z tym układem aktywności.Resume()
oznacza, że teraz możesz wykonywać interakcje z układem zajęć.źródło
Zauważ, że między wywołaniami onStart () i onResume () zachodzą pewne rzeczy. Mianowicie onNewIntent (), o czym boleśnie się przekonałem.
Jeśli używasz flagi SINGLE_TOP i wysyłasz pewne dane do swojej aktywności, używając dodatków intencyjnych, będziesz mógł uzyskać do nich dostęp tylko w onNewIntent (), który jest wywoływany po onStart () i przed onResume (). Tak więc zazwyczaj bierzesz nowe (być może tylko zmodyfikowane) dane z dodatków i ustawiasz je dla niektórych członków klasy lub używasz setIntent (), aby ustawić nową intencję jako pierwotną intencję działania i przetwarzać dane w onResume ().
źródło
Odniesienie do http://developer.android.com/training/basics/activity-lifecycle/starting.html
onResume()
Wywoływane tuż przed rozpoczęciem interakcji z użytkownikiem. W tym momencie działanie znajduje się na szczycie stosu działań, do którego trafiają dane wejściowe użytkownika. Zawsze następujeonPause()
.onPause()
Wywoływane, gdy system ma wznowić inną czynność. Ta metoda jest zwykle używana do zatwierdzania niezapisanych zmian w trwałych danych, zatrzymywania animacji i innych rzeczy, które mogą zużywać procesor i tak dalej. Powinien zrobić wszystko, co robi, bardzo szybko, ponieważ następna czynność nie zostanie wznowiona, dopóki nie powróci. NastępujeonResume()
wtedy, gdy czynność powraca na pierwszy plan lubonStop()
staje się niewidoczna dla użytkownika.źródło
Nie jestem pewien, czy to liczy się jako odpowiedź - ale tutaj jest wideo YouTube z kursu Google (tworzenie aplikacji na Androida z Kotlin), które wyjaśnia różnicę.
źródło