Comprender el ciclo de vida de la actividad para retener los datos de la interfaz de usuario cuando se presiona hacia atrás en Android

¿Qué es onBackPressed() en Android?

Esta es una función de anulación que se llama cuando el usuario presiona el botón Atrás en un dispositivo Android. Tiene grandes implicaciones en el ciclo de vida de la actividad de la aplicación. La documentación oficial establece que se llama al método onBackPressed() cuando la actividad ha detectado que el usuario presionó la tecla Atrás. La implementación predeterminada simplemente finaliza la actividad actual, pero puede anular esto para hacer lo que quiera.

Entonces, a través de este artículo, le mostraremos cómo puede anular este método y retener los datos de actividad. Pero antes de eso, es necesario comprender el ciclo de vida de la actividad en Android. Consulte este artículo para comprender mejor el Ciclo de vida de la actividad en Android: Ciclo de vida de la actividad en Android con la aplicación de demostración .

Este artículo tiene 4 partes:

  1. Cree un código de plantilla para comprender los eventos clave de navegación y los métodos vinculados del ciclo de vida de la actividad (omita si conoce el ciclo de vida de la actividad)
  2. Anular el método de pulsado en la parte posterior
  3. Probando Editar Texto
  4. Prueba de vista de texto

1. Cree un código de plantilla para comprender los eventos clave de navegación y los métodos vinculados del ciclo de vida de la actividad

Paso 1: crea un nuevo proyecto en Android Studio

Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Demostramos la aplicación en Kotlin, así que asegúrese de seleccionar Kotlin como idioma principal al crear un nuevo proyecto.

Paso 2: anular todos los métodos en el ciclo de vida de la actividad

Implementamos un mensaje Toast en cada método para comprender qué método se llama durante el ciclo de vida de la actividad. Ahora simplemente ejecuta el proyecto en un dispositivo o un emulador.

Kotlin

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        Toast.makeText(applicationContext, "onCreate", Toast.LENGTH_SHORT).show()
          
        }
    }
  
    override fun onPause() {
        super.onPause()
        Toast.makeText(applicationContext, "onPause", Toast.LENGTH_SHORT).show()
    }
  
    override fun onStop() {
        super.onStop()
        Toast.makeText(applicationContext, "onStop", Toast.LENGTH_SHORT).show()
    }
  
    override fun onDestroy() {
        super.onDestroy()
        Toast.makeText(applicationContext, "onDestroy", Toast.LENGTH_SHORT).show()
    }
  
    override fun onRestart() {
        super.onRestart()
        Toast.makeText(applicationContext, "onRestart", Toast.LENGTH_SHORT).show()
    }
  
    override fun onStart() {
        super.onStart()
        Toast.makeText(applicationContext, "onStart", Toast.LENGTH_SHORT).show()
    }
  
    override fun onResume() {
        super.onResume()
        Toast.makeText(applicationContext, "onResume", Toast.LENGTH_SHORT).show()
    }
}

Paso 3: Ejecute el programa

  1. Cuando se inicia la aplicación: onCreate, onStart, onResume
  2. Cuando se presiona el botón de descripción general de la aplicación: onPause, onStop
  3. Cuando se presiona el botón de inicio: onPause, onStop
  4. Cuando se presiona el botón Atrás: onPause, onStop, onDestroy

Producción:

Observación:

Podemos ver que en cualquier caso que no sea la pulsación trasera, la actividad se detiene. Básicamente, no se destruye y los datos se conservan. Sin embargo, cuando se presiona el botón Atrás, la actividad se destruye, lo que significa que los datos temporales se pierden durante esta llamada. Esto es lo que dice la documentación oficial.

Pero no queremos perder estos datos. Para retener los datos, necesitamos anular el método de pulsación hacia atrás. El método presionado hacia atrás por naturaleza destruye la actividad. Haremos cambios de tal manera que la actividad se detenga pero no se destruya. Sigue leyendo.

2. Anule el método de pulsado en la parte posterior

Por favor, lea los comentarios en el código.

