Detaillierte Erklärung der Aktivitäten in Android

Aktivität normaler Lebenszyklus

Der Aktivitätslebenszyklus bezieht sich auf den gesamten Aktivitätsprozess von der Erstellung bis zur Zerstörung, einschließlich der folgenden Zustände:

  1. onCreate(): Wird beim ersten Erstellen der Aktivität aufgerufen und zum Initialisieren der Schnittstelle und der Daten verwendet
  2. onStart(): Wird aufgerufen, wenn die Aktivität sichtbar wird, der Benutzer kann jedoch nicht mit ihr interagieren.
  3. onResume(): Wird aufgerufen, wenn die Aktivität sichtbar ist und der Benutzer interagieren kann. Wird normalerweise zum Starten von Animationen, Musik usw. verwendet.
  4. onPause(): Wird aufgerufen, wenn eine andere Aktivität (oder ein anderes Dialogfeld) die aktuelle Aktivität abdeckt. Wird zum Speichern von Daten und zum Stoppen von Animationen, Musik usw. verwendet.
  5. onStop(): Wird aufgerufen, wenn die Aktivität nicht mehr sichtbar ist, und dient zum Speichern von Daten und zum Freigeben von Ressourcen.
  6. onDestroy(): Wird aufgerufen, wenn die Aktivität zerstört wird, und wird verwendet, um alle Ressourcen freizugeben und die Registrierung aller Listener aufzuheben.
  7. onRestart(): Wird aufgerufen, wenn die Aktivität von unsichtbar zu sichtbar wechselt, aufgerufen nach onStop().

Es gibt viele Situationen im Lebenszyklus einer Aktivität. Wenn jeder Status auftritt, müssen Entwickler eine Reihe von Rückrufmethoden verarbeiten.

Die Aktivität tritt automatisch in die Lebenszyklussituation onDestroy ein

  1. Wenn der Benutzer die Aktivität aktiv zerstört, z. B. durch Drücken der Eingabetaste oder Aufrufen der Methode „finish()“.
  2. Wenn das System eine Aktivität aufgrund von unzureichendem Speicher zerstört, zerstört das System die Aktivität entsprechend einer bestimmten Priorität und die Aktivität mit einer niedrigeren Priorität wird zuerst zerstört.
  3. Wenn sich die Konfiguration ändert, z. B. Bildschirmdrehung oder Sprachwechsel, zerstört das System die aktuelle Aktivität und erstellt eine neue Aktivitätsinstanz.

Die Aktivitätspriorität ist in drei Ebenen unterteilt

  1. Vordergrundaktivität – Interaktion mit dem Benutzer
  2. Sichtbar, aber nicht die Vordergrundaktivität – es wird beispielsweise ein Dialogfeld angezeigt, das dazu führt, dass die Aktivität sichtbar, aber nicht mit dem Benutzer interaktiv ist
  3. Hintergrundaktivität – Aktivität, die angehalten wurde, z. B. onStop, wird mit der niedrigsten Priorität ausgeführt

Wenn nicht genügend Speicher vorhanden ist, wird der Prozess, in dem sich die Aktivität befindet, mit dieser Priorität abgebrochen. Prozesse ohne die vier Hauptkomponenten können leicht abgebrochen werden.

Aktivitätslebenszyklus unter ungewöhnlichen Umständen

Aktivitätslebenszyklus, wenn Android zwischen horizontalen und vertikalen Bildschirmen wechselt
Antwort: Wenn der Bildschirm eines Android-Geräts von horizontal zu vertikal oder von vertikal zu horizontal wechselt, durchläuft der Aktivitätslebenszyklus den folgenden Prozess:

  1. onPause(): Bevor der Bildschirm gedreht wird, ruft das System die onPause()-Methode der aktuellen Aktivität auf. Dies weist darauf hin, dass die Aktivität den Fokus verliert und kurz davor steht, in den Stoppzustand überzugehen.
  2. onSaveInstanceState(): Bevor der Bildschirm gedreht wird, ruft das System die onSaveInstanceState()-Methode der aktuellen Aktivität auf, um die Statusinformationen der Aktivität zu speichern. Mit dieser Methode können Sie die erforderlichen Daten speichern, um sie nach der Neuerstellung der Aktivität wiederherzustellen.

Wenn Sie beim Wechsel zwischen horizontalen und vertikalen Bildschirmen keine Daten speichern möchten , können Sie den entsprechenden Tags in der Aktivitätsmanifestdatei Attribute hinzufügen android:configChangesund angeben, welche Konfigurationsänderungen ignoriert werden sollen. Sie können beispielsweise Ausrichtung und Bildschirmgröße hinzufügen, um den Wechsel zwischen Quer- und Hochformat zu ignorieren

  1. onStop(): Wenn die Bildschirmdrehung abgeschlossen ist und das neue Layout geladen wurde, ruft das System die onStop()-Methode der aktuellen Aktivität auf. Zu diesem Zeitpunkt ist die Aktivität völlig unsichtbar.
  2. onDestroy(): Wenn die Bildschirmdrehung dazu führt, dass die aktuelle Aktivität zerstört und neu erstellt wird, ruft das System die onDestroy()-Methode der aktuellen Aktivität auf. Mit dieser Methode können Sie Ressourcen freigeben und Bereinigungsvorgänge durchführen.
  3. onCreate(): Wenn die Bildschirmdrehung dazu führt, dass die Aktivität neu erstellt wird, ruft das System die onCreate()-Methode der aktuellen Aktivität auf. Mit dieser Methode können Sie die Benutzeroberfläche neu initialisieren und zuvor gespeicherte Daten wiederherstellen.
  4. onStart(): Nachdem der Bildschirm gedreht wurde, ruft das System die onStart()-Methode der aktuellen Aktivität auf. Zu diesem Zeitpunkt ist die Aktivität sichtbar, hat aber noch keinen Fokus erhalten.
  5. onResume(): Abschließend ruft das System die onResume()-Methode der aktuellen Aktivität auf. Mit dieser Methode können Sie Ihre vorherigen Aktionen fortsetzen und beginnen, auf Benutzerinteraktionen zu reagieren.

Wenn der Bildschirm gedreht wird, wird die Aktivität zerstört und neu erstellt. Daher muss die Logik der Datenspeicherung und -wiederherstellung angemessen gehandhabt werden, um die Kontinuität des Benutzererlebnisses sicherzustellen. onSaveInstanceState()Die Methode speichert und stellt die Statusinformationen der Aktivität wieder her und wird in onCreate() und Methoden onRestoreInstanceState()verarbeitet .

Aktivität vier Startmodi

  • Standard: Standardmodus (Systemstandardmodus). Wenn eine Aktivität gestartet wird, wird eine Instanz erstellt, unabhängig davon, ob die Instanz bereits vorhanden ist . Die Standardaktivität wird standardmäßig in den Arbeitsstapel der Aktivität eingegeben, die sie gestartet hat (wenn AktivitätA AktivitätB startet (Standardmodus), tritt AktivitätB in den Arbeitsstapel von AktivitätA ein.)
  • SingleTop: Wiederverwendungsmodus der obersten Ebene des Stapels. Wenn sich diese Aktivität oben auf dem Stapel befindet, wird keine neue Instanz erstellt und ihre onNewIntent-Methode wird zurückgerufen. Mit diesem Parameter können die aktuell angeforderten Informationen abgerufen werden. Wenn sich diese Aktivität jedoch nicht oben im Stapel befindet, wird sie neu erstellt
  • SingleTask: Wiederverwendungsmodus im Stapel, Einzelinstanzmodus. Wenn für die Aktivität ein Aufgabenstapel erforderlich ist , prüfen Sie, ob die Aktivität im Stapel vorhanden ist. Wenn die Aktivität vorhanden ist, rufen Sie die Aktivität oben im Stapel auf. Wenn die Aktivität vorhanden ist nicht im Stapel vorhanden sind, erstellen Sie dann diese Aktivitätsinstanz und verschieben Sie sie auf den Stapel (der Standardwert ist der ClearTop-Effekt, der alle darüber liegenden Aktivitäten einblendet).
  • SingleIntance: Separater Instanzmodus, erweiterte Version des SingleTask-Modus. Aktivitäten in diesem Modus können nur in einem Arbeitsstapel vorhanden sein und es darf anschließend keine neue Aktivität erstellt werden.

Aktivität übergibt Daten

  • Aktivität sendet Daten:

Intent-Objekte können zum Übertragen von Daten zwischen Aktivitäten verwendet werden. Intent unterstützt die Übertragung mehrerer Datentypen, einschließlich grundlegender Datentypen und benutzerdefinierter Objekte. Hier ist ein Beispiel:

//在Activity A 中发送数据到 Activity B
Intent intent = new Intent(A.this, B.class);
intent.putExtra("key", "value"); //传递字符串数据
intent.putExtra("number", 200); //传递数字数据
Bundle bundle = new Bundle();
bundle.putBoolean("boolean", true); //传递布尔类型数据
intent.putExtras(bundle);
startActivity(intent);
  • Aktivität empfängt Daten:

Die Aktivität, die Daten empfängt, muss das Intent-Objekt durch Aufrufen der Methode getIntent () abrufen und dann die übergebenen Daten über die Methode getXXXExtra () abrufen. Hier ist ein Beispiel:

//在Activity B 中接收Activity A 传递过来的数据
Intent intent = getIntent();
String str = intent.getStringExtra("key"); //获取字符串数据
int num = intent.getIntExtra("number", 0); //获取数字数据,默认值为0
Bundle bundle = intent.getExtras();
boolean bool = bundle.getBoolean("boolean"); //获取布尔类型数据

Es ist zu beachten, dass Sie die Methode direkt aufrufen können, wenn Sie beim Starten der Zielaktivität kein Ergebnis zurückgeben müssen. startActivity(intent)Wenn Sie ein Ergebnis zurückgeben müssen, müssen Sie die Methode verwenden startActivityForResult(intent, requestCode)und die Methode in der Zielaktivität neu onActivityResult(requestCode, resultCode, data)schreiben Behandeln Sie das Rückgabeergebnis.

Übergeben Sie Daten zwischen Aktivität und Fragment

Um Daten zwischen Aktivität und Fragment zu übergeben, können Sie Bundle- oder Schnittstellenrückrufe verwenden.

  1. Verwenden Sie Bundle, um Daten zu übergeben:

In Aktivität:

Bundle bundle = new Bundle();
bundle.putString("key", "value");
Fragment fragment = new MyFragment();
fragment.setArguments(bundle);

Im Fragment:

String value = getArguments().getString("key");
  1. Verwenden Sie Schnittstellenrückrufe, um Daten zu übergeben:

Definieren Sie die Schnittstelle in Aktivität:

public interface OnDataReceivedListener {
    
    
    void onDataReceived(String data);
}

Im Fragment:

private OnDataReceivedListener listener;

@Override
public void onAttach(Context context) {
    
    
    super.onAttach(context);
    if (context instanceof OnDataReceivedListener) {
    
    
        listener = (OnDataReceivedListener) context;
    } else {
    
    
        throw new RuntimeException(context.toString()
                + " must implement OnDataReceivedListener");
    }
}

@Override
public void onDetach() {
    
    
    super.onDetach();
    listener = null;
}

private void sendData() {
    
    
    listener.onDataReceived("Data");
}

Implementieren Sie die OnDataReceivedListener-Schnittstelle in Activity:

public class MainActivity extends AppCompatActivity implements MyFragment.OnDataReceivedListener {
    
    

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

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.container, new MyFragment());
        fragmentTransaction.commit();
    }

    @Override
    public void onDataReceived(String data) {
    
    
        Log.d("MainActivity", "Data received: " + data);
    }
}

Guess you like

Origin blog.csdn.net/weixin_74239923/article/details/134417539