Android Activity生命周期与启动模式

Activity的完整生命周期如下图:

Activity的加载模式有四种:

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

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

singleTask: 

  如果要启动的Activity不存在,系统创建Activity实例,并将它加入栈顶

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

  如果要启动的Activity存在,但不是位于栈顶,系统会使Activity上面所有的Activity出栈。

singleInstance:

  如果要启动的Activity不存在,系统会创建一个新的Task,再创建Activity实例,将它加入新Task的栈顶

  如果要启动的Activity存在,无论它在哪个应用程序中,系统都会把该Activity所在的Task转至前台。

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

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

复制代码

1//启动AD/activityA(19864): onCreate 2D/activityA(19864): onStart 3D/activityA(19864): onResume//启动BD/activityA(19864): onPause 4D/activityB(19864): onCreate 5D/activityB(19864): onStart 6D/activityB(19864): onResume 7D/activityA(19864): onStop//启动CD/activityB(19864): onPause 8D/activityC(19864): onCreate 9D/activityC(19864): onStart 10D/activityC(19864): onResume 11D/activityB(19864): onStop

复制代码

然后按返回建:

复制代码

1D/activityC(19864): onPause 2D/activityB(19864): onRestart 3D/activityB(19864): onStart 4D/activityB(19864): onResume 5D/activityC(19864): onStop 6D/activityC(19864): onDestory

复制代码

所以如果未调用onDestory重新启动的话,不会调用onCreate,而是会调用onRestart。

2、A->B->A

复制代码

1D/activityA(19864): onCreate 2D/activityA(19864): onStart 3D/activityA(19864): onResume 4 5D/activityA(19864): onPause 6D/activityB(19864): onCreate 7D/activityB(19864): onStart 8D/activityB(19864): onResume 9D/activityA(19864): onStop 10 11D/activityB(19864): onPause 12D/activityA(19864): onCreate 13D/activityA(19864): onStart 14D/activityA(19864): onResume 15D/activityB(19864): onStop

复制代码

修改A的启动模式为singleTop

->A->A

复制代码

1D/activityA(27075): onCreate 2D/activityA(27075): onStart 3D/activityA(27075): onResume 4 5 6D/activityA(27075): onPause 7D/activityA(27075): onNewIntent 8D/activityA(27075): onResume

复制代码

->A->B->A

复制代码

1D/activityA(27075): onCreate 2D/activityA(27075): onStart 3D/activityA(27075): onResume 4 5 6D/activityA(27075): onPause 7D/activityB(27075): onCreate 8D/activityB(27075): onStart 9D/activityB(27075): onResume 10D/activityA(27075): onStop 11 12D/activityB(27075): onPause 13D/activityA(27075): onCreate 14D/activityA(27075): onStart 15D/activityA(27075): onResume 16D/activityB(27075): onStop

复制代码

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

修改A的启动方式为singleTask,

->A->A

复制代码

1D/activityA( 2744): onCreate 2D/activityA( 2744): onStart 3D/activityA( 2744): onResume 4 5 6 7D/activityA( 2744): onPause 8D/activityA( 2744): onNewIntent 9D/activityA( 2744): onResume

复制代码

当A不存在时,创建A,当A存在且在栈顶时,先onPause,然后onNewIntent,之后onResume。

->A->B->A

复制代码

1D/activityA( 2744): onCreate 2D/activityA( 2744): onStart 3D/activityA( 2744): onResume 4 5D/activityA( 2744): onPause 6D/activityB( 2744): onCreate 7D/activityB( 2744): onStart 8D/activityB( 2744): onResume 9D/activityA( 2744): onStop 10 11D/activityB( 2744): onPause 12D/activityA( 2744): onNewIntent 13D/activityA( 2744): onRestart 14D/activityA( 2744): onStart 15D/activityA( 2744): onResume 16D/activityB( 2744): onStop 17D/activityB( 2744): onDestory

复制代码

可以看到第二次启动A后,A调用了onNewIntent,onRestart,onStart,onResume,关键是之后调了B的onStop, onDestory,在之前的两种模式下只是另B,调用了onStop,所以推断,singleTask时,是之前的A通过onNewIntent重新进入onResume,然后将B移除出了栈。

修改A的启动方式为SingleInstance

->A->A

复制代码

1D/activityA(10578): onCreate 2D/activityA(10578): onStart 3D/activityA(10578): onResume 4 5 6D/activityA(10578): onPause 7D/activityA(10578): onNewIntent 8D/activityA(10578): onResume

复制代码

与singleTask表现一致

->A->B->A

复制代码

1D/activityA(10578): onCreate 2D/activityA(10578): onStart 3D/activityA(10578): onResume 4 5D/activityA(10578): onPause 6D/activityB(10578): onCreate 7D/activityB(10578): onStart 8D/activityB(10578): onResume 9D/activityA(10578): onStop 10 11D/activityB(10578): onPause 12D/activityA(10578): onNewIntent 13D/activityA(10578): onRestart 14D/activityA(10578): onStart 15D/activityA(10578): onResume 16D/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),

复制代码

1D/activityA(17860): onCreate 2D/activityA(17860): onStart 3D/activityA(17860): onResume 4D/activityA(17860): onPause 5D/activityB(17860): onCreate 6D/activityB(17860): onStart 7D/activityB(17860): onResume 8D/activityA(17860): onStop

复制代码

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

复制代码

1D/activityB(19588): onPause 2D/activityA(19588): onRestart 3D/activityA(19588): onStart 4D/activityA(19588): onResume 5D/activityA(19588): onPause 6D/activityB(19588): onCreate 7D/activityB(19588): onStart 8D/activityB(19588): onResume 9D/activityB(19588): onStop 10D/activityB(19588): onDestory 11D/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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Android Activity生命周期,启动模式,启动过程详解

前言接触过Android开发的同学都知道Activity,Activity作为Android四大组件之一,使用频率高。简单来说Activity提供了一个显示界面,让用户进行各种操作,本文主要分为以下三个部分:Activity的生命周期,启动模式,以及Activity的工作过程。文中大部分篇幅来自《Android开发艺术探索》一书,尽管想多以流程或图

Android Activity生命周期与启动模式 - HelloWorld