Intents en Kotlin
Qué es un intent?
Los intents: tipos y ejemplos (punto 7 de la unidad 2)
Ejemplo de intent implícito
// Create the text message with a string
val sendIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, textMessage)
type = "text/plain"
}
// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(packageManager) != null) {
startActivity(sendIntent)
}
Forzar un selector de apps:
val sendIntent = Intent(Intent.ACTION_SEND)
...
// Always use string resources for UI text.
// This says something like "Share this photo with"
val title: String = resources.getString(R.string.chooser_title)
// Create intent to show the chooser dialog
val chooser: Intent = Intent.createChooser(sendIntent, title)
// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(packageManager) != null) {
startActivity(chooser)
}
intent.resolveActivity returns null in API 30
Package visibility in Android 11
Ejemplo: Intents implíctos y explícitos
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/intents"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.046" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="26dp"
android:text="Navegador"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:layout_constraintVertical_bias="0.005" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="Mapa"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button1" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="Teléfono"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button2" />
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:ems="10"
android:inputType="textPersonName"
android:text="Pepe"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button3" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Saludar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editText" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="28dp"
android:text="Respuesta"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button4" />
</androidx.constraintlayout.widget.ConstraintLayout>
activity_second.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SecondActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:text="@string/nombre"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="92dp"
android:text="@string/volver"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:layout_constraintVertical_bias="0.002" />
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:ems="10"
android:inputType="textPersonName"
android:text="@string/adios"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
build.gradle
buildFeatures {
viewBinding = true
}
MainActivity.kt
package com.example.intentskotlin
import android.content.ActivityNotFoundException
import android.content.Intent
import android.content.Intent.ACTION_VIEW
import android.content.Intent.CATEGORY_BROWSABLE
import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import com.example.intentskotlin.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity(), View.OnClickListener {
private lateinit var binding: ActivityMainBinding
private lateinit var launcher: ActivityResultLauncher<Intent>
var code = 1
companion object {
const val RESULTADO = "resultado"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
binding = ActivityMainBinding.inflate(layoutInflater)
val view: View = binding.root
setContentView(view)
binding.button1.setOnClickListener(this)
binding.button2.setOnClickListener(this)
binding.button3.setOnClickListener(this)
binding.button4.setOnClickListener(this)
binding.button5.setOnClickListener(this)
launcher = registerForActivityResult<Intent, ActivityResult>(
ActivityResultContracts.StartActivityForResult()
) { result: ActivityResult ->
if (result.resultCode == RESULT_OK) {
val data = result.data
binding.editText.setText("Respuesta: " + data!!.getStringExtra(RESULTADO))
}
}
}
override fun onClick(view: View) {
lateinit var intent: Intent
if (view === binding.button1) {
//ACTION_VIEW. Abrir el navegador con una URL indicada como dato
val link = "https://kotlin.org"
openWebPage(link)
}
if (view === binding.button2) {
//ACTION_VIEW. Muestra dirección en mapa indicada como dato
// (El emulador o AVD en el que se pruebe debe incluir las API de Google)
val dir = "Calle+Larios+Malaga"
showMap(Uri.parse("geo:0,0?q=$dir"))
}
if (view === binding.button3) {
// ACTION_DIAL.Marca el número de teléfono indicado como dato.
val phoneNumber: String = "951297929"
call(phoneNumber)
}
if (view === binding.button4) {
intent = Intent(this, SecondActivity::class.java)
val extras = Bundle()
extras.putString("usuario", binding.editText.text.toString())
extras.putInt("edad", 27)
intent.putExtras(extras)
startActivity(intent)
}
if (view === binding.button5) {
intent = Intent(this, SecondActivity::class.java)
val extras = Bundle()
extras.putString("usuario", binding.editText.text.toString())
extras.putInt("edad", 27)
intent.putExtras(extras)
// startActivityForResult(intent, code)
launcher.launch(intent)
}
}
fun openWebPage(url: String) {
val webPage: Uri = Uri.parse(url)
/*
val intent = Intent(Intent.ACTION_VIEW, webpage)
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
} else {
Toast.makeText(this, "Error al lanzar el intent del navegador", Toast.LENGTH_SHORT).show()
}
*/
try {
val browserIntent = Intent()
.setAction(ACTION_VIEW)
.addCategory(CATEGORY_BROWSABLE)
.setData(webPage)
startActivity(browserIntent)
} catch (e: ActivityNotFoundException) {
Toast.makeText(this,"Error al lanzar el intent del navegador " + e.message.toString(),Toast.LENGTH_SHORT)
.show()
Log.e("Error", e.message.toString())
}
}
fun showMap(geoLocation: Uri) {
try {
val intent = Intent()
.setAction(Intent.ACTION_VIEW)
.setData(geoLocation)
startActivity(intent)
} catch (e: ActivityNotFoundException) {
Toast.makeText(this, "Error al lanzar el intent del mapa " + e.message.toString(), Toast.LENGTH_SHORT)
.show()
Log.e("Error", e.message.toString())
}
}
fun call(phoneNumber: String) {
val dialIntent = Intent(Intent.ACTION_DIAL)
dialIntent.data = Uri.parse("tel:$phoneNumber")
if (intent.resolveActivity(packageManager) != null) {
startActivity(dialIntent)
} else {
Toast.makeText(this, "Error al lanzar el intent del teléfono", Toast.LENGTH_SHORT)
.show()
}
}
/*
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == code && resultCode == RESULT_OK) {
val res = data!!.extras!!.getString(RESULTADO)
binding.editText.setText("Respuesta: " + res)
}
}
*/
}
SecondActivity.kt
package com.example.intentskotlin
import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.example.intentskotlin.databinding.ActivitySecondBinding
class SecondActivity : AppCompatActivity(), View.OnClickListener {
private lateinit var binding: ActivitySecondBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
binding = ActivitySecondBinding.inflate(layoutInflater)
val view: View = binding.root
setContentView(view)
binding.button.setOnClickListener(this)
val extras = intent.extras
//recupera el valor asociado a “usuario”
val str = extras!!.getString("usuario")
//recupera el valor asociado a “edad”
val edad = extras!!.getInt("edad")
binding.textView.text = "Hola: $str, $edad"
}
override fun onClick(view: View) {
if (view === binding.button) {
val intent = Intent()
intent.putExtra(MainActivity.RESULTADO, binding.editText.text.toString())
setResult(RESULT_OK, intent)
finish()
}
}
}
Ejercicio 2 de la tarea online
Más información:

Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.