美文网首页组件Android安卓开发
深入理解Activity的生命周期

深入理解Activity的生命周期

作者: 这是朕的江山 | 来源:发表于2016-08-30 14:50 被阅读19957次

    之前学习安卓的时候只是知道生命周期是什么,有哪几个,但具体的详细的东西却不知道,后来看过《Android开发艺术探索》和大量博客之后,才觉得自己真正有点理解生命周期,本文是我对生命周期的认识的总结。

    废话少说先上图。

    图片来自于网络

    相信学习安卓的人对这幅图都很熟悉,这是安卓Activity的生命周期活动图,详细而直观得表现了Activity各生命周期间的关系。下面我来通过问答的方式来谈谈我对它们的认识。

    1.生命周期中各个方法的含义和作用

    (1)onCreate:create表示创建,这是Activity生命周期的第一个方法,也是我们在android开发中接触的最多的生命周期方法。它本身的作用是进行Activity的一些初始化工作,比如使用setContentView加载布局,对一些控件和变量进行初始化等。但也有很多人将很多与初始化无关的代码放在这,其实这是不规范的。此时Activity还在后台,不可见。所以动画不应该在这里初始化,因为看不到……

    (2)onStart:start表示启动,这是Activity生命周期的第二个方法。此时Activity已经可见了,但是还没出现在前台,我们还看不到,无法与Activity交互。其实将Activity的初始化工作放在这也没有什么问题,放在onCreate中是由于官方推荐的以及我们开发的习惯。

    (3)onResume:resume表示继续、重新开始,这名字和它的职责也相同。此时Activity经过前两个阶段的初始化已经蓄势待发。Activity在这个阶段已经出现在前台并且可见了。这个阶段可以打开独占设备

    (4)onPause:pause表示暂停,当Activity要跳到另一个Activity或应用正常退出时都会执行这个方法。此时Activity在前台并可见,我们可以进行一些轻量级的存储数据和去初始化的工作,不能太耗时,因为在跳转Activity时只有当一个Activity执行完了onPause方法后另一个Activity才会启动,而且android中指定如果onPause在500ms即0.5秒内没有执行完毕的话就会强制关闭Activity。从生命周期图中发现可以在这快速重启,但这种情况其实很罕见,比如用户切到下一个Activity的途中按back键快速得切回来。

    (5)onStop:stop表示停止,此时Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。这个阶段的主要工作也是做一些资源的回收工作。

    (6)onDestroy:destroy表示毁灭,这个阶段Activity被销毁,不可见,我们可以将还没释放的资源释放,以及进行一些回收工作。

    (7)onRestart:restart表示重新开始,Activity在这时可见,当用户按Home键切换到桌面后又切回来或者从后一个Activity切回前一个Activity就会触发这个方法。这里一般不做什么操作。

    图片来自网络

    通过上面的了解我们发现其实Activity中的方法大都是两两对应的,只有onRestart方法散发着单身狗的清香。
    那么相邻的方法之间有什么区别呢?

    2.onCreate和onStart之间有什么区别?

    (1)可见与不可见的区别。前者不可见,后者可见。
    (2)执行次数的区别。onCreate方法只在Activity创建时执行一次,而onStart方法在Activity的切换以及按Home键返回桌面再切回应用的过程中被多次调用。因此Bundle数据的恢复在onStart中进行比onCreate中执行更合适。
    (3)onCreate能做的事onStart其实都能做,但是onstart能做的事onCreate却未必适合做。如前文所说的,setContentView和资源初始化在两者都能做,然而想动画的初始化在onStart中做比较好。

    3.onStart方法和onResume方法有什么区别?

    (1)是否在前台。onStart方法中Activity可见但不在前台,不可交互,而在onResume中在前台。
    (2)职责不同,onStart方法中主要还是进行初始化工作,而onResume方法,根据官方的建议,可以做开启动画和独占设备的操作。

    4.onPause方法和onStop方法有什么区别?

    (1)是否可见。onPause时Activity可见,onStop时Activity不可见,但Activity对象还在内存中。
    (2)在系统内存不足的时候可能不会执行onStop方法,因此程序状态的保存、独占设备和动画的关闭、以及一些数据的保存最好在onPause中进行,但要注意不能太耗时。

    5.onStop方法和onDestroy方法有什么区别?

    onStop阶段Activity还没有被销毁,对象还在内存中,此时可以通过切换Activity再次回到该Activity,而onDestroy阶段Acivity被销毁

    6.为什么切换Activity时各方法的执行次序是(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop而不是(A)onPause→(A)onStop→(B)onCreate→(B)onStart→(B)onResume

    (1)一个Activity或多或少会占有系统资源,而在官方的建议中,onPause方法将会释放掉很多系统资源,为切换Activity提供流畅性的保障,而不需要再等多两个阶段,这样做切换更快。
    (2)按照生命周期图的表示,如果用户在切换Activity的过程中再次切回原Activity,是在onPause方法后直接调用onResume方法的,这样比onPause→onStop→onRestart→onStart→onResume要快得多。

    7.与生命周期密切相关的onSaveInstanceState方法和onRestoreInstanceState方法在什么时候执行?

    通过阅读源码会发现,当targetSdkVersion小于3时onSaveInstanceState是在onPause方法中调用的,而大于3时是在onStop方法中调用的。
    而onRestoreInstanceState是在onStart之后、onResume之前调用的。

    相关文章

      网友评论

      • 神坑坑会所:第6、7个讲的很到位
      • chaozhouzhang:请问一下打开独占设备是什么意思?
      • 小鹿啊小鹿:onWindowFocusChanged的时候才能看到界面
      • 夷陵小祖:"因此Bundle数据的恢复在onStart中进行比onCreate中执行更合适。"
        意思是,将onCreate()中给出的Bundle数据赋给一个全局变量,然后后面每次通过onStart()重新回来时,去该全局变量拿数据吗?不知道我理解得对不对,望指教
        杨晓是大V:不需要,使用onRestoreInstanceState()方法即可,Bundle不为空的时候,系统才会调用onRestoreInstanceState()方法
      • 猿界的一等带刀侍卫:不是很懂这句“onstart可见,但还未出现在前台”
        小鹿啊小鹿:可见但是你看不见,因为没到前台
        5e34a1a8d0e2:这时候ui应该是可以看到了吧
      • 037e3257fa3b:总结的不错,对于我这种iOS学Android的菜鸟来说挺好:smile:
        037e3257fa3b:@木木jun 没有转噢,两个都学,现在都不好找工作:anguished:
        木木jun:为啥IOS转Android?不要转啊,Android都是泪啊
      • wan7451:解释的很详细,尤其是 onResume 的开启动画和独占设备 描述的很精确
        杨晓是大V:@Android技术堆栈 可与用户交互,我们称为独占设备
        chaozhouzhang:请问一下打开独占设备是什么意思?

      本文标题:深入理解Activity的生命周期

      本文链接:https://www.haomeiwen.com/subject/jujzjttx.html