Sobes.tech
Junior

Como é feita a navegação entre Activities no Android?

sobes.tech IA

Resposta da IA

A navegação entre Activities é realizada através de Intent.

Intent é um objeto de troca de mensagens que permite aos componentes (como Activities, Services, Broadcast Receivers) solicitar ações uns aos outros.

Existem dois tipos principais de Intent:

  • Intents explícitos: Especificam um componente concreto para iniciar (por exemplo, a classe Activity).
  • Intents implícitos: Indicam o tipo de ação a realizar (por exemplo, ver uma página web), e o sistema Android escolhe o componente adequado para realizá-la.

Para iniciar uma nova Activity com um Intent explícito, usa-se o método startActivity().

// Na Activity atual
val intent = Intent(this, TargetActivity::class.java) // Intent explícito
startActivity(intent)

Para passar dados entre Activities, pode-se usar o método putExtra() do objeto Intent:

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

// Recebendo dados na TargetActivity (no método onCreate() ou onNewIntent())
val data = intent.getStringExtra("key_name")

Para obter o resultado de uma Activity lançada, em vez de apenas iniciá-la, usa-se startActivityForResult(). Após finalizar a Activity filha, ela pode enviar o resultado de volta usando setResult() e finish(). A Activity pai recebe esse resultado em onActivityResult().

// Na Activity pai
val intent = Intent(this, ChildActivity::class.java)
startActivityForResult(intent, REQUEST_CODE) // REQUEST_CODE é um identificador único

// Recebendo o resultado na Activity pai
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")
        // Processar o resultado
    }
}

// Na Activity filha (antes de fechar)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

Desde AndroidX, recomenda-se usar a API de Resultados de Activity em vez de startActivityForResult()/onActivityResult():

// Na Activity pai
private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data = result.data
        // Processar o resultado
    }
}

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

// Na Activity filha (antes de fechar)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

Também, para uma navegação mais complexa em aplicações Android modernas, costuma-se usar o componente Navigation do Jetpack:

  • Componente de Navegação: Permite definir um gráfico de navegação que descreve todos os caminhos possíveis entre as telas da aplicação. Usa NavController para gerenciar a navegação.
<!-- Exemplo 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>
// Na Activity (por exemplo, em um Fragment)
findNavController().navigate(R.id.action_firstFragment_to_secondFragment)

O componente de Navegação simplifica a implementação da navegação, incluindo a transferência de argumentos, suporte para diálogos e gerenciamento da pilha de retorno.