Activity作为四大组件之一,是使用最为频繁的一种控件,日常开发中除了Window、Dialog和Toast之外,我们能见到的界面的确只有Activity。而Activity的生命周期作为基础中的基础就算入门级Android程序员也是耳熟能详。但是在很多特殊情况下生命周期是十分微妙的、
典型生命周期
所谓典型情况下的生命周期,是指在有用户参与的情况下,Activity所经过的生命周期的改变。正常一个Activity会经历以下的生命周期:
onCreat
表示正在被创建,这是很多空间生命周期的第一个方法,在这里我们可以做一些初始化工作,比如加载界面布局资源,初始化Activity所需的数据等。
onStart
表示正在被启动,即将开始,这时Activity已经可见了,但是还没有出现在前台,还无法与用户交互,这个时候可以理解成Activity已经显示出来了,但是我们看不到。
onResume
表示Activity已经处于前台并且开始活动,和onStart相比两者都其实都已经可见了,但是onStart时Activity还不在前台,不能与用户交互,onResume的时候Activity才显示到前台。
onPause
表示Activity正在停止,可以做一些轻量级的回收工作,如停止动画之类,不能太耗时会影响下个页面的进入速度,造成卡顿。正常情况下会紧接着调用onStop,在一些特殊情况下,如果这个时候快速地再回到当前Activity,那么onResume会直接被调用。
onStop
表示Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。
onDestroy
表示Activity即将被销毁,这里可以做一些回收工作和最终的资源释放。
存在的问题
onStart和onResume、onPause和onStop区别
这里引入焦点的概念,onStart和onStop表示Activity是否可见,而onResume和onPause是从是否获取焦点,这么说其实是比较抽象的。
例如我们在Activity上创建了一个Dialog,你会发现这时候会执行onPause,这就是因为此刻用户的焦点已经从Activity转移到了Dialog上面。
除此之外还有一种特殊情况,当Activity A跳转到另外一个Activity B时,正常执行的生命周期是onPause->onStop。
但当Activity B采用透明主题时,那么Activity A就不会执行onStop,并且返回时也不会调用onStart。
个人理解是因为目标透明,系统判定其已经是不可见了,所以当前Activity就不必进行进行隐藏和显示来配合目标Activity的生命周期。至于什么是透明主题相信用过类似SwipeBackActivity这类滑动返回的都知道这里就不多说了。
Activity跳转生命周期
- 这个问题首先有个误区需要说明下,通常Activity跳转都是使用到
startActivity()
方法,所以理所应当的会觉得在调用该方法之后就会跳转到对应的Activity,实际上当然不会这么简单,这里涉及到的源码很复杂,涉及到Instrumentation、ActivityThread和ActivityManagerService。简单说下,就是当执行了startActivity()
方法方法后并不会马上跳转到目标Activity并且执行其生命周期,而是会将当前Activity的创建生命周期完成之后才会跳转,从原理上分析也很好理解,Main线程只有一条,如果同时执行多个Activity的生命周期那不是就需要多条Main线程了吗(我是这么理解的,至于具体是不是并不确定)。 - 然后就是我们的问题了,从Android源码可以得到一定的解释,在新Activity启动之前,栈顶的Activity需要先onPause后,新的Activity才能启动。最终在ActivityStackSupervisor中的realStartActivityLocked方法会调用ApplicationThread的scheduleLaunchActivity方法,最终由
scheduleLaunchActivity
方法完成新Activity的创建生命周期。 - 因此可以得出结论,Activity跳转会经历以下的生命周期(这里用新旧来区分):旧onCreat-旧onStart-旧onResume-旧onPause-新onCreat…
总结
-
onStart和onStop代表Activity是否可见,onResume和onPause代表Activity是否在前台。
-
在Activity切换时onStart和onStop有可能不会执行,onResume和onPause一定会执行。
-
新Activity生命周期会在旧Activity的onPause执行之后开始执行。