Kotlin

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        Toast.makeText(applicationContext, "onCreate", Toast.LENGTH_SHORT).show()
    }
  
    // Overriding onBackPressed method
    override fun onBackPressed() {
        
        // Implement this method to stop
        // the activity and go back
        this.moveTaskToBack(true)
    }
  
    override fun onPause() {
        super.onPause()
        Toast.makeText(applicationContext, "onPause", Toast.LENGTH_SHORT).show()
    }
  
    override fun onStop() {
        super.onStop()
        Toast.makeText(applicationContext, "onStop", Toast.LENGTH_SHORT).show()
    }
  
    override fun onDestroy() {
        super.onDestroy()
        Toast.makeText(applicationContext, "onDestroy", Toast.LENGTH_SHORT).show()
    }
  
    override fun onRestart() {
        super.onRestart()
        Toast.makeText(applicationContext, "onRestart", Toast.LENGTH_SHORT).show()
    }
  
    override fun onStart() {
        super.onStart()
        Toast.makeText(applicationContext, "onStart", Toast.LENGTH_SHORT).show()
    }
  
    override fun onResume() {
        super.onResume()
        Toast.makeText(applicationContext, "onResume", Toast.LENGTH_SHORT).show()
    }
}

Producción:

Ahora podemos observar que en la pulsación trasera, la actividad se detendrá pero no destruirá. Ahora implementaremos alguna interfaz de usuario para probar si esto realmente funciona. Sigue leyendo.

3. Probando EditText

Paso 1: agregue EditText en el archivo de diseño (actividad_principal.xml)

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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">
  
    <EditText
    android:id="@+id/et1"
    android:layout_width="match_parent"
    android:layout_height="50sp"
    android:textSize="25sp"
    android:inputType="text"
    android:layout_centerInParent="true"/>
  
</RelativeLayout>

Para probar EditText, no necesitamos codificar nada en el código principal que no sea lo que se especifica en el código anterior (Anular el método presionado en la parte posterior).

Aporte:

Escriba cualquier cosa en EditText y presione el botón Atrás. Regrese a la aplicación y notará que el texto se retiene en la barra EditText.

Producción:

El texto en EditText se conserva. Esto significa que nuestro método funciona bien. Ahora lo probaremos en un TextView. Sigue leyendo.

4. Prueba de vista de texto

Paso 1: agregue una vista de texto y un botón en el archivo de diseño (actividad_principal.xml)

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    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/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click the button"
        android:textSize="40sp"
        android:layout_centerInParent="true"/>
  
    <Button
        android:id="@+id/btn1"
        android:layout_below="@id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click"
        android:layout_centerHorizontal="true"/>
  
</RelativeLayout>

Paso 2: agregue funcionalidad a estos elementos a través del código principal (MainActivity.kt)

Kotlin

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
  
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        Toast.makeText(applicationContext, "onCreate", Toast.LENGTH_SHORT).show()
  
        // TextView and Button
        val tv1 = findViewById<TextView>(R.id.tv1)
        val btn1 = findViewById<Button>(R.id.btn1)
          
        // A code to increment a variable and 
        // display it on TextView on Button Click
        var k = 0
        btn1.setOnClickListener {
            tv1.text = k.toString()
            k++
        }
    }
  
    override fun onBackPressed() {
        this.moveTaskToBack(true)
    }
  
    override fun onPause() {
        super.onPause()
        Toast.makeText(applicationContext, "onPause", Toast.LENGTH_SHORT).show()
    }
  
    override fun onStop() {
        super.onStop()
        Toast.makeText(applicationContext, "onStop", Toast.LENGTH_SHORT).show()
    }
  
    override fun onDestroy() {
        super.onDestroy()
        Toast.makeText(applicationContext, "onDestroy", Toast.LENGTH_SHORT).show()
    }
  
    override fun onRestart() {
        super.onRestart()
        Toast.makeText(applicationContext, "onRestart", Toast.LENGTH_SHORT).show()
    }
  
    override fun onStart() {
        super.onStart()
        Toast.makeText(applicationContext, "onStart", Toast.LENGTH_SHORT).show()
    }
  
    override fun onResume() {
        super.onResume()
        Toast.makeText(applicationContext, "onResume", Toast.LENGTH_SHORT).show()
    }
}

Aporte:

Siga haciendo clic en el botón, el número en TextView seguirá aumentando. Ahora intente con el botón Atrás y abra la aplicación nuevamente. El texto se conserva en TextView.

Producción:

Nuestro método funciona perfectamente bien. Ahora use este método en sus códigos para retener los datos de actividad.

Publicación traducida automáticamente

Artículo escrito por aashaypawar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *