了解 Activity 生命周期以在 Android 中按下后保留 UI 数据
Android 中的 onBackPressed() 是什么?
这是当用户按下 Android 设备上的后退按钮时调用的覆盖函数。它对应用程序的活动生命周期有很大的影响。官方文档指出,当活动检测到用户按下后退键时,将调用 onBackPressed() 方法。默认实现只是完成当前活动,但您可以覆盖它以执行您想要的任何操作。
因此,通过本文,我们将向您展示如何覆盖此方法并保留活动数据。但在此之前,有必要了解一下Android中的Activity Lifecycle。参考这篇文章更好地理解Android中的Activity Lifecycle:Android Activity Lifecycle with Demo App。
本文分为4个部分:
- 创建模板代码以了解导航键事件和链接的 Activity Lifecycle 方法(了解 Activity Lifecycle 的请跳过)
- 覆盖后压方法
- 测试编辑文本
- 测试文本视图
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 步:运行程序
- 应用程序启动时: onCreate、onStart、onResume
- 按下应用概览按钮时: onPause、onStop
- 按下主页按钮时: onPause、onStop
- 按下后退按钮时: 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 中。
输出:
我们的方法工作得很好。现在在您的代码中使用此方法来保留活动数据。