1.1俩种状态下生命周期分析
1.正常状况****生命周期分析
1.七个生命周期
1,onCreate : 表示正在Activity创建
2,onRestart: 表示Activity正在重新启动,比如打开新的Activity返回到本Activity中时(由不可见变为可见状态时会调用)
3,onStart : 表示Activity正在启动,即创建后开始启动(此时活动不一定可见)
4,onResume : 表示Activity已经可见,可以在前台发生活动
5,onPause : 表示该Activity正在停止,一般会马上调用onStop,在调用onStop之前,如果可以返回Activity,那么他会调用前面的onResume方法,当该方法执行完毕新Activtiy才会调用onResume
6, onStop : 表示该Activity即将停止,
7,onDestroy : 表示当前活动马上就会被销毁
2.部分源码分析
活动A的onResume和活动A的下一个活动B的onPuse那个先执行?
//dontWaitForPause用于表示是否需要等待当前Activity暂停完成
boolean dontWaitForPause =(next.info.flags&ActivityInfo.FLAG RESUME_WHILE_PAUSING)!=0;
//pausing表示是否正在暂停Activity堆栈, ActivityStack的管理者,用于管理Activity堆栈。
//userLeaving 是一个参数,用于指示是否是用户主动离开当前Activity
//pauseBackStacks 方法似乎是用来对 Activity Stack 中的 Activity 进行暂停操作
boolean pausing =mStackSupervisor.pauseBackStacks(userLeaving, true,dontWaitForPause);
//当前处于resumed状态的Activity
if(mResumedActivity !=null) {
pausing I= startPausingLocked (userLeaving, false, true, dontWaitForPause);
if (DEBUG STATES) Slog.d(TAG,"resumeTopActivityLocked: Pausing " +mResumedActivity);
}
Acitvity的启动涉及 Instrumentation,ActivityThread和ActivityMangerService(AMS) 三个部分,启动Acitivity的请求由 Instrumentation处理,他通过Binder向AMS发送请求,而AMS内部有一个ActivityStack负责栈内的Activty同步,AMS通过ACtivityThread来同步Activty的状态,实现生命周期方法的调用。上面的代码来自,ActivityStack中的resumeTopActivityInnerLocked方法
上面的代码
- 首先,根据下一个Activity的标志位判断是否需要等待当前Activity暂停完成,将结果存储在dontWaitForPause变量中。
- 接下来,调用pauseBackStacks方法暂停Activity堆栈,传入用户是否正在离开以及是否需要等待暂停完成等参数,将结果存储在pausing变量中。
如果当前有Activity处于resumed状态(处于前台可以与用户交互)(mResumedActivity != null),则继续执行以下操作:
- 调用startPausingLocked方法**,开始暂停当前Activity,**传入用户是否正在离开、false、true和dontWaitForPause等参数,并将结果存储在I变量中。
- 如果开启了DEBUG STATES模式,则输出日志信息表示正在暂停当前Activity
从上面我们可以知道,dontWaitForPause是会判断下一个活动的状态来进行判断,影响他的下一步操作,所以只有活动A的onPause执行后新的活动才会启动
不可以在onPause中进行重量级操作(耗时),onPause和onStep都不可以进行耗时操作,如果无法避免应该在onStep中操作
2.异常状况****生命周期分析
1. 资源相关的系统配置发生改变导致Activity被杀死并重新创建
在处理Activity之前,了解一下资源加载机制,比如图片,我们是将图片放置在drawable目录,然后通过Resources获取图片,为了适配不同的设备我们需要在其他文件夹也准备图片,如drawable-mdpi等,当程序启动是,会根据设备加载合适的Resources资源,比如手机横屏和竖屏手机得到是俩张不同的图片(如果有提前设置的话),在手机Activity从竖屏转换为横屏的时候,默认情况下它会将Activity杀死,然后重新创建
在系统配置改变的时候,原有活动会被正常杀死,onPause,onStop,onDestroy,都会被正常执行,然后因为是异常终止,所以系统会通过onSavelnstanceState来保存当前Activty的状态,他会在onStop之前执行,与onPause无硬性执行先后,在新的Activity被创建之后,系统会调用onRestorelnstanceState,前面销毁时onSavelnstanceState会保存一个Bundle对象,将其传给onRestorelnstanceState来重建Activity,在执行顺序上说onRestorelnstanceState在onStart之后执行
在这个过程中,系统会自动保存和恢复Activity的视图结构,比如用户输入的数据,ListView的位置。和Activity一样View 也有上面提到的俩个方法
在保存和恢复VIew时,系统的工作流程是:
- Activity被异常终止
- Activity会调用onSaveInstanceState保存数据,
- 然后Activty会委托Window保存数据,
- Windows委托他上面的顶级容器保存数据,顶级容器可以是一个ViewGroup,一般来说可能是DecorVeiw,
- 最后由顶级容器一一通知子元素来保存数据
Window(窗口) : 不是Windows操作系统在Andr