Unterschied zwischen onStart () und onResume ()

176

Ich kann die Bedeutung des onStart()Übergangszustands nicht verstehen. DasonResume() Methode wird immer danach aufgerufen onStart(). Warum kann es nicht sein, dass das onResume()aufgerufen wird onRestart()und onCreate()Methoden nur ausschließen onStart()? Was ist seine Aufgabe?

Warum können wir nicht ohne leben? onStart() . Ich halte es immer noch für überflüssig (wahrscheinlich, weil ich seine Bedeutung nicht vollständig verstehe).

Eugene
quelle
Suchen Sie hier nach dem Anwendungslebenszyklus: d.android.com/guide/topics/fundamentals.html
ykatchou
Das Zeug ist einfach. Versuchen Sie dies mit Fragmenten zu erklären, jetzt ist das Android-Programmierung für Sie!
Scott Biggs
Die folgenden Antworten enthalten keinen aktuellen Code mit Erläuterungen. Dies ist Code, der es mit Fragment erklärt.
Atul

Antworten:

306

Warum kann es nicht sein, dass onResume () nach den Methoden onRestart () und onCreate () aufgerufen wird, nur ohne onStart ()? Was ist seine Aufgabe?

OK, da meine erste Antwort ziemlich lang war, werde ich sie nicht weiter ausdehnen, also lass es uns versuchen ...

public DriveToWorkActivity extends Activity
    implements onReachedGroceryStoreListener {
}

public GroceryStoreActivity extends Activity {}

BITTE BEACHTEN SIE: Ich habe die Anrufe zu Dingen wie super.onCreate(...)usw. absichtlich weggelassen . Dies ist Pseudocode, also geben Sie mir hier eine künstlerische Lizenz. ;)

Die Methoden für DriveToWorkActivityfolgen ...

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, es ist also noch eine lange (sorry Leute). Aber hier ist meine Erklärung ...

onResume()ist, wenn ich anfange zu fahren und onPause()wenn ich vorübergehend zum Stillstand komme. Also fahre ich und erreiche ein rotes Licht, damit ich innehalte ... das Licht wird grün und ich fahre fort. Noch ein rotes Licht und ich mache eine Pause, dann grün, damit ich weitermache. Die onPause() -> onResume() -> onPause() -> onResume()Schleife ist eng und kommt während meiner Reise oft vor.

Die Schleife vom Zurückhalten durch einen Neustart (Vorbereitung auf die Fortsetzung meiner Reise) bis zum erneuten Starten ist vielleicht weniger häufig. In einem Fall sehe ich das Lebensmittelgeschäft und das GroceryStoreActivitywird gestartet (was mich DriveToWorkActivityzum Punkt zwingt onStop()). Wenn ich aus dem Laden zurückkomme, gehe ich durch onRestart()undonStart() setze dann meine Reise fort.

Ich könnte den Code, der onStart()in beiden enthalten ist, einfügen onCreate()und mich überhaupt onRestart()nicht darum kümmern, ihn zu überschreiben, onStart()aber je mehr zwischen onCreate() -> onResume()und getan werden muss onRestart() -> onResume(), desto mehr dupliziere ich Dinge.

Also, um noch einmal zu fordern ...

Warum kann es nicht sein, dass onResume () nach den Methoden onRestart () und onCreate () aufgerufen wird, nur ohne onStart ()?

Wenn Sie nicht überschreiben, onStart()geschieht dies effektiv. Obwohl die onStart()Methode von Activityimplizit aufgerufen wird, ist der Effekt in Ihrem Code effektiv onCreate() -> onResume()oder onRestart() -> onResume().

