¿Qué es un Intent?
Un Intent es un mensaje que le mandás al sistema Android para que realice alguna acción. El caso más común: abrir otra Activity. Pero también podés usarlo para abrir una URL, hacer una llamada, compartir texto, y mucho más.
Hay dos tipos de Intents:
- Explícito: sabés exactamente qué componente querés abrir (ej: tu propia
DetalleActivity). - Implícito: describís qué querés hacer y el sistema elige qué app puede hacerlo (ej: "compartir este texto").
Intent explícito — navegar entre Activities
La forma más común de navegar dentro de tu propia app:
// En MainActivity, al hacer click en un botón:
binding.btnIrADetalle.setOnClickListener {
val intent = Intent(this, DetalleActivity::class.java)
startActivity(intent)
}
Intent(context, clase) construye un intent que apunta exactamente a DetalleActivity. El sistema la instancia y la muestra. Sencillo.
Pasando datos entre Activities
Para enviar datos usás extras — pares clave/valor que viajan con el Intent:
// Enviando datos
val intent = Intent(this, DetalleActivity::class.java).apply {
putExtra("USUARIO_ID", 42)
putExtra("USUARIO_NOMBRE", "Carlos")
}
startActivity(intent)
// Recibiendo en DetalleActivity, dentro de onCreate():
val usuarioId = intent.getIntExtra("USUARIO_ID", -1)
val nombre = intent.getStringExtra("USUARIO_NOMBRE")
TipPara evitar typos en las claves de extras, definílas como constantes en el companion object de la Activity destino: companion object { const val EXTRA_ID = "USUARIO_ID" }. Así la clave vive en un solo lugar.
Para objetos complejosSi necesitás pasar un objeto entero, hacé que implemente Parcelable o Serializable. El plugin kotlin-parcelize genera el código de Parcelable automáticamente con solo agregar @Parcelize.
Intent implícito
Usalos cuando querés delegar una acción al sistema o a otras apps:
// Abrir una URL en el navegador
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://pensa.ar"))
startActivity(intent)
// Hacer una llamada
val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:+5491112345678"))
startActivity(intent)
// Compartir texto
val intent = Intent(Intent.ACTION_SEND).apply {
type = "text/plain"
putExtra(Intent.EXTRA_TEXT, "¡Mirá este curso de Android!")
}
startActivity(Intent.createChooser(intent, "Compartir via"))
AtenciónEn Android 11+ (API 30+) necesitás declarar en el Manifest qué intents implícitos vas a usar con el tag <queries>, sino el sistema los bloquea por privacidad.
Esperando un resultado — Activity Result API
Si necesitás que la Activity destino te devuelva datos (ej: el usuario eligió una foto), usá la Activity Result API moderna:
// Registrá el launcher en la Activity (fuera de onCreate)
private val pickImageLauncher = registerForActivityResult(
ActivityResultContracts.GetContent()
) { uri: Uri? ->
// uri es la imagen elegida (puede ser null si el usuario canceló)
uri?.let {
binding.imgSeleccionada.setImageURI(it)
}
}
// Lanzalo desde donde lo necesites
binding.btnElegirFoto.setOnClickListener {
pickImageLauncher.launch("image/*")
}
Esta API reemplaza el viejo startActivityForResult()/onActivityResult(), que está deprecado desde Android 10.