Sobes.tech
Junior

Hogyan történik a navigáció az Androidban az Activity-k között?

sobes.tech MI

Válasz az MI-től

Az Activity-k közötti navigáció Intent segítségével történik.

Az Intent egy üzenetcsere objektum, amely lehetővé teszi az összetevők (például Activity, Services, Broadcast Receivers) számára, hogy egymástól műveleteket kérjenek.

Két fő típusú Intent létezik:

  • Közvetlen Intentek: egy adott összetevőt jelölnek a futtatáshoz (például az Activity osztály).
  • Közvetett Intentek: a végrehajtandó művelet típusát jelölik (például weboldal megtekintése), és az Android rendszer kiválasztja a megfelelő összetevőt a végrehajtáshoz.

Az új Activity indításához közvetlen Intenttel a startActivity() metódus használható.

// A jelenlegi Activity-ben
val intent = Intent(this, TargetActivity::class.java) // Közvetlen Intent
startActivity(intent)

Az Activity-k közötti adatok átadásához az putExtra() metódus használható az Intent objektumon:

// Adatok küldése
val intent = Intent(this, TargetActivity::class.java)
intent.putExtra("key_name", "some_value")
startActivity(intent)

// Az adatok fogadása a TargetActivity-ben (az onCreate() vagy az onNewIntent() metódusban)
val data = intent.getStringExtra("key_name")

Az eredmény lekéréséhez egy már futó Activity-ből, nem csak az indításhoz, a startActivityForResult() használható. A gyermek Activity befejezése után eredményt küldhet vissza a setResult() és a finish() segítségével. A szülő Activity ezt az eredményt az onActivityResult() metódusban kapja meg.

// A szülő Activity-ben
val intent = Intent(this, ChildActivity::class.java)
startActivityForResult(intent, REQUEST_CODE) // REQUEST_CODE egyedi azonosító

// Eredmény fogadása
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")
        // Eredmény feldolgozása
    }
}

// A gyermek Activity-ben (az bezárás előtt)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

Az AndroidX-től kezdve ajánlott az Activity Results API használata a startActivityForResult()/onActivityResult() helyett:

// A szülő Activity-ben
private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data = result.data
        // Eredmény feldolgozása
    }
}

// Activity indítása
val intent = Intent(this, ChildActivity::class.java)
startForResult.launch(intent)

// A gyermek Activity-ben (az bezárás előtt)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

Továbbá, a modern Android alkalmazásokban gyakran használják a Jetpack Navigation komponensét a bonyolultabb navigációhoz:

  • Navigation Component: lehetővé teszi egy navigációs gráf meghatározását, amely leírja az alkalmazás összes lehetséges útját a képernyők között. A NavController segítségével irányítja a mozgást a gráfban.
<!-- Példa 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>
// Activity-ben (pl. Fragmentben)
findNavController().navigate(R.id.action_firstFragment_to_secondFragment)

A Navigation komponens egyszerűsíti a navigáció megvalósítását, beleértve az argumentumok átadását, a dialógusablakok támogatását és a visszalépési stack kezelését.