Activty的生命周期

Android是使用任务(Task)来管理活动的,一个任务就是一组放在栈里的活动的集合,这个栈也被称作为(Back Stack)。栈是一种后进先出的数据结构,在 默认情况下,每当启动一个Activity,它会在返回栈种入栈,并处于栈顶的位置。而当销毁的时候,处于栈最顶层的会出栈,这时前一个入栈的活动就会重新处于最顶层,Android总是会显示处于栈顶的活动给用户,就是我们能看到的Activity。
Activity共分为4种状态,分别为运行状态,暂停状态,停止状态,销毁状态。
Activity生命周期有七个回调方法:
onCreate():Activity第一次创建时候会被调用,一般用于加载布局和初始化数据绑定事件。
onRestart():这个方法由停止状态变为运行状态前调用,即Activty被重新启动。一般为用户行为所导致(如用户按Home键切换到桌面或开启一个新Activity后,当前Activity暂停,也就是onPause和onStop被执行了,该用户又回到这个Activity)
onStart():Activity由不可见变为可见的时候调用,此时Activity还并未出现在前台,无法与用户交互(理解为Activity已经出来了,但是我们看不到)。
onResume():这个方法在Activty准备好和用户准备交互时候调用,此时Activity一定在栈的最顶层,并且处于运行状态,和onStart的区别在于,onStart在后台不可见,而onResume在前台。
onPause():这个方法是系统准备去启动或恢复另一个Activity调用,此方法一般会用来释放一些消耗CPU的资源或保存一些关键的数据,但执行速度一定要快,所以不适用复杂业务,因为会影响到栈顶的Activity的使用。但是如果快速回到当前Activity,那么不会调用onStop而是调用onResume。(此情况属于极端特殊情况,一般很难复现)。onPause必须执行完新Activity的onResume才会执行。
onStop():表示此Activity即将停止,此方法用于Activty不可见的时候调用,它和onPause区别在于,如果Activity启动的是类似对话框(Dialog,PopWindow)这样的窗口活动时候,此方法并不会被调用。此方法里可以做一些稍重量级工作。
onDestroy():此方法在Activty被销毁时调用,此方法被调用后,Activty被销毁。

生命周期除onRestart()外,两两对应,为方便理解和记忆,可分为三种生存期。
完整生存期,即onCreate()到onDestory()一套流程走完。
可见生存期,即onStart()到onStop()之间的一套流程。
注:如果新Activity采用了透明主题,那么当前Acvity是不会调用onStop的。
前台生存期,即onResume到onPause()所经历的一套流程。注:此时的Activty是可见的,运行状态并能交互的。

onStart和onResume,onPause和onStop从描述看差不多,有什么区别呢?
区别在于:onStart和onStop是基于Activity是否可见的角度来回调 的,而onResume和onPause是基于Activity是否在前台这个角度来回调。

假设当前Activity为A,启动ActivityB,那么我们知道肯定是A先onPause,再去执行B的onResume。具体原因可分析源码得知:
Activity启动涉及Instrumentaion,ActivityThread和ActivityManagerService(AMS)。简单理解,启动Activity的请求会由Instrnumentaiion处理,然后它通过Binder向AMS发送请求,AMS内部维护着一个ActivityStack并负责栈内的Activity状态同步,AMS通过Activity去同步Activity的状态同步从而去完成生命周期的调用。

注:onPause和onStop都不能执行耗时操作,尤其是onPause不能执行重量级操作。

以上为Activity的正常生命周期,接下来分析异常生命周期。异常是指如资源相关的系统配置发生改变以及系统内存不足时,Activity就可能会被杀死。

在默认情况下不做特殊处理,当系统发生改变后,Activity会被销毁并重新创建。其onPause,onStop,onDestroy都会被调用,同时由于是在异常状态终止,系统会调用onSaveInstanceState来保存当前状态(在onStop之前,却与onPasue没有时序关系,既可能在前也可能在后,且此方法只会在Activity异常终止的情况下调用,正常情况下不会调用)。当Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法保存起来的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate。因此我们可通过onCreate和onRestoreInstanceState方法来判断Activity是否被重建,如果被重建,我们可以取出之前数据进行并恢复,从时序来讲,onRestoreInstanceState方法会在onStart之后调用。

每个View都有onSaveInstanceState和onRestoreInstanceState这两个方法,他们具体的系统工作流程是:Activity会调用onSaveInstanceState去保存数据,然后Activity委托Window去保存,Window再去委托它上面的顶级容器,顶层容器是个Viewgroup,一般来说可能是DecorView。最后顶层容器再去一一通知它的子元素去保存数据。整个流程采用的是委托思想,上层委托下层,父容器委托子容器。
注:onRestoreInstanceState被调用其参数Bundle saveInstanceState是一定会有值的,我们不用作非空判断,但是onCreate不行,因为正常启动的话onCreate的Bundle saveInstanceState就会为null,所以我们必须作非空判断,虽然二者都可以进行数据恢复,但是推荐使用onRestoreInstanceState。
总结:系统只会在Activity异常终止的情况下去调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,其它情况不会触发该过程。
在资源内存不足情况下会导致地优先级Activity被杀死。
优先级等级区分:
1.前台Activity,正在和用户交互的Activity优先级最高。
2.可见但非 前台的Activity其次,比如弹出dialog,poupWindow的Activity导致Activity可见但是无法与用户交互
3.后台运行的Activity,指已被暂停的Activity,如执行了onStop,优先级最低。
注:如果一个进程中没有四大组件执行,那么进程很容易被系统杀死,因此一些后台工作不适合脱离四大组件独自运行后台中,这样进程容易被杀死。

当系统配置发生改变后,不想让Actovity被重新创建,需指定Acvity的configChanges属性,详情见下表:

Activty的生命周期_第1张图片
Paste_Image.png

你可能感兴趣的:(Activty的生命周期)