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
NavControllerpara 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.