Sobes.tech
Junior

Comment la navigation entre Activities est-elle effectuée dans Android?

sobes.tech IA

Réponse de l'IA

La navigation entre Activities se realiza mediante Intent.

Intent es un objeto de intercambio de mensajes que permite a los componentes (como Activities, Services, Broadcast Receivers) solicitar acciones entre sí.

Existen dos tipos principales de Intent:

  • Intents explícitos: Especifican un componente concreto para iniciar (por ejemplo, la clase Activity).
  • Intents implícitos: Indican el tipo de acción a realizar (por ejemplo, ver una página web), y el sistema Android selecciona el componente adecuado para realizarla.

Para iniciar una nueva Activity con un Intent explícito, se usa el método startActivity().

// En la Activity actual
val intent = Intent(this, TargetActivity::class.java) // Intent explícito
startActivity(intent)

Para pasar datos entre Activities, se puede usar el método putExtra() del objeto Intent:

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

// Recibir datos en TargetActivity (en el método onCreate() o en onNewIntent())
val data = intent.getStringExtra("key_name")

Para obtener el resultado de una Activity lanzada, en lugar de simplemente iniciarla, se usa startActivityForResult(). Tras finalizar la Activity hija, puede enviar el resultado de vuelta usando setResult() y finish(). La Activity padre recibe este resultado en onActivityResult().

// En la Activity padre
val intent = Intent(this, ChildActivity::class.java)
startActivityForResult(intent, REQUEST_CODE) // REQUEST_CODE es un identificador único

// Recibir el resultado en la Activity padre
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")
        // Procesar el resultado
    }
}

// En la Activity hija (antes de cerrar)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

Desde AndroidX, se recomienda usar la API de Resultados de Activity en lugar de startActivityForResult()/onActivityResult():

// En la Activity padre
private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data = result.data
        // Procesar el resultado
    }
}

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

// En la Activity hija (antes de cerrar)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

También, para una navegación más compleja en aplicaciones Android modernas, se suele usar el componente Navigation de Jetpack:

  • Componente de Navegación: Permite definir un gráfico de navegación que describe todos los posibles caminos entre las pantallas de la aplicación. Usa NavController para gestionar la navegación.
<!-- Ejemplo de 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>
// En la Activity (por ejemplo, en un Fragment)
findNavController().navigate(R.id.action_firstFragment_to_secondFragment)

El componente de Navegación simplifica la implementación de la navegación, incluyendo la transferencia de argumentos, soporte para diálogos y gestión de la pila de retroceso.