📌  相关文章
📜  了解 Activity 生命周期以在 Android 中按下后保留 UI 数据

📅  最后修改于: 2022-05-13 01:54:29.908000             🧑  作者: Mango

了解 Activity 生命周期以在 Android 中按下后保留 UI 数据

Android 中的 onBackPressed() 是什么?

这是当用户按下 Android 设备上的后退按钮时调用的覆盖函数。它对应用程序的活动生命周期有很大的影响。官方文档指出,当活动检测到用户按下后退键时,将调用 onBackPressed() 方法。默认实现只是完成当前活动,但您可以覆盖它以执行您想要的任何操作。

因此,通过本文,我们将向您展示如何覆盖此方法并保留活动数据。但在此之前,有必要了解一下Android中的Activity Lifecycle。参考这篇文章更好地理解Android中的Activity Lifecycle:Android Activity Lifecycle with Demo App。

本文分为4个部分:

  1. 创建模板代码以了解导航键事件和链接的 Activity Lifecycle 方法(了解 Activity Lifecycle 的请跳过)
  2. 覆盖后压方法
  3. 测试编辑文本
  4. 测试文本视图

1.创建模板代码,了解导航键事件和链接的Activity生命周期方法

第 1 步:在 Android Studio 中创建一个新项目

要在 Android Studio 中创建新项目,请参阅如何在 Android Studio 中创建/启动新项目。我们在 Kotlin 中演示了该应用程序,因此请确保在创建新项目时选择Kotlin作为主要语言。



第二步:覆盖Activity Lifecycle中的所有方法

我们在每个方法中都实现了 Toast 消息,以了解在 Activity Lifecycle 期间调用哪个方法。现在只需在设备或模拟器上运行项目。

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()
    }
}


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()
    }
}


XML


  
    
  


XML


  
    
  
    


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(R.id.tv1)
        val btn1 = findViewById


第 3 步:运行程序

  1. 应用程序启动时: onCreate、onStart、onResume
  2. 按下应用概览按钮时: onPause、onStop
  3. 按下主页按钮时: onPause、onStop
  4. 按下后退按钮时: onPause、onStop、onDestroy

输出:

观察:

我们可以看到,除了后退之外,在任何情况下,活动都停止了。基本上,它不会被破坏,数据会被保留。但是,当按下后退按钮时,活动被破坏,这意味着在此调用期间临时数据丢失。这是官方文档所说的。

但我们不想丢失这些数据。为了保留数据,我们需要重写 backpressed 方法。反压方法本质上会破坏活动。我们将以这样一种方式进行更改,即活动将停止但不会破坏。继续阅读。



2. 覆盖 on backpressed 方法

请阅读代码中的注释。

科特林

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()
    }
}

输出:

现在我们可以观察到,在回按时,活动将停止但不会破坏。我们现在将实现一些 UI 来测试这是否真的有效。继续阅读。

3. 测试 EditText

第一步:在布局文件(activity_main.xml)中添加EditText

XML



  
    
  

为了测试 EditText,我们不需要在主代码中编写任何代码,而不需要在前面(覆盖背面按下方法)代码中指定的内容。

输入:

在 EditText 中输入任何内容,然后按后退按钮。返回应用程序,您会注意到文本保留在 EditText 栏中。

输出:



EditText 中的文本被保留。这意味着我们的方法工作正常。我们现在将在 TextView 上测试它。继续阅读。

4. 测试 TextView

第一步:在布局文件(activity_main.xml)中添加一个TextView和一个Button

XML



  
    
  
    

第 2 步:通过主代码 (MainActivity.kt) 为这些元素添加功能

科特林

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(R.id.tv1)
        val btn1 = findViewById

输入:

继续点击按钮,TextView 中的数字会不断增加。现在尝试后退按钮并再次打开应用程序。文本保留在 TextView 中。

输出:

我们的方法工作得很好。现在在您的代码中使用此方法来保留活动数据。

想要一个更快节奏和更具竞争力的环境来学习 Android 的基础知识吗?
单击此处前往由我们的专家精心策划的指南,旨在让您立即做好行业准备!