Activity的生命周期和启动模式

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),则继续执行以下操作:

  1. 调用startPausingLocked方法**,开始暂停当前Activity,**传入用户是否正在离开、false、true和dontWaitForPause等参数,并将结果存储在I变量中。
  2. 如果开启了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值