android_Android活动生命周期–完整指南

android

android

Android活动生命周期,如果是Android Developer访谈中最常被问到的问题之一。 它也是一个容易搞砸的人。

您必须已经从developer.android.com和许多android开发书籍中看到了此活动生命周期图。

资料来源:developer.android.com

但这还不够。 该图仅概述了活动生命周期回调序列(从创建到销毁)。 但是它并没有显示它在多个活动中的行为。

在这篇文章中,我们将通过实际创建应用程序并使用Log Statements来深入了解android活动的生命周期。 我们会将日志语句放入整个应用程序的生命周期方法中,以检查其行为。

这些是我们将要研究的活动生命周期回调:

  1. onCreate
  2. onStart
  3. onResume
  4. onSaveInstanceState
  5. 暂停
  6. onStop
  7. onDestroy
  8. onRestoreInstanceState

我们将进行两个活动: 1. ActivityA(MainActivity)2. ActivityB ,我们将在活动生命周期中探索以下情况。

  1. 启动ActivityA(在应用启动时)
  2. 从ActivityA开始ActivityB
  3. 从ActivityB向后按下(返回)到ActivityA
  4. 从ActivityA退回(退出应用程序)
  5. 在ActivityA中旋转手机(方向改变)
  6. 按下主页按钮

首先创建一个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() " )

    }
 }

现在,我们将创建一个日志过滤器以仅关注我们的自定义日志语句。 为了这,

  1. 点击Android Studio底部的“ Logcat”标签。
  2. 然后,点击“ Regex”旁边的下拉菜单。 然后选择“编辑过滤器配置”
  3. 在弹出窗口中,输入过滤器的名称(任意输入)。 在“日志标签”中输入日志语句的标签。 它应该与活动中的TAG变量相同。 然后点击“确定”。

这将帮助您过滤掉不必要的日志语句,并专注于活动生命周期的语句。

通过此设置,我们准备好探索活动生命周期方法的调用顺序。 继续运行该应用程序,确保已打开并清理了logcat窗口。

应用启动时,这是回调序列:

  1. onCreate
  2. onStart
  3. onResume

首先,调用ActivityA的onCreate方法,该方法设置活动的布局。 然后是onStart ,它是设置诸如广播接收器之类的地方。 最后是当Activity是交互式时的onResume

这是有关android活动生命周期的最常见问题 当一个活动在另一个活动之上启动时,回调方法是什么?

我不能足够强调这个问题的重要性,也不能让人误解。 因为它是如此简单,所以我常常犯这样的错误:先说ActivityA然后再说B的所有方法。

让我们看看这里发生了什么:

这是活动生命周期回调序列:

  1. onPause – ActivityA
  2. onCreate – ActivityB
  3. onStart – ActivityB
  4. onResume – ActivityB
  5. onStop – ActivityA
  6. onSaveInstanceState – ActivityA

首先,暂停ActivityA,然后调用ActivityB的生命周期方法。 但是最后,ActivityA停止了。

这里要注意的重要一点是,ActivityB在创建之后是停止的(不是销毁),并且是交互式的。

现在,当从ActivityB按下时,我们进入ActivityA,这是回调序列:

  1. onPause – ActivityB
  2. onRestart – ActivityA
  3. onStart – ActivityA
  4. onResume – ActivityA
  5. onStop – ActivityB
  6. onDestroy – ActivityB

在这里,我们看到最后,ActivityB被破坏了。 请注意,在A上启动B时,ActivityA并没有被破坏而是停止了,并且它的进程还在继续。

让我们看看当我们按下ActivityA(MainActivity)的后退按钮时会发生什么。

  1. onPause – ActivityA
  2. onStop – ActivityA
  3. onDestroy – ActivityA

由于ActivityA是最后一个活动,因此在按返回按钮时,应用程序退出并且ActivityA的进程被破坏。

这是这些问题中的另一个重要场景。 这个有点独特,它使用了onRestoreInstanceState。 我们将通过ActivityA旋转设备。

这是回调方法的调用顺序:

  1. onPause – ActivityA
  2. onStop – ActivityA
  3. onSaveInstanceState – ActivityA
  4. onDestroy – ActivityA
  5. onCreate – ActivityA
  6. onStart – ActivityA
  7. onRestoreInstanceState – ActivityA
  8. onResume – ActivityA

您可以从onRestoreInstanceState内部的onSaveInstanceState获取存储的键值对。

在ActivityA上按下主页按钮,您将获得以下回调序列:

  1. onPause – ActivityA
  2. onStop – ActivityA
  3. onSaveInstanceState – ActivityA

当您从暂停状态恢复时(通过按android上的“最近”按钮),以下是顺序:

  1. onRestart – ActivityA
  2. onStart – ActivityA
  3. onResume – ActivityA

因此,这些是Android活动生命周期中的一些场景。 让我知道您是否也要发布其他方案。 在接下来的文章中,我将尝试使用片段生命周期以及它们如何与活动生命周期一起工作。

翻译自: https://www.javacodegeeks.com/2020/08/android-activity-life-cycle-the-complete-guide.html

android

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值