Android Activity生命周期与启动模式

Activity的完整生命周期以下图:html

Activity的加载模式有四种:程序员

standard: 标准模式,默认的加载模式,每次经过这种模式启动目标Acitivity,都建立一个新的实例,并将该Activity添加到当前栈中。编程

singleTop: 与标准模式相似,只有当Activity位于Task顶时,系统不会从新建立目标Activity的示例,而是直接复用已有的Activity实例。架构

singleTask: 函数

  若是要启动的Activity不存在,系统建立Activity实例,并将它加入栈顶网站

  若是将启动的Activity存在,已经位于栈顶,此时与singleTop行为相同spa

  若是要启动的Activity存在,但不是位于栈顶,系统会使Activity上面全部的Activity出栈。rest

singleInstance:code

  若是要启动的Activity不存在,系统会建立一个新的Task,再建立Activity实例,将它加入新Task的栈顶orm

  若是要启动的Activity存在,不管它在哪一个应用程序中,系统都会把该Activity所在的Task转至前台。

 

下面依次验证,再四种加载模式下,Activity的各生命周期如何执行。假设有Activity A,B,C

一、标准模式启动A->B->C

复制代码

//启动AD/activityA(19864): onCreate
D/activityA(19864): onStart
D/activityA(19864): onResume//启动BD/activityA(19864): onPause
D/activityB(19864): onCreate
D/activityB(19864): onStart
D/activityB(19864): onResume
D/activityA(19864): onStop//启动CD/activityB(19864): onPause
D/activityC(19864): onCreate
D/activityC(19864): onStart
D/activityC(19864): onResume
D/activityB(19864): onStop

复制代码

而后按返回建:

复制代码

D/activityC(19864): onPause
D/activityB(19864): onRestart
D/activityB(19864): onStart
D/activityB(19864): onResume
D/activityC(19864): onStop
D/activityC(19864): onDestory

复制代码

因此若是未调用onDestory从新启动的话,不会调用onCreate,而是会调用onRestart。

 

二、A->B->A

复制代码

D/activityA(19864): onCreate
D/activityA(19864): onStart
D/activityA(19864): onResume

D/activityA(19864): onPause
D/activityB(19864): onCreate
D/activityB(19864): onStart
D/activityB(19864): onResume
D/activityA(19864): onStop

D/activityB(19864): onPause
D/activityA(19864): onCreate
D/activityA(19864): onStart
D/activityA(19864): onResume
D/activityB(19864): onStop

复制代码

修改A的启动模式为singleTop

->A->A

复制代码

D/activityA(27075): onCreate
D/activityA(27075): onStart
D/activityA(27075): onResume


D/activityA(27075): onPause
D/activityA(27075): onNewIntent
D/activityA(27075): onResume

复制代码

->A->B->A

复制代码

D/activityA(27075): onCreate
D/activityA(27075): onStart
D/activityA(27075): onResume


D/activityA(27075): onPause
D/activityB(27075): onCreate
D/activityB(27075): onStart
D/activityB(27075): onResume
D/activityA(27075): onStop

D/activityB(27075): onPause
D/activityA(27075): onCreate
D/activityA(27075): onStart
D/activityA(27075): onResume
D/activityB(27075): onStop

复制代码

当A不是栈顶时,启动A,又从新建立了A,并且观察以上输出,两个Activity切换时,首先当前Activity先onPause,而后被启动的Activity,依次onCreate, onStart, onResume显示出来以后,以前的Activity才会onStop。

修改A的启动方式为singleTask,

->A->A

复制代码

D/activityA( 2744): onCreate
D/activityA( 2744): onStart
D/activityA( 2744): onResume



D/activityA( 2744): onPause
D/activityA( 2744): onNewIntent
D/activityA( 2744): onResume

复制代码

当A不存在时,建立A,当A存在且在栈顶时,先onPause,而后onNewIntent,以后onResume。

->A->B->A

复制代码

D/activityA( 2744): onCreate
D/activityA( 2744): onStart
D/activityA( 2744): onResume

D/activityA( 2744): onPause
D/activityB( 2744): onCreate
D/activityB( 2744): onStart
D/activityB( 2744): onResume
D/activityA( 2744): onStop

D/activityB( 2744): onPause
D/activityA( 2744): onNewIntent
D/activityA( 2744): onRestart
D/activityA( 2744): onStart
D/activityA( 2744): onResume
D/activityB( 2744): onStop
D/activityB( 2744): onDestory

复制代码

能够看到第二次启动A后,A调用了onNewIntent,onRestart,onStart,onResume,关键是以后调了B的onStop, onDestory,在以前的两种模式下只是另B,调用了onStop,因此推断,singleTask时,是以前的A经过onNewIntent从新进入onResume,而后将B移除出了栈。

修改A的启动方式为SingleInstance

->A->A

复制代码

D/activityA(10578): onCreate
D/activityA(10578): onStart
D/activityA(10578): onResume


D/activityA(10578): onPause
D/activityA(10578): onNewIntent
D/activityA(10578): onResume

复制代码

与singleTask表现一致

->A->B->A

复制代码

D/activityA(10578): onCreate
D/activityA(10578): onStart
D/activityA(10578): onResume

D/activityA(10578): onPause
D/activityB(10578): onCreate
D/activityB(10578): onStart
D/activityB(10578): onResume
D/activityA(10578): onStop

D/activityB(10578): onPause
D/activityA(10578): onNewIntent
D/activityA(10578): onRestart
D/activityA(10578): onStart
D/activityA(10578): onResume
D/activityB(10578): onStop

复制代码

在singleInstance模式下,复用了原来的A,对B只是onStop,并无发生出栈销毁。

总结以上:

当复用一个已经存在的Activity时,一般是从它的onNewIntent或onRestart开始调起,

若是一个Activity要出栈,必然会调到onDestory

在两个Activity切换的过程当中,是当前的Activity先onPause,而后让新的Activity建立或者restart,知道onResume,前一个Activity才会走onStop以及onDestory

 

另一个问题:分别在A生命周期函数内启动B(A,B都是Standared),

复制代码

D/activityA(17860): onCreate
D/activityA(17860): onStart
D/activityA(17860): onResume
D/activityA(17860): onPause
D/activityB(17860): onCreate
D/activityB(17860): onStart
D/activityB(17860): onResume
D/activityA(17860): onStop

复制代码

生命周期的回调函数是完整的,都会依次调到,可是有个问题是当按back键后,会出现以下:

复制代码

D/activityB(19588): onPause
D/activityA(19588): onRestart
D/activityA(19588): onStart
D/activityA(19588): onResume
D/activityA(19588): onPause
D/activityB(19588): onCreate
D/activityB(19588): onStart
D/activityB(19588): onResume
D/activityB(19588): onStop
D/activityB(19588): onDestory
D/activityA(19588): onStop

复制代码

须要返回A,可是A在启动的生命周期中又启动了B,这时的行为就跟启动模式有关了,老是它正常切换时正确的执行顺序。

 

这个知识点太绕了,其实万变不离其宗,都是四种启动模式生命周期执行顺序的组合。

问啊APP,程序员答题神器,解决你全部的技术难题,   (上问啊APP 了解更多) http://t.cn/R4vE2d7 下载注册送5元 快去下载注册吧! 

问啊-定制化IT教育平台,牛人一对一服务,有问必答,开发编程社交头条 官方网站:www.wenaaa.com 下载问啊APP,参与官方悬赏,赚百元现金。

QQ群290551701 汇集不少互联网精英,技术总监,架构师,项目经理!开源技术研究,欢迎业内人士,大牛及新手有志于从事IT行业人员进入!

http://cxy.liuzhihengseo.com/501.html

相关文章
相关标签/搜索