Różnica między onStart () i onResume ()

176

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

Eugene
źródło
Spójrz tutaj na cykl życia aplikacji: d.android.com/guide/topics/fundamentals.html
ykatchou
To łatwe. Spróbuj to wyjaśnić DZIĘKI Fragmentami, teraz to jest programowanie dla Androida!
Scott Biggs
Poniższe odpowiedzi nie zawierają rzeczywistego kodu z wyjaśnieniem. To jest kod, który wyjaśnia to fragmentem.
Atul

Odpowiedzi:

306

Dlaczego nie może tak być, że onResume () jest wywoływana po metodach onRestart () i onCreate () po prostu wykluczając onStart ()? Jaki jest jej cel?

OK, ponieważ moja pierwsza odpowiedź była dość długa, nie będę jej dalej rozciągać, więc spróbujmy tego ...

public DriveToWorkActivity extends Activity
    implements onReachedGroceryStoreListener {
}

public GroceryStoreActivity extends Activity {}

UWAGA: celowo pominąłem wezwania do takich rzeczy, jak super.onCreate(...)itp. To jest pseudokod, więc daj mi tutaj trochę artystycznej licencji. ;)

Metody DriveToWorkActivitynaśladowania ...

protected void onCreate(...) {
    openGarageDoor();
    unlockCarAndGetIn();
    closeCarDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

protected void onStart() {
    startEngine();
    changeRadioStation();
    switchOnLightsIfNeeded();
    switchOnWipersIfNeeded();
}

protected void onResume() {
    applyFootbrake();
    releaseHandbrake();
    putCarInGear();
    drive();
}

protected void onPause() {
    putCarInNeutral();
    applyHandbrake();
}

protected void onStop() {
    switchEveryThingOff();
    turnOffEngine();
    removeSeatBeltAndGetOutOfCar();
    lockCar();
}

protected void onDestroy() {
    enterOfficeBuilding();
}

protected void onReachedGroceryStore(...) {
    Intent i = new Intent(ACTION_GET_GROCERIES, ...,  this, GroceryStoreActivity.class);
}

protected void onRestart() {
    unlockCarAndGetIn();
    closeDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

OK, więc to kolejny długi (przepraszam ludzie). Ale oto moje wyjaśnienie ...

onResume()jest wtedy, gdy zaczynam jechać i onPause()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 GroceryStoreActivityzaczyna się (zmuszając mnie DriveToWorkActivitydo rzeczy onStop()). Kiedy wracam ze sklepu, przechodzę przez niego onRestart()i onStart()wznawiam swoją podróż.

Mógłbym umieścić kod, który jest w onStart()obu onCreate()i onRestart()nie zawracać sobie głowy nadpisywaniem onStart()w ogóle, ale im więcej trzeba zrobić między onCreate() -> onResume()i onRestart() -> onResume(), tym więcej rzeczy powielam.

Tak więc, aby ponownie zareagować ...

Dlaczego nie może tak być, że onResume () jest wywoływana po metodach onRestart () i onCreate () po prostu wykluczając onStart ()?

Jeśli tego nie zrobisz, onStart()tak się stanie. Chociaż onStart()metoda Activitywill zostanie wywołana niejawnie, efekt w kodzie jest efektywny onCreate() -> onResume()lub onRestart() -> onResume().

Squonk
źródło
Oznacza to, że zarówno onCreate()i, jak i onRestart()mają dużo wspólnego kodu, prawda?
Dheeraj Vepakomma
1
@Dheeraj: Niekoniecznie. To jest pseudokod i ma na celu jedynie zilustrowanie, jak można wykorzystać każdy etap Activitycyklu życia. Etap tworzenia onCreate(...)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 z Activitiesnich nie musi tak naprawdę implementować więcej niż onCreate(...), onResume()a onPause()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.
Squonk
1
To dlatego nienawidzę Android API w porównaniu do iOS, a nawet WP7 ... Robiłem grę, która działa na wszystkich trzech w C # i muszę powiedzieć, że jestem bardzo rozczarowany Google i Androidem. Wydaje się, że brakuje ich w dziale projektowania języka / API. Mam nadzieję, że jakiś inny system operacyjny Linux w telefonach przejmie kontrolę, ponieważ ogólnie głosuję na Open Source ...
zezba9000
2
@Tim: OK, wymyśl lepszy projekt. Jak poradzisz sobie ze scenariuszem na telefonie komórkowym, gdy ktoś używa aplikacji (Twojej aplikacji) i nagle otrzymuje telefon? Projektant aplikacji nie nazywa wprost Activitymetod 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.
Squonk
9
Myślę, że odpowiedź Nilesha poniżej jest znacznie jaśniejsza. Kluczowa różnica między onStarti onResumepolega na „widoczności” i „interakcji użytkownika”. Ta metafora prowadzenia samochodu jest myląca i niezbyt pomocna.
KJ
142

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:

onCreate()
{
     createNecessaryObjects();

     prepareObjectsForDisplay();
}


onRestart()
{
     prepareObjectsForDisplay();

}

Całe zamieszanie jest spowodowane tym, że Google wybrał nieintuicyjne nazwy zamiast czegoś takiego:

onCreateAndPrepareToDisplay()   [instead of onCreate() ]
onPrepareToDisplay()            [instead of onRestart() ]
onVisible()                     [instead of onStart() ]
onBeginInteraction()            [instead of onResume() ]
onPauseInteraction()            [instead of onPause() ]
onInvisible()                   [instead of onStop]
onDestroy()                     [no change] 

Diagram aktywności można interpretować jako:

Cykl życia aktywności Androida

Nilesh Pawar
źródło
4
Kiedy wyjaśniam to studentom, używam mayOnInvisible () zamiast onStop (). I użyj możeOnDestroy () zamiast onDestroy (). Te nazwy działają dobrze jako wyjaśnienia, które znajduję. Pomyślałem, że nie chciałbym, żeby Google faktycznie zmieniło się na te nazwy.
Stephan Branczyk,
I jak twoi sugerowanych nazw, pomagają zrobić jakiś sens tej części śmiesznej Android API. Nadal mam ogólne pytanie dotyczące cyklu życia. Na wszystkich diagramach pokazuje ścieżkę od onPause bezpośrednio do onResume. Nie sądzę, żebym kiedykolwiek widział tę ścieżkę w żadnym wypadku. Zawsze prowadzi ścieżkę od onStop do onStart. Co uruchomiłoby inną ścieżkę?
Dewey Vozel
@StephanBranczyk dlaczego używasz może ... ()? Dlaczego może"?
Marian Paździoch
1
@ Damnum, Aby uzyskać najnowsze wyjaśnienie cyklu życia działania, proponuję zapoznać się z pośrednim kursem Android Udacity utworzonym przez Google. To nic nie kosztuje, zakładając, że klikniesz niebieski przycisk, aby uzyskać dostęp do jego materiałów za darmo, a nie przycisk wersji próbnej (ani przycisk nanodegree). udacity.com/course/developing-android-apps--ud853
Stephan Branczyk
1
@ Damnum, proponuję zadać to pytanie na forum udacity związanym z obejrzanym filmem. Zasadniczo myślę, że zależy to od używanego okna dialogowego, czy jest to czynność dialogowa, czy tylko okno dialogowe.
Stephan Branczyk,
29

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.

Siergiej Głotow
źródło
10

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!

Martin Booka Weser
źródło
2
Ładny obraz i dobra książka, ale nadal nie daje odpowiedzi, dlaczego naprawdę potrzebujemy metody onStart () i jakie specjalne rzeczy możemy w niej zrobić, czego nie możemy zrobić w onResume ().
Eugene,
8
onStart () NIE jest wywoływana, jeśli aplikacja została wstrzymana. Twoja aplikacja jest „wstrzymana”, jeśli inna aplikacja staje się aktywna, ale NIE przesłania jej całkowicie. Możesz więc robić inne rzeczy w stanie „wstrzymania” niż w stanie „Zatrzymano”. W związku z tym możesz zrobić inne rzeczy, jeśli Twoja aplikacja zostanie właśnie „wznowiona” ze stanu wstrzymania, niż gdybyś została „uruchomiona” ze stanu zatrzymania lub od całkowitego uruchomienia. To pomaga?
Martin Booka Weser
7

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 momentu onDestroy(), zostanie odtworzone i powróci do kolejnych cykli życia. Jednak możesz się nie spodziewać, że onCreateDialog()i onPrepareDialog()(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ędzy onStart() i onResume(). 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!

pjv
źródło
7

onStart()

  1. Wywoływana po onCreate (Bundle) lub po onRestart (), a następnie onResume () .
  2. możesz zarejestrować BroadcastReceiver w onStart() aby monitorować zmiany, które mają wpływ na Twój interfejs użytkownika, musisz wyrejestrować go w onStop ()
  3. Klasy pochodne muszą wywoływać implementację tej metody w superklasie. Jeśli tego nie zrobią, zostanie zgłoszony wyjątek.

onResume()

  1. Wywoływane po onRestoreInstanceState (Bundle), onRestart () lub onPause ()
  2. Rozpocznij animacje, otwórz urządzenia z wyłącznym dostępem (takie jak kamera)

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 powoduje onStop()przywołania, gdy dziecko się zamyka.

onResume() nazywa się bez onStart() gdy działanie jest wznawiane w tle

Aby uzyskać więcej informacji, odwiedź stronę Android_activity_lifecycle_gotcha i cykl życia działania

IntelliJ Amiya
źródło
w rzeczywistości zatrzymuję się, gdy moja aplikacja przechodzi w tło
martwa ryba
5

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.

aprofromindia
źródło
4

onStart()oznacza, że Activitywszedł 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ęć.

Abhi
źródło
1

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

Corneliu Dascălu
źródło
0

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ępuje onPause().

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ępuje onResume()wtedy, gdy czynność powraca na pierwszy plan lub onStop()staje się niewidoczna dla użytkownika.

androidwifi
źródło
0

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ę.

  • On Start jest wywoływane, gdy działanie staje się widoczne
  • Funkcja On Pause jest wywoływana, gdy aktywność przestaje być aktywna (podobnie jak wyskakujące okno dialogowe)
  • Wznowienie jest wywoływane, gdy aktywność staje się aktywna (np. Gdy znika okno dialogowe)
hba
źródło