Squonk
quelle
Dies impliziert, dass beide onCreate()und onRestart()viel gemeinsamen Code teilen würden, oder?
Dheeraj Vepakomma
1
@Dheeraj: Nein, nicht unbedingt. Dies ist Pseudocode und soll nur veranschaulichen, wie jede Phase des ActivityLebenszyklus verwendet werden kann. Die Erstellungsphase onCreate(...)kann durchaus viel bewirken, wenn es darum geht, Instanzmitglieder (UI-Elemente usw.) zu instanziieren, aber ein 'Neustart' sollte dies nicht erfordern. In der Realität müssen viele Activitiesnicht mehr als implementieren onCreate(...), onResume()und onPause()die anderen Methoden sind für Fälle verfügbar, in denen Sie möglicherweise andere Dinge tun müssen und der Schlüssel darin besteht, zu verstehen, wo der Code abgelegt werden muss.
Squonk
1
Aus diesem Grund hasse ich die Android-API im Vergleich zu iOS und sogar WP7 ... Ich habe ein Spiel entwickelt, das auf allen drei in C # läuft, und ich muss sagen, dass ich von Google und Android sehr enttäuscht bin. Sie scheinen in der Abteilung für Sprach- / API-Design zu fehlen. Ich hoffe sehr, dass ein anderes Linux-Telefon-Betriebssystem die Kontrolle übernimmt, denn ich stimme für Open Source im Allgemeinen ...
zezba9000
2
@ Tim: OK, kommen Sie mit einem besseren Design. Wie würden Sie mit einem Szenario auf einem Mobiltelefon umgehen, wenn jemand eine App (Ihre App) verwendet und plötzlich einen Anruf erhält? Der App-Designer nennt die ActivityLebenszyklusmethoden nicht explizit - es ist das Android-Betriebssystem, das dies tut und es sehr effizient (vorausgesetzt, der App-Entwickler weiß, was er tut und codiert auch effizient). Wenn Sie viel Android entwickeln, werden Sie feststellen, warum die Dinge so funktionieren, wie sie funktionieren - es ist nicht 100% perfekt, aber es ist ziemlich gut.
Squonk
9
Ich denke, Nileshs Antwort unten ist viel klarer. Der Hauptunterschied zwischen onStartund onResumeist der der Sichtbarkeit und der Benutzerinteraktion. Diese Metapher für das Autofahren ist verwirrend und nicht wirklich hilfreich.
KJ
141

Kurze Antwort:

Wir können nicht ohne onStart leben, da dies der Zustand ist, in dem die Aktivität für den Benutzer "sichtbar" wird, der Benutzer jedoch nicht mit ihr "interagieren" kann, weil sie sich möglicherweise mit einem anderen kleinen Dialogfeld überschneidet. Diese Fähigkeit zur Interaktion mit dem Benutzer unterscheidet onStart und onResume. Betrachten Sie es als eine Person hinter einer Glastür. Sie können die Person sehen, aber Sie können nicht mit ihr interagieren (sprechen / hören / Hände schütteln). OnResume ist wie der Türöffner, nach dem Sie die Interaktion beginnen können.

Außerdem ist onRestart () am wenigsten verstanden. Wir können die Frage stellen, warum nicht direkt nach onStop () statt onRestart () zu onStart () oder onResume () wechseln. Es wird einfacher zu verstehen, wenn wir feststellen, dass onRestart () teilweise onCreate () entspricht, wenn der Erstellungsteil weggelassen wird. Grundsätzlich führen beide Zustände zu onStart () (dh die Aktivität wird sichtbar). Also müssen beide Staaten das anzuzeigende Zeug "vorbereiten". OnCreate hat die zusätzliche Verantwortung, das anzuzeigende Material zu "erstellen"

Ihre Codestrukturen könnten also zu etwas passen wie:

onCreate()
{
     createNecessaryObjects();

     prepareObjectsForDisplay();
}


onRestart()
{
     prepareObjectsForDisplay();

}

Die gesamte Verwirrung wird dadurch verursacht, dass Google nicht intuitive Namen anstelle von etwas wie folgt gewählt hat:

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] 

Das Aktivitätsdiagramm kann wie folgt interpretiert werden:

Android-Aktivitätslebenszyklus

Nilesh Pawar
quelle
4
Wenn ich es den Schülern erkläre, verwende ich vielleicht OnInvisible () anstelle von onStop (). Und verwenden Sie vielleichtOnDestroy () anstelle von onDestroy (). Diese Namen eignen sich gut als Erklärungen, die ich finde. Ich dachte, ich möchte nicht, dass Google diese Namen tatsächlich ändert.
Stephan Branczyk
Ich mag deine vorgeschlagenen Namen, sie dazu beitragen , dass etwas Sinn dieses Teils des Lächerlichen Android API. Ich habe noch eine allgemeine Frage zum Lebenszyklus. In allen Diagrammen wird gezeigt, dass es einen Pfad von onPause direkt zu onResume gibt. Ich glaube nicht, dass ich jemals gesehen habe, dass dieser Weg tatsächlich gegangen ist. Es nimmt immer den Pfad von onStop zu onStart. Was würde den anderen Weg auslösen?
Dewey Vozel
@StephanBranczyk warum benutzt du vielleicht ... ()? Warum "vielleicht"?
Marian Paździoch
1
@Damnum, Für die neueste Erklärung des Aktivitätslebenszyklus empfehle ich Ihnen, den von Google erstellten Android-Zwischenkurs für Android zu lesen. Es ist kostenlos, vorausgesetzt, Sie klicken auf die blaue Schaltfläche, um kostenlos auf die Materialien zuzugreifen, und nicht auf die Testschaltfläche (oder die Nanograd-Schaltfläche). udacity.com/course/developing-android-apps--ud853
Stephan Branczyk
1
@Damnum, ich würde vorschlagen, dass Sie diese Frage im udacity-Forum zu dem Video stellen, das Sie gesehen haben. Aber im Grunde denke ich, dass es vom verwendeten Dialog abhängt, ob es sich um eine Dialogaktivität oder nur um einen Dialog handelt.
Stephan Branczyk
29

