android
Android活动生命周期,如果是Android Developer访谈中最常被问到的问题之一。 它也是一个容易搞砸的人。
您必须已经从developer.android.com和许多android开发书籍中看到了此活动生命周期图。
但这还不够。 该图仅概述了活动生命周期回调序列(从创建到销毁)。 但是它并没有显示它在多个活动中的行为。
在这篇文章中,我们将通过实际创建应用程序并使用Log Statements来深入了解android活动的生命周期。 我们会将日志语句放入整个应用程序的生命周期方法中,以检查其行为。
这些是我们将要研究的活动生命周期回调:
- onCreate
- onStart
- onResume
- onSaveInstanceState
- 暂停
- onStop
- onDestroy
- onRestoreInstanceState
我们将进行两个活动: 1. ActivityA(MainActivity)2. ActivityB ,我们将在活动生命周期中探索以下情况。
- 启动ActivityA(在应用启动时)
- 从ActivityA开始ActivityB
- 从ActivityB向后按下(返回)到ActivityA
- 从ActivityA退回(退出应用程序)
- 在ActivityA中旋转手机(方向改变)
- 按下主页按钮
首先创建一个Android Studio项目。 在MainActivity.kt文件中,添加以下方法:
MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
var TAG = "AndroidVille"
override fun onCreate(savedInstanceState: Bundle?) {
super .onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "Activity A"
Log.d(TAG, "Activity A: onCreate" )
}
override fun onStart() {
super .onStart()
Log.d(TAG, "Activity A: onStart() " )
}
override fun onResume() {
super .onResume()
Log.d(TAG, "Activity A: onResume() " )
}
override fun onPause() {
super .onPause()
Log.d(TAG, "Activity A: onPause() " )
}
override fun onSaveInstanceState(outState: Bundle) {
outState.putString( "androidville" , "Hello there" )
super .onSaveInstanceState(outState)
Log.d(TAG, "Activity A: onSaveInstanceState() " )
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super .onRestoreInstanceState(savedInstanceState)
Log.d(TAG, "Activity A: onRestoreInstanceState() " )
}
override fun onRestart() {
super .onRestart()
Log.d(TAG, "Activity A: onRestart() " )
}
override fun onStop() {
super .onStop()
Log.d(TAG, "Activity A: onStop() " )
}
override fun onDestroy() {
super .onDestroy()
Log.d(TAG, "Activity A: onDestroy() " )
}
fun launchNewActivity(v: View) {
startActivity(Intent( this , ActivityB:: class .java))
}
现在创建另一个活动(ActivityB),并添加相同的方法,但是这次,在所有日志语句中将“ ActivityA”文本替换为“ ActivityB”。
package com.example.androidactivitylifecycle
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
class ActivityB : AppCompatActivity() {
var TAG = "AndroidVille"
override fun onCreate(savedInstanceState: Bundle?) {
super .onCreate(savedInstanceState)
setContentView(R.layout.activity_b)
title = "Activity B"
Log.d(TAG, "Activity B: onCreate" )
}
override fun onStart() {
super .onStart()
Log.d(TAG, "Activity B: onStart() " )
}
override fun onResume() {
super .onResume()
Log.d(TAG, "Activity B: onResume() " )
}
override fun onPause() {
super .onPause()
Log.d(TAG, "Activity B: onPause() " )
}
override fun onSaveInstanceState(outState: Bundle) {
outState.putString( "androidville" , "Hello there" )
super .onSaveInstanceState(outState)
Log.d(TAG, "Activity B: onSaveInstanceState() " )
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super .onRestoreInstanceState(savedInstanceState)
Log.d(TAG, "Activity B: onRestoreInstanceState() " )
}
override fun onRestart() {
super .onRestart()
Log.d(TAG, "Activity B: onRestart() " )
}
override fun onStop() {
super .onStop()
Log.d(TAG, "Activity B: onStop() " )
}
override fun onDestroy() {
super .onDestroy()
Log.d(TAG, "Activity B: onDestroy() " )
}
}
现在,我们将创建一个日志过滤器以仅关注我们的自定义日志语句。 为了这,
- 点击Android Studio底部的“ Logcat”标签。
- 然后,点击“ Regex”旁边的下拉菜单。 然后选择“编辑过滤器配置”
- 在弹出窗口中,输入过滤器的名称(任意输入)。 在“日志标签”中输入日志语句的标签。 它应该与活动中的TAG变量相同。 然后点击“确定”。
这将帮助您过滤掉不必要的日志语句,并专注于活动生命周期的语句。
通过此设置,我们准备好探索活动生命周期方法的调用顺序。 继续运行该应用程序,确保已打开并清理了logcat窗口。
应用启动时,这是回调序列:
- onCreate
- onStart
- onResume
首先,调用ActivityA的onCreate方法,该方法设置活动的布局。 然后是onStart ,它是设置诸如广播接收器之类的地方。 最后是当Activity是交互式时的onResume 。
这是有关android活动生命周期的最常见问题。 当一个活动在另一个活动之上启动时,回调方法是什么?
我不能足够强调这个问题的重要性,也不能让人误解。 因为它是如此简单,所以我常常犯这样的错误:先说ActivityA然后再说B的所有方法。
让我们看看这里发生了什么:
这是活动生命周期回调序列:
- onPause – ActivityA
- onCreate – ActivityB
- onStart – ActivityB
- onResume – ActivityB
- onStop – ActivityA
- onSaveInstanceState – ActivityA
首先,暂停ActivityA,然后调用ActivityB的生命周期方法。 但是最后,ActivityA停止了。
这里要注意的重要一点是,ActivityB在创建之后是停止的(不是销毁),并且是交互式的。
现在,当从ActivityB按下时,我们进入ActivityA,这是回调序列:
- onPause – ActivityB
- onRestart – ActivityA
- onStart – ActivityA
- onResume – ActivityA
- onStop – ActivityB
- onDestroy – ActivityB
在这里,我们看到最后,ActivityB被破坏了。 请注意,在A上启动B时,ActivityA并没有被破坏而是停止了,并且它的进程还在继续。
让我们看看当我们按下ActivityA(MainActivity)的后退按钮时会发生什么。
- onPause – ActivityA
- onStop – ActivityA
- onDestroy – ActivityA
由于ActivityA是最后一个活动,因此在按返回按钮时,应用程序退出并且ActivityA的进程被破坏。
这是这些问题中的另一个重要场景。 这个有点独特,它使用了onRestoreInstanceState。 我们将通过ActivityA旋转设备。
这是回调方法的调用顺序:
- onPause – ActivityA
- onStop – ActivityA
- onSaveInstanceState – ActivityA
- onDestroy – ActivityA
- onCreate – ActivityA
- onStart – ActivityA
- onRestoreInstanceState – ActivityA
- onResume – ActivityA
您可以从onRestoreInstanceState内部的onSaveInstanceState获取存储的键值对。
在ActivityA上按下主页按钮,您将获得以下回调序列:
- onPause – ActivityA
- onStop – ActivityA
- onSaveInstanceState – ActivityA
当您从暂停状态恢复时(通过按android上的“最近”按钮),以下是顺序:
- onRestart – ActivityA
- onStart – ActivityA
- onResume – ActivityA
因此,这些是Android活动生命周期中的一些场景。 让我知道您是否也要发布其他方案。 在接下来的文章中,我将尝试使用片段生命周期以及它们如何与活动生命周期一起工作。
翻译自: https://www.javacodegeeks.com/2020/08/android-activity-life-cycle-the-complete-guide.html
android