目录
前言
Activity的生命周期
五种状态
生命周期相关方法
前言
Android中有着四大组件:Activity、Service、ContentProvider和BroadcastReceiver。本篇我们主要讲解的是Activity组件,它是安卓提供给用户与手机之间进行交互的界面 控件,那么activity从创建到销毁经历了哪些状态呢?接下来我们就来了解一下。
Activity的生命周期
五种状态
Activity的生命周期指的是activity从创建到销毁的整个过程。这个过程中有五个状态:
- 启动状态:启动时间很短暂,一般当activity启动之后就会进入运行状态;
- 运行状态:此时activity处于界面前端,是可见、有焦点的,能够和客户进行交互,如点击按钮等。
- 暂停状态:此状态下是可见的,但获取不到焦点,对用户的操作不会有响应。比如,当activity上覆盖了一个透明或者非全屏的界面时,被覆盖的界面就会处于暂停状态;
- 停止状态:activity完全不可见,此时就处于停止状态,例如,当系统资源不足时,这种状态下的activity很容易被销毁;
- 销毁状态:当处于销毁状态时,将清除内存。
生命周期相关方法
在Activity中,它的生命周期包括创建、可见、获取焦点、失去焦点、不可见、重新可见、销毁等。环节。针对每个环节,activity提供相应的回调方法。
- onCreate():创建activity时调用,一般用于初始化操作。
- onStart():activity即将可见时调用,此时可以做一些数据的初始化操作(从后台拉取数据等)
- onResume():activity获取焦点时调用。此时可以进行交互。
- onPause():当前的activity被其他activity覆盖或屏幕锁屏时调用。
- onStop():activity对用户不可见时调用。
- onRestart():activity从停止状体到再次启动状态时调用。
- onDestory():销毁activity时调用。
接下来我们就来通过一个案例来进一步更好的了解上面方法在什么时候会被调用。
假设我们现在创建了一个Activity A,那么这个就会经历以下几个生命周期:
- onCreate():A正在被创建,在这个方法中,我们可以做一些Activity的初始化操作,例如:加载布局文件和事件的绑定(setContentView、findViewById,setOnClickListener等)。
- onStart():A正在被启动,在这个过程中,A从不可见变为可见,但此时依旧无法和用户进行交互。此时可以做一些数据的初始化操作,如拉取数据等。
- onResume():A此时已经可见,出现在前台,处于返回栈栈顶,可以和用户进行交互。
以下就是一个Activity在从创建到能和用户进行交互所会经历的生命周期。
但如果此时我们再加入一个Activity B,那么Activity还会经历以下几个生命周期:
4.onPause():此时A正在停止,准备从前台转到后台,此时可以做一些停止动画,数据存储等操作。
5.onStop():在A完全不可见时调用,紧随着onPause执行,表示A即将停止,此时A已经不在前台。可以做一些稍微重量级的回收操作,不能太耗时。(如果此时新打开的B时对话框的Activity,背景存在一定区域是透明的,则A的onStop不会调用)。
6.onDestory():表示即将被销毁,在这里我们可以进行资源的回收、释放等工作。一般是在用户按下back键或者系统资源紧张的时候,将A释放掉以获取更多的内存调用。
7.onRestart:A由onStop停止状态,转为运行状态时调用,表示A正在被重新启动。
8.onStart
9.onResume
我们通过这张图片看到,不过这里还未提到的一点是,上面的图中onPause()还有个箭头指向了onResume(),这是一种比较极端的情况,即考虑当A跳转到B的情况,此时A还在执行onPause,B还未显示出来。此时快速得从B回到A,此时就会直接执行A的onResume(0而不会走onRestart(),不过一般这种情况还是有点难复现的,当然手速快就可以看到。
我们可以总结:
1.onStart、onResume、onPause、onStop 看起来回调的时机差不多,那么它们有上面区别呢?
onStart和onStop是从Activity是否可见的角度来回调的,而onResume和onPause是从Activity是否位于前台、是否可以与用户交互的角度来回调的。
2.从A跳转到B,是先执行A的onPause(),还是先执行B的onResume()?
这部分的源码比较复杂,不过我们可以记住结论:A的onPause()会先执行,然后再执行B的onResume()。
先这样叭~