onStart() Wird aufgerufen, wenn die Aktivität für den Benutzer sichtbar wird. onResume()Wird aufgerufen, wenn die Aktivität mit dem Benutzer interagiert. In diesem Fall möchten Sie möglicherweise verschiedene Dinge tun.

Siehe diesen Link als Referenz.

Sergey Glotov
quelle
10

Das Buch "Hallo Android, Einführung in Googles Mobile Development Platform" bietet eine schöne Erklärung des Lebenszyklus von Android-Apps. Zum Glück haben sie das jeweilige Kapitel als Auszug online. Siehe die Grafik auf Seite 39 unter http://media.pragprog.com/titles/eband3/concepts.pdf

Übrigens ist dieses Buch für Android-Anfänger sehr zu empfehlen!

Martin Booka Weser
quelle
2
Schönes Bild und gutes Buch, aber es gibt immer noch keine Antwort, warum wir die onStart () -Methode wirklich brauchen und welche besonderen Dinge wir darin tun können, die wir in onResume () nicht tun können.
Eugene
8
onStart () wird NICHT aufgerufen, wenn die App angehalten wurde. Ihre App wird "angehalten", wenn eine andere App den Fokus erhält, Ihre App jedoch NICHT vollständig verdeckt. Sie können also im Zustand "Angehalten" andere Dinge tun als im Zustand "Gestoppt". Daher können Sie andere Dinge tun, wenn Ihre App nur aus dem angehaltenen Zustand "wieder aufgenommen" wird, als wenn Ihre App aus dem gestoppten Zustand oder aus dem vollständigen Start "gestartet" wird. Hilft das?
Martin Booka Weser
7

Ein besonders lebhaftes Beispiel ist, wenn Sie sich entscheiden, einen verwalteten Dialog aus einer Aktivität mit anzuzeigen showDialog(). Wenn der Benutzer den Bildschirm dreht, während der Dialog noch geöffnet ist (wir nennen dies eine "Konfigurationsänderung"), durchläuft die Hauptaktivität alle Aufrufe des Endlebenszyklus onDestroy(), bis sie neu erstellt wird, und geht die Lebenszyklen erneut durch. Was Sie jedoch möglicherweise nicht erwarten, ist, dass onCreateDialog()und onPrepareDialog()(die Methoden, die aufgerufen werden, wenn Sie dies tun, showDialog()und jetzt wieder automatisch, um den Dialog neu zu erstellen - automatisch, da es sich um einen verwalteten Dialog handelt) zwischen onStart() und aufgerufen werden onResume(). Der Hinweis hier ist, dass der Dialog nicht den gesamten Bildschirm abdeckt und daher einen Teil der Hauptaktivität sichtbar lässt. Es ist ein Detail, aber es spielt eine Rolle!

pjv
quelle
7

onStart()

  1. Wird nach onCreate (Bundle) oder nach onRestart () gefolgt von onResume () aufgerufen. .
  2. Sie können einen BroadcastReceiver in registrieren onStart() , um Änderungen zu überwachen, die sich auf Ihre Benutzeroberfläche auswirken. Sie müssen die Registrierung in onStop () aufheben.
  3. Abgeleitete Klassen müssen die Implementierung dieser Methode durch die Superklasse aufrufen. Wenn dies nicht der Fall ist, wird eine Ausnahme ausgelöst.

onResume()

  1. Wird nach onRestoreInstanceState (Bundle), onRestart () oder onPause () aufgerufen.
  2. Beginnen Sie mit Animationen und öffnen Sie Geräte mit exklusivem Zugriff (z. B. die Kamera).

onStart() Normalerweise wird die Arbeit an einen Hintergrund-Thread gesendet, dessen Rückgabewerte sind:

  • START_STICKY, um automatisch neu zu starten, wenn es getötet wird, um es aktiv zu halten.

  • START_REDELIVER_INTENT für automatischen Neustart und erneuten Versuch, wenn der Dienst vor stopSelf () beendet wurde.

onResume()wird vom Betriebssystem aufgerufen, nachdem das Gerät in den Ruhezustand versetzt wurde oder nachdem eine Warnung oder eine andere untergeordnete Aktivität auf einem Teil des Bildschirms einen Teil des vorherigen Fensters sichtbar lässt, sodass eine Methode erforderlich ist, um Felder neu zu initialisieren (innerhalb einer Versuchsstruktur mit einer Ausnahme von Ausnahmen) ). Eine solche Situation führt nicht dazu onStop(), dass sie aufgerufen wird, wenn das Kind schließt.

onResume()wird ohne aufgerufen, onStart()wenn die Aktivität aus dem Hintergrund fortgesetzt wird

Weitere Informationen finden Sie unter Android_activity_lifecycle_gotcha und Activity Lifecycle

IntelliJ Amiya
quelle
Eigentlich werde ich angehalten, wenn meine App in den Hintergrund geht
Deadfish
5

Hoffentlich eine einfache Erklärung: -

am Start() -> wird aufgerufen, wenn die Aktivität sichtbar wird, aber möglicherweise nicht im Vordergrund steht (z. B. befindet sich ein AlertFragment oben oder ein anderer möglicher Anwendungsfall).

onResume () -> wird aufgerufen, wenn die Aktivität im Vordergrund steht oder der Benutzer mit der Aktivität interagieren kann.

Aprofromindie
quelle
4

onStart() meint Activity in den sichtbaren Zustand versetzt wurden, und das Layout werden erstellt, können jedoch nicht mit diesem Aktivitätslayout interagieren.

Resume() Das heißt, Sie können jetzt mit dem Aktivitätslayout interagieren.

Abhi
quelle
1

Beachten Sie, dass zwischen den Aufrufen von onStart () und onResume () Dinge passieren. Nämlich onNewIntent (), was ich schmerzhaft herausgefunden habe.

Wenn Sie das SINGLE_TOP-Flag verwenden und einige Daten mithilfe von Absichts-Extras an Ihre Aktivität senden, können Sie nur in onNewIntent () darauf zugreifen , das nach onStart () und vor onResume () aufgerufen wird. Normalerweise nehmen Sie die neuen (möglicherweise nur geänderten) Daten aus den Extras und legen sie auf einige Klassenmitglieder fest, oder verwenden setIntent (), um die neue Absicht als ursprüngliche Aktivitätsabsicht festzulegen und die Daten in onResume () zu verarbeiten.

Corneliu Dascălu
quelle
0

Verweis auf http://developer.android.com/training/basics/activity-lifecycle/starting.html

onResume()Wird aufgerufen, kurz bevor die Aktivität mit dem Benutzer interagiert. Zu diesem Zeitpunkt befindet sich die Aktivität oben im Aktivitätsstapel, und die Benutzereingaben werden dorthin geleitet. Immer gefolgt von onPause().

onPause()Wird aufgerufen, wenn das System eine weitere Aktivität wieder aufnehmen möchte. Diese Methode wird normalerweise verwendet, um nicht gespeicherte Änderungen an persistenten Daten festzuschreiben, Animationen zu stoppen und andere Dinge, die möglicherweise CPU verbrauchen, und so weiter. Es sollte alles sehr schnell tun, da die nächste Aktivität erst wieder aufgenommen wird, wenn sie zurückkehrt. Gefolgt von, onResume()ob die Aktivität wieder in den Vordergrund zurückkehrt oder onStop()ob sie für den Benutzer unsichtbar wird.

androidwifi
quelle
0

Ich bin mir nicht sicher, ob dies als Antwort gilt - aber hier ist das YouTube-Video aus Googles Kurs (Entwickeln von Android-Apps mit Kotlin), das den Unterschied erklärt.

  • On Start wird aufgerufen, wenn die Aktivität sichtbar wird
  • On Pause wird aufgerufen, wenn die Aktivität den Fokus verliert (wie ein Dialogfeld erscheint).
  • On Resume wird aufgerufen, wenn die Aktivität den Fokus erhält (z. B. wenn ein Dialogfeld verschwindet).
hba
quelle