Sobes.tech
Junior

Ako sa vykonáva navigácia medzi Activities v Android?

sobes.tech AI

Odpoveď od AI

Navigácia medzi Activity sa vykonáva pomocou Intent.

Intent je objekt na výmenu správ, ktorý umožňuje komponentom (napríklad Activity, Services, Broadcast Receivers) požadovať akcie od seba navzájom.

Existujú dva hlavné typy Intentov:

  • Priame Intent: ukazujú na konkrétnu komponentu na spustenie (napríklad trieda Activity).
  • Nepriame Intent: ukazujú na typ akcie, ktorú je potrebné vykonať (napríklad zobraziť webovú stránku), a systém Android vyberie vhodnú komponentu na jej vykonanie.

Na spustenie novej Activity pomocou priameho Intentu sa používa metóda startActivity().

// V aktuálnej Activity
val intent = Intent(this, TargetActivity::class.java) // Priamy Intent
startActivity(intent)

Na prenos dát medzi Activity môžete použiť metódu putExtra() objektu Intent:

// Odoslanie dát
val intent = Intent(this, TargetActivity::class.java)
intent.putExtra("key_name", "some_value")
startActivity(intent)

// Prijatie dát v TargetActivity (v metóde onCreate() alebo onNewIntent())
val data = intent.getStringExtra("key_name")

Na získanie výsledku z Activity, ktorá bola spustená, sa používa startActivityForResult(). Po ukončení detskej Activity môže tá poslať výsledok späť pomocou setResult() a finish(). Rodičovská Activity tento výsledok získa v metóde onActivityResult().

// V rodičovskej Activity
val intent = Intent(this, ChildActivity::class.java)
startActivityForResult(intent, REQUEST_CODE) // REQUEST_CODE je jedinečný identifikátor

// Získanie výsledku
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")
        // Spracovanie výsledku
    }
}

// V detskej Activity (pred zatvorením)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

Od AndroidX sa odporúča používať API pre výsledky Activity namiesto startActivityForResult()/onActivityResult():

// V rodičovskej Activity
private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data = result.data
        // Spracovanie výsledku
    }
}

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

// V detskej Activity (pred zatvorením)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

Tiež sa často používa komponenta Navigation z Jetpacku pre zložitejšiu navigáciu v moderných Android aplikáciách:

  • Navigation Component: umožňuje definovať navigačný graf, ktorý opisuje všetky možné cesty medzi obrazovkami aplikácie. Používa NavController na riadenie pohybu po grafe.
<!-- Príklad 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>
// V Activity (napríklad v Fragment)
findNavController().navigate(R.id.action_firstFragment_to_secondFragment)

Navigation Component zjednodušuje implementáciu navigácie, vrátane prenosu argumentov, podpory dialógových okien a správy back stacku.