Activity的生命周期

作为 Android 的四大组件( Activity [ækˈtɪvəti],Service [ˈsɜːvɪs],BroadcastReceiver [ˈbrɔːdkɑːst] [rɪˈsiːvər],ContentProvider [ kənˈtent] [prəˈvaɪdər])之一,Activity 在 Android 中的地位是极其重要的,它主要负责软件界面的展示,是整个 APP 的门面,是直接与用户进行交互的部分,所以了解 Activity 的生命周期,可以使我们对它的使用更加游刃有余。

Activity 的生命周期

总的来说,Activity 的生命周期主要有以下七个:

  • onCreate:表示 Activity 正在被创建,这是生命周期的第一个方法。在这个方法中,我们可以做一些初始化工作,比如调用 setContentView 去加载界面布局资源、初始化 Activity 所需数据等。
  • onRestart:表示 Activity 正在重新启动。一般情况下,当当前 Activity 从不可见重新变为可见状态时,onRestart 就会被调用。这种情形一般是用户行为所导致的,比如用户按 Home 键切换到桌面或者用户打开了一个新的 Activity,这时当前的 Activity 就会暂停,也就是 onPause 和 onStop 被执行了,接着用户又回到了这个 Activity,就会出现这种情况。
  • onStart:表示 Activity 正在被启动,即将开始,这时 Activity 已经可见了,但是还没有出现在前台,还无法和用户交互。这个时候其实可以理解为 Activity 已经显示出来了,但是我们还看不到。
  • onResume:表示 Activity 已经可见了,并且出现在前台并开始活动。要注意这个和 onStart 的对比,onStart 和 onResume 都表示 Activity 已经可见,但是 onStart 的时候 Activity 还在后台,onResume 的时候 Activity 才显示到前台。
  • onPause:表示 Activity 正在停止,正常情况下,紧接着 onStop 就会被调用。在特殊情况下,如果这个时候快速地再回到当前 Activity,那么 onResume 会被调用。但是这种情况属于极端情况,用户操作很难重现这一场景。此时可以做一些存储数据、停止动画等工作,但是注意不能太耗时,因为这会影响到新 Activity 的显示,onPause 必须先执行完,新 Activity 的 onResume 才会执行。
  • onStop:表示 Activity 即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。
  • onDestroy:表示 Activity 即将被销毁,这是 Activity 生命周期中的最后一个回调,在这里,我们可以做一些回收工作和最终的资源释放。

这些生命周期的具体执行过程,我们可以用下面这幅图来表示:


activity的生命周期

特殊情况

我们上面所说的,是 Activity 一般情况下的生命周期,但有没有特殊情况会导致 Activity 的生命周期与一般情况下的不同呢,答案是有的,但是其主要步骤和上述一般情况是一样的,只不过多了两步: onSaveInstanceStateonRestoreInstanceState,当 Activity 不是由我们主动 finish, 而是因为内存不足被系统杀死或其他异常情况时,就会多这两步:

onSaveInstanceState 一般在 onStop 之前调用,它主要进行 Activity 状态和数据的存储。

onRestoreInstanceState 一般在 onStart 之后调用,它将 Activity 退出时存储的数据进行恢复。

在一般情况下,onSaveInstanceState 和 onRestoreInstanceState 是不会被 Activity 调用的。

实践

实践是检验真理的唯一标准,通过自己动手,得到的知识会更加牢固,所以下面通过两个 Activity 观察一下它们的生命周期。

我们新建一个 Activity,其界面内容就是 Androidstudio 自动生成的 HelloWorld ,再为 HelloWorld 添加一个点击事件用于退出界面,为了方便观察,我们用 Logcat 的 error 等级输出日志。

class MainActivity : AppCompatActivity() {
    
    val TAG = this.javaClass.name
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        hello_world.setOnClickListener { 
            finish()
        }
        Log.e(TAG, "onCreate")
    }

    override fun onStart() {
        super.onStart()
        Log.e(TAG, "onStart")
    }

    override fun onResume() {
        super.onResume()
        Log.e(TAG, "onResume")
    }

    override fun onRestart() {
        super.onRestart()
        Log.e(TAG, "onRestart")
    }

    override fun onPause() {
        super.onPause()
        Log.e(TAG, "onPause")
    }

    override fun onStop() {
        super.onStop()
        Log.e(TAG, "onStop")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.e(TAG, "onDestroy")
    }
}

我们运行程序并点击 HelloWorld,可以在日志中看到如下信息。

2021-08-13 15:12:07.131 12133-12133/com.cpw.learningapplication E/com.cpw.learningapplication.MainActivity: onCreate
2021-08-13 15:12:07.138 12133-12133/com.cpw.learningapplication E/com.cpw.learningapplication.MainActivity: onStart
2021-08-13 15:12:07.140 12133-12133/com.cpw.learningapplication E/com.cpw.learningapplication.MainActivity: onResume
2021-08-13 15:12:23.509 12133-12133/com.cpw.learningapplication E/com.cpw.learningapplication.MainActivity: onPause
2021-08-13 15:12:23.871 12133-12133/com.cpw.learningapplication E/com.cpw.learningapplication.MainActivity: onStop
2021-08-13 15:12:23.875 12133-12133/com.cpw.learningapplication E/com.cpw.learningapplication.MainActivity: onDestroy

这和我们上面所描述的是一样的,我们再来模拟一下异常情况,在代码里添加异常情况的两个方法并添加一个 EditText (EditText 要有ID,否则不会保存其中的内容)。

 override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        Log.e(TAG, "onSaveInstanceState")
    }
//注意 activity 中有两个函数名称一样的方法,这里是只有一个参数的
 override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        Log.e(TAG, "onRestoreInstanceState")
    }

我们打开屏幕旋转然后进入界旋,在 EditText 中 输入文字并旋转屏幕,可以在日志中看到下面的信息。

2021-08-13 15:31:32.962 15658-15658/com.cpw.learningapplication E/com.cpw.learningapplication.MainActivity: onPause
2021-08-13 15:31:32.964 15658-15658/com.cpw.learningapplication E/com.cpw.learningapplication.MainActivity: onStop
2021-08-13 15:31:32.967 15658-15658/com.cpw.learningapplication E/com.cpw.learningapplication.MainActivity: onSaveInstanceState
2021-08-13 15:31:32.969 15658-15658/com.cpw.learningapplication E/com.cpw.learningapplication.MainActivity: onDestro
2021-08-13 15:31:33.054 15658-15658/com.cpw.learningapplication E/com.cpw.learningapplication.MainActivity: onCreate
2021-08-13 15:31:33.058 15658-15658/com.cpw.learningapplication E/com.cpw.learningapplication.MainActivity: onStart
2021-08-13 15:31:33.063 15658-15658/com.cpw.learningapplication E/com.cpw.learningapplication.MainActivity: onRestoreInstanceState
2021-08-13 15:31:33.065 15658-15658/com.cpw.learningapplication E/com.cpw.learningapplication.MainActivity: onResume

以上就是全部关于 Activity 生命周期的介绍了,如果有问题可以评论!

参考《Android 开发艺术探索》 任玉刚

欢迎微信搜索关注公众号:Android没有烦恼
一起学习更多Android知识

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容