Der Lebenszyklus einer Activity

Den Lebenszyklus einer Activity zu verstehen ist wichtig – so schreiben Sie flüssig laufende Apps

Und Sie können die App-Ressourcen effizienter verwalten.

Für ein besseres Nutzererlebnis.

Android-Activities können übereinander gestapelt werden.

Jedes Mal, wenn Sie eine neue Activity starten, deckt sie die vorherige ab.

Wenn Sie dann die Zurück-Taste drücken, wird die aktuelle Activity zerstört und die vorherige wird wieder angezeigt.

Tatsächlich verwendet Android sogenannte Tasks (Aufgaben) zur Verwaltung.

Ein Task ist eine Sammlung von Activities, die in einem Stack gespeichert werden.

Dieser Stack wird als Back Stack (Rückgabestapel) bezeichnet.

Ein Stack ist eine LIFO-Datenstruktur (Last In, First Out).

Standardmäßig wird eine neue Activity beim Start auf den Stack gelegt und an die Spitze gestellt.

Wenn Sie die Zurück-Taste drücken oder finish() aufrufen, wird die Activity an der Spitze des Stacks zerstört. Die zuvor gestartete Activity rückt dann wieder nach oben. Das System zeigt dem Nutzer immer die Activity an der Spitze des Stacks an.

Activity-Zustände

Im Laufe ihres Lebenszyklus kann sich eine Activity in bis zu vier verschiedenen Zuständen befinden.

1. Aktiver Zustand (Running)

Befindet sich eine Activity an der Spitze des Stacks, ist das System nicht bereit, sie zu entsorgen, da dies das Nutzererlebnis beeinträchtigen würde.

2. Pausierter Zustand (Paused)

Die Activity befindet sich nicht an der Spitze des Stacks, ist aber noch teilweise sichtbar – zum Beispiel, wenn eine Dialog-Activity nur einen Teil des Bildschirms einnimmt (ähnlich wie ein modales Fenster). Das System vermeidet es auch hier, sie zu entsorgen, da ein plötzliches Verschwinden den Nutzer verwirren würde.

3. Gestoppter Zustand (Stopped)

Eine Activity tritt in diesen Zustand ein, wenn sie nicht mehr an der Spitze des Stacks ist und vollständig unsichtbar wird. Das System speichert ihren Zustand und ihre Member-Variablen, aber das ist nicht garantiert – wenn andernorts Speicher benötigt wird, kann das System auch gestoppte Activities entsorgen.

4. Zerstörter Zustand (Destroyed)

Sobald eine Activity aus dem Back Stack entfernt wird, befindet sie sich im zerstörten Zustand. Das System entsorgt diese Activities am ehesten, um Speicher freizugeben.

Lebensdauer einer Activity und sieben Callback-Methoden

Die Activity-Klasse definiert sieben Callback-Methoden, die jeden Abschnitt des Lebenszyklus abdecken.

Kurz gesagt: Diese sieben Callback-Funktionen werden zu bestimmten Zeitpunkten im Lebenszyklus ausgelöst, und ihr Code wird dann ausgeführt.

Beispielsweise wird onCreate ausgelöst, wenn die Activity zum ersten Mal erstellt wird.

Hier sind die sieben Methoden:

onCreate:

Wird aufgerufen, wenn die Activity erstmals erstellt wird. Hier erfolgt die Initialisierung – Layout laden, Button-Events verknüpfen usw.

onStart:

Wird ausgelöst, wenn die Activity von unsichtbar zu sichtbar wechselt.

onResume:

Wird aufgerufen, wenn die Activity bereit ist, mit dem Nutzer zu interagieren. Zu diesem Zeitpunkt befindet sie sich an der Spitze des Back Stacks und läuft aktiv (sie ist für den Nutzer sichtbar).

onPause:

Wird aufgerufen, wenn das System im Begriff ist, eine andere Activity zu starten oder wiederaufzunehmen. Hier sollten CPU-intensive Ressourcen freigegeben und wichtige Daten gespeichert werden. Die Ausführung muss jedoch schnell erfolgen – sonst verzögert sich die Anzeige der neuen Activity. (Die aktuelle Activity wird gerade ausgeblendet, der Übergang zur nächsten ist noch nicht abgeschlossen.)

onStop:

Wird aufgerufen, wenn die Activity vollständig unsichtbar wird. Der Hauptunterschied zu onPause besteht darin, dass bei einer neu gestarteten Dialog-Activity onPause ausgeführt wird, onStop jedoch nicht. (Die Activity wird ausgeblendet und die neue wird angezeigt.)

onDestroy:

Wird direkt vor der Zerstörung der Activity aufgerufen. Danach befindet sich die Activity im zerstörten Zustand.

onRestart:

Wird kurz bevor eine gestoppte Activity wieder in den aktiven Zustand wechselt aufgerufen – also wenn die Activity neu gestartet wird.

Drei Arten von Lebensdauer

Von den sieben Methoden oben bilden alle bis auf onRestart jeweils ein Paar. Daher lässt sich die Lebensdauer einer Activity in drei Kategorien unterteilen.

1. Volle Lebensdauer

Alles zwischen onCreate und onDestroy bildet die volle Lebensdauer.

2. Sichtbare Lebensdauer

Der Zeitraum von onStart bis onStop ist die sichtbare Lebensdauer. Die Activity bleibt für den Nutzer sichtbar. Diese Methoden eignen sich zur Ressourcenverwaltung – beispielsweise Ressourcen in onStart laden und in onStop freigeben, damit gestoppte Activities keinen unnötigen Speicher belegen.

3. Vordergrund-Lebensdauer

Der Zeitraum von onResume bis onPause ist die Vordergrund-Lebensdauer. Die Activity läuft aktiv und kann mit dem Nutzer interagieren. Dies ist der Zustand, den Nutzer am häufigsten sehen und mit dem sie am meisten interagieren.

Hauptactivity öffnen → Normale Activity aufrufen → Zurück zur Hauptactivity → Zum Startbildschirm zurückkehren

05-12 15:32:43.899 4316-4316/com.foxdevelop.www.lifedemo E/Hauptactivity-Log: onCreate:
05-12 15:32:43.926 4316-4316/com.foxdevelop.www.lifedemo E/Hauptactivity-Log: onStart:
05-12 15:32:43.930 4316-4316/com.foxdevelop.www.lifedemo E/Hauptactivity-Log: onResume:
05-12 15:33:00.973 4316-4316/com.foxdevelop.www.lifedemo E/Hauptactivity-Log: onPause:
05-12 15:33:01.078 4316-4316/com.foxdevelop.www.lifedemo E/Normal-Activity-Log: onCreate:
05-12 15:33:01.079 4316-4316/com.foxdevelop.www.lifedemo E/Normal-Activity-Log: onStart:
05-12 15:33:01.081 4316-4316/com.foxdevelop.www.lifedemo E/Normal-Activity-Log: onResume:
05-12 15:33:02.969 4316-4316/com.foxdevelop.www.lifedemo E/Hauptactivity-Log: onStop:
05-12 15:34:01.747 4316-4316/com.foxdevelop.www.lifedemo E/Normal-Activity-Log: onPause:
05-12 15:34:01.779 4316-4316/com.foxdevelop.www.lifedemo E/Hauptactivity-Log: onRestart:
05-12 15:34:01.779 4316-4316/com.foxdevelop.www.lifedemo E/Hauptactivity-Log: onStart:
05-12 15:34:01.780 4316-4316/com.foxdevelop.www.lifedemo E/Hauptactivity-Log: onResume:
05-12 15:34:02.749 4316-4316/com.foxdevelop.www.lifedemo E/Normal-Activity-Log: onStop:
05-12 15:34:02.750 4316-4316/com.foxdevelop.www.lifedemo E/Normal-Activity-Log: onDestroy:
05-12 15:35:26.827 4316-4316/com.foxdevelop.www.lifedemo E/Hauptactivity-Log: onPause:
05-12 15:35:28.534 4316-4316/com.foxdevelop.www.lifedemo E/Hauptactivity-Log: onStop:
05-12 15:34:01.779 4316-4316/com.foxdevelop.www.lifedemo E/Hauptactivity-Log: onDestroy:

Projektpraxis

Wir erstellen ein neues Projekt, um den Lebenszyklus kennenzulernen

Wir nennen die Activity LifeDemo.

Fügen Sie eine EmptyActivity als Hauptactivity hinzu.

Dann fügen Sie zwei weitere Activities hinzu: NormalActivity und DialogActivity.

Ändern Sie anschließend deren Layouts.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Normale Activity" />

</LinearLayout>Code-Sprache: HTML, XML (xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Dialog-Activity" />

</LinearLayout>Code-Sprache: HTML, XML (xml)

Die Layouts sind bis auf den angezeigten Text identisch.

Wir müssen DialogActivity außerdem in eine Dialog-Activity umwandeln.

Ändern Sie dazu die AndroidManifest.xml:

<activity android:name=".NormalActivity" />
<activity android:name=".DialogActivity" android:theme="@style/Base.Theme.AppCompat.Dialog"/>
</application>Code-Sprache: HTML, XML (xml)

Damit wird DialogActivity als Dialog festgelegt.

Layout der Hauptactivity

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Normale Activity öffnen" />
    <Button
        android:id="@+id/buttondialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Dialog-Activity öffnen" />
</LinearLayout>Code-Sprache: HTML, XML (xml)

Klickereignisse für die zwei Buttons der Hauptactivity hinzufügen

package com.foxdevelop.www.lifedemo;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button b = (Button)findViewById(R.id.button);
        b.setOnClickListener(
                new View.OnClickListener(){
                    @Override
                    public void onClick(View view){
                        Intent it = new Intent(MainActivity.this,NormalActivity.class);
                        startActivity(it);
                    }
                }
        );
        Button b2 = (Button)findViewById(R.id.buttondialog);
        b2.setOnClickListener(
                new View.OnClickListener(){
                    @Override
                    public void onClick(View view){
                        Intent it = new Intent(MainActivity.this,DialogActivity.class);
                        startActivity(it);
                    }
                }
        );
    }

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

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

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

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

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

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e(TAG, "onRestart: ");
    }
}Code-Sprache: JavaScript (javascript)

1. App ausführen

Beim Erstellen der Hauptactivity werden onCreate, onStart und onResume nacheinander ausgeführt.

Wenn Sie auf „Normale Activity öffnen“ tippen, werden onPause und onStop ausgelöst.

Da NormalActivity die MainActivity vollständig verdeckt, werden beide Methoden aufgerufen.

Drücken Sie die Zurück-Taste, um zurückzukehren.

Da MainActivity zuvor im gestoppten Zustand war, wird onRestart ausgelöst, gefolgt von onStart und onResume.

onCreate wird jedoch nicht ausgeführt, da die Activity nicht neu erstellt wurde. Zu diesem Zeitpunkt hat NormalActivity wahrscheinlich sein eigenes onDestroy ausgelöst.

Tippen Sie nun auf „Dialog öffnen“.

Diesmal wird nur onPause ausgelöst.

Sie sehen, dass onStop nicht ausgelöst wurde.

Das liegt daran, dass DialogActivity die MainActivity nicht vollständig verdeckt.

Ebenso wird beim Drücken der Zurück-Taste nur onResume ausgeführt, da sie nicht gestoppt wurde, wird onStart nicht aufgerufen.

Wie man sieht, werden hier onPause, onStop und dann onDestroy ausgelöst.

Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.Code-Sprache: CSS (css)

Hauptactivity erstellt → Dialog-Activity geöffnet → Zurück zur Hauptactivity → Zum Startbildschirm

05-13 02:10:51.635 4206-4206/com.foxdevelop.www.lifedemo E/Hauptactivity: onCreate: // Neue Activity erstellen
05-13 02:10:51.673 4206-4206/com.foxdevelop.www.lifedemo E/Hauptactivity: onStart: // Von unsichtbar zu sichtbar
05-13 02:10:51.701 4206-4206/com.foxdevelop.www.lifedemo E/Hauptactivity: onResume: // Activity ist sichtbar
05-13 02:12:01.993 4206-4206/com.foxdevelop.www.lifedemo E/Hauptactivity: onPause: // Von aktueller Activity zu einer anderen wechseln
05-13 02:12:02.115 4206-4206/com.foxdevelop.www.lifedemo E/Dialog-Activity: onCreate:
05-13 02:12:02.116 4206-4206/com.foxdevelop.www.lifedemo E/Dialog-Activity: onStart:
05-13 02:12:02.143 4206-4206/com.foxdevelop.www.lifedemo E/Dialog-Activity: onResume:
05-13 02:14:26.078 4206-4206/com.foxdevelop.www.lifedemo E/Dialog-Activity: onPause: // Zurück-Taste drücken, zurück zur Hauptactivity
05-13 02:14:26.367 4206-4206/com.foxdevelop.www.lifedemo E/Hauptactivity: onResume: // Hauptactivity erscheint direkt, da nicht gestoppt, kein restart/start
05-13 02:14:26.803 4206-4206/com.foxdevelop.www.lifedemo E/Dialog-Activity: onStop: // Dialog-Activity nicht mehr sichtbar
05-13 02:14:26.803 4206-4206/com.foxdevelop.www.lifedemo E/Dialog-Activity: onDestroy: // Wegen Back oder finish() wird sie zerstört
05-13 02:16:23.959 4206-4206/com.foxdevelop.www.lifedemo E/Hauptactivity: onPause:
05-13 02:16:25.606 4206-4206/com.foxdevelop.www.lifedemo E/Hauptactivity: onStop:
05-13 02:16:25.609 4206-4206/com.foxdevelop.www.lifedemo E/Hauptactivity: onDestroy: // Vor jeder Zerstörung müssen pause und stop ausgeführt werdenCode-Sprache: JavaScript (javascript)

Der Lebenszyklus einer Activity

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert