19 Stimmen

Welche Methoden werden im Aktivitätslebenszyklus in den folgenden Fällen aufgerufen:

Nehmen wir an, ich habe eine Hello World Single Activity-Anwendung. Ich starte diese Anwendung.

Welche Methoden jeweils aufgerufen werden:

  • Die Home-Taste wird gedrückt: ?
    Zurück-Taste wird gedrückt: ?
    Ein Telefonanruf geht ein: ?

Welche Methoden werden aufgerufen, wenn der Benutzer die Anwendung erneut über das Anwendungssymbol startet (vorausgesetzt, das Betriebssystem hatte keinen "andere Anwendungen benötigen Speicher"-Zustand):

  • Die Home-Taste wurde gedrückt: ?
    Die Zurück-Taste wurde gedrückt: ?
    Ein Telefonanruf ging ein: ?

Vielen Dank an alle.

Bearbeiten: Extra Credit: Wie kann der Benutzer die onPause ohne Aufruf von onStop ?

30voto

Arpit Patel Punkte 9027

Zum Verständnis AKTIVITÄTSLEBENSZYKLUS Ich erstelle die Demo See HIER

Und eine andere Fallstudie habe ich hinzugefügt.

MainActivity.java

    public class MainActivity extends AppCompatActivity {

    private static final String TAG = "State changed";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.i(TAG, "onCreate: ");
    }

    public void OpenDialog(View view) {

        final AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create(); //Read Update
        alertDialog.setTitle("hi");
        alertDialog.setMessage("this is my app");

        alertDialog.setButton("Continue..", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                // here you can add functions
                alertDialog.dismiss();
            }
        });

        alertDialog.show();  //<-- Show dialog
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "onStart: " );
    }

    @Override
    protected void onResume() {
        super.onResume();

        Log.i(TAG, "onResume: ");

    }

    @Override
    protected void onPause() {
        super.onPause();

        Log.i(TAG, "onPause: ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "onStop: ");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, "onRestart: ");
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i(TAG, "onSaveInstanceState: ");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.i(TAG, "onRestoreInstanceState: ");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestroy: ");
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        Log.i(TAG, "onBackPressed: ");
    }

}

Fallstudie

Fall 1 = Klicken Sie zuerst auf das App-Symbol

Hinweis: Hier wird der onRestoreInstanceState nicht angezeigt, da er zur Laufzeit ausgeführt wird.

I/Zustand geändert: onCreate:

I/Zustand geändert: onStart:

I/Zustand geändert: onResume:

Fall 2 = Klicken Sie auf die Home-Taste (dasselbe passiert, wenn die Bildschirmbeleuchtung aus ist oder ein Anruf kommt)

I/Zustand geändert: onPause:

I/Zustand geändert: onSaveInstanceState:

I/Zustand geändert: onStop:

Fall 3 = (Fall 2 fortsetzen) App über Zuletzt geöffnet

I/Status geändert: onRestart:

I/Zustand geändert: onStart:

I/Zustand geändert: onResume:

Fall 4 = Klick auf die Schaltfläche Zurück (Aufruf der Methode onBackPressed)

I/Zustand geändert: onPause:

I/Zustand geändert: onStop:

I/Zustand geändert: onDestroy:

Fall 5 = Konfigration ändern (Bildschirm drehen)

I/Zustand geändert: onPause:

I/Zustand geändert: onSaveInstanceState:

I/Zustand geändert: onStop:

I/Zustand geändert: onDestroy:

I/Zustand geändert: onCreate:

I/Zustand geändert: onStart:

I/State geändert: onRestoreInstanceState:

I/Zustand geändert: onResume:

27voto

bigstones Punkte 14857

Sowohl das Drücken des Home-Buttons als auch der Empfang eines Anrufs entfernen die Aktivität nicht aus dem Aufgabenstapel und sind verfügbar, wenn Sie die Anwendung wieder betreten => onPause() => onStop().

als die Aktivitätslebenszyklusdiagramm zeigt, dass der Wiedereintritt in die Anwendung => onRestart() => onStart() => onResume() aufruft

durch Drücken der Zurück-Taste wird die Aktivität beendet => onPause() => onStop() => onDestroy()

Das erneute Betreten der Anwendung ruft in diesem Fall die Klassiker => onCreate() => onStart() => onResume()

EDIT

von http://developer.Android.com/reference/Android/app/Activity.html#ActivityLifecycle

Wenn eine Aktivität den Fokus verloren hat, aber noch noch sichtbar (d. h. eine neue nicht vollflächige oder transparente Aktivität hat den Fokus über Ihrer Aktivität), wird sie pausiert. Eine pausierte Aktivität ist vollständig lebendig (sie behält alle Status- und Mitgliederinformationen und bleibt mit dem Fenstermanager verbunden Manager), kann aber vom System beendet werden System bei extrem wenig Speicher Situationen beendet werden.

6voto

Es kann mehrere Szenarien geben

  1. Öffnen der App über das App-Symbol. Folgende Methoden werden aufgerufen

    onCreate()-->onStart()-->onResume()

  2. Wenn der Benutzer die Home-Taste drückt

    onPause()-->onStop()

  3. Wenn der Benutzer vom Aktivitätsstapel zur Anwendung zurückkehrt

    onRestart()-->onStart()--> onResume()

  4. Wenn die App läuft und der Benutzer die Einschalttaste drückt

    onPause()-->onStop()

  5. Wenn der Benutzer das Telefon entsperrt

    onRestart()-->onStart()--> onResume()

  6. Wenn der Benutzer einen eingehenden Anruf erhält, während er sich in der App befindet

    onPause()

  7. Wenn der Benutzer nach dem Trennen des Anrufs zur App zurückkehrt

    onResume()

  8. Wenn der Benutzer in der App die Zurück-Taste drückt

    onPause()-->onStop()-->onDestroy()

  9. Und wenn der Benutzer die Home-Taste drückt und aus dem Aktivitätsstapel wischt, kann die app.onDestroy()-Methode je nach Betriebssystem aufgerufen werden oder nicht, da sie den Kontext der Aktivität enthält oder nicht, je nach Speicheranforderungen

4voto

f20k Punkte 3096

Sehen Sie, während eine Sequenz von Ereignissen mit Ihrem Hallo-Welt-Programm auftreten kann, darf dieselbe Sequenz nicht in einem Videospiel auftreten, weil Android sie wahrscheinlich zerstören wird, weil sie zu viele Ressourcen verbraucht.

Der beste Weg, den ich gefunden habe, um den Lebenszyklus für meine App zu sehen, ist, alle Methoden (onStart, onRestart,..., einschließlich der onSaveInstance und onRestoreInstance) zu überschreiben und Log-Anweisungen in jeder einfügen. Etwa so:

@Override
public void onDestroy() {
    // Call the super class 
    super.onDestroy();
    // Log the action
    Log.d("Debug", "onDestroy() has been called!");
}

Jetzt kann ich logcat aufrufen und sehen, welche Ereignisse stattgefunden haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X