Sobes.tech
Junior

Wie erfolgt die Navigation zwischen Activities in Android?

sobes.tech KI

Antwort von AI

Die Navigation zwischen Activities erfolgt mittels Intent.

Ein Intent ist ein Nachrichtenobjekt, das es Komponenten (wie Activities, Services, Broadcast Receivers) ermöglicht, Aktionen gegenseitig anzufordern.

Es gibt zwei Haupttypen von Intents:

  • Explizite Intents: Geben eine konkrete Komponente zum Starten an (z.B. die Klasse Activity).
  • Implizite Intents: Geben die Art der auszuführenden Aktion an (z.B. eine Webseite anzeigen), und das Android-System wählt die passende Komponente aus.

Um eine neue Activity mit einem expliziten Intent zu starten, verwendet man die Methode startActivity().

// In der aktuellen Activity
val intent = Intent(this, TargetActivity::class.java) // Expliziter Intent
startActivity(intent)

Daten zwischen Activities können mit der Methode putExtra() des Intent-Objekts übertragen werden:

// Daten senden
val intent = Intent(this, TargetActivity::class.java)
intent.putExtra("key_name", "some_value")
startActivity(intent)

// Daten in TargetActivity empfangen (in onCreate() oder onNewIntent())
val data = intent.getStringExtra("key_name")

Um das Ergebnis einer gestarteten Activity zu erhalten, verwendet man startActivityForResult(). Nach Abschluss der Kind-Activity kann sie das Ergebnis mit setResult() und finish() zurücksenden. Die Eltern-Activity erhält dieses Ergebnis in onActivityResult().

// In der Eltern-Activity
val intent = Intent(this, ChildActivity::class.java)
startActivityForResult(intent, REQUEST_CODE) // REQUEST_CODE ist ein eindeutiger Bezeichner

// Ergebnis in der Eltern-Activity empfangen
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        val resultData = data?.getStringExtra("result_key")
        // Ergebnis verarbeiten
    }
}

// In der Kind-Activity (vor dem Schließen)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

Ab AndroidX wird empfohlen, die Activity Results API anstelle von startActivityForResult()/onActivityResult() zu verwenden:

// In der Eltern-Activity
private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data = result.data
        // Ergebnis verarbeiten
    }
}

// Activity starten
val intent = Intent(this, ChildActivity::class.java)
startForResult.launch(intent)

// In der Kind-Activity (vor dem Schließen)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

Für komplexere Navigationsszenarien in modernen Android-Anwendungen wird häufig das Navigation-Komponentensystem von Jetpack verwendet:

  • Navigation Component: Ermöglicht die Definition eines Navigationsgraphen, der alle möglichen Wege zwischen den Bildschirmen der App beschreibt. Verwendet NavController zur Steuerung der Navigation.
<!-- Beispiel nav_graph.xml -->
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/mobile_navigation"
    app:startDestination="@+id/firstFragment">

    <fragment
        android:id="@+id/firstFragment"
        android:name="com.example.app.FirstFragment"
        android:label="First" >
        <action
            android:id="@+id/action_firstFragment_to_secondFragment"
            app:destination="@id/secondFragment" />
    </fragment>
    <fragment
        android:id="@+id/secondFragment"
        android:name="com.example.app.SecondFragment"
        android:label="Second" />
</navigation>
// In der Activity (z.B. in einem Fragment)
findNavController().navigate(R.id.action_firstFragment_to_secondFragment)

Der Navigation-Component vereinfacht die Implementierung der Navigation, inklusive Argumentenübergabe, Dialogunterstützung und Back-Stack-Management.