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

//启动A
D/activityA(19864): onCreate
D/activityA(19864): onStart
D/activityA(19864): onResume
//启动B
D/activityA(19864): onPause
D/activityB(19864): onCreate
D/activityB(19864): onStart
D/activityB(19864): onResume
D/activityA(19864): onStop
//启动C
D/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。

2、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,这时的行为就跟启动模式有关了,总是它正常切换时正确的执行顺序。

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

Android Activity生命周期与启动模式的更多相关文章

  1. Android Activity生命周期及启动模式

    曾经搞过许多东西,再熟练的东西一段时间没有碰都会生疏或忘记.后来体会到写成文档记录下来的重要性,但有些word或ppt记录下来的东西随着时间流逝会丢失,或者不愿去看.或许保存成博客的形式,会是更好的选 ...

  2. Activity生命周期以及启动模式对生命周期的影响

    前天用户体验反馈的一个需求,要求每次进入应用都定位到首页;这个操作很明显不适合放在首页Activity(启动模式为SingleTask)的onResume中,如果对Activity的启动模式和生命周期 ...

  3. Android查缺补漏--Activity生命周期和启动模式

    一.生命周期 onCreate():启动Activity时,首次创建Activity时回调. onRestart():再次启动Activity时回调. onStart():首次启动Activity时在 ...

  4. Android03-Activity生命周期及启动模式

    1.返回栈概念 2.生命周期 1. onCreate() 这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动 第一次被创建的时候调用.你应该在这个方法中完成活动的初始化操作,比如 ...

  5. Activity生命周期以及启动模式对生命周期的影响(二)

    前面一篇文章概述了Android四大组件之一的Activity生命周期方法的调用先后顺序,但对于非标准启动模式下Activity被多次调用时的一些生命周期方法并未详细阐述,现在针对该情况着重记录. 现 ...

  6. 关于activity生命周期,启动模式和tag

    Acticity启动模式 1.standard:Activity的默认加载方法,该方法会通过跳转到一个新的activity,同时将该实例压入到栈中(不管该activity是否已经存在在Task栈中,都 ...

  7. Android开发艺术探索(一)——Activity的生命周期和启动模式

    Activity的生命周期和启动模式 生命周期有? 1.典型情况下的生命周期—>指有用户参与的情况下,Activity所经过的生命周期改变 2.异常情况下的生命周期—>指Activity被 ...

  8. 《Android开发艺术探索》读书笔记 (1) 第1章 Activity的生命周期和启动模式

    第1章 Activity的生命周期和启动模式 1.1 Activity生命周期全面分析 1.1.1 典型情况下生命周期分析(1)一般情况下,当当前Activity从不可见重新变为可见状态时,onRes ...

  9. Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式

    Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...

随机推荐

  1. Ruby之基本数据类型(三)

    前言 上一节我们介绍了常量以及变量的用法,这一节我们开始来介绍Ruby中的一些基本类型. 数值类型(Fixnum.Bignum.Float) Ruby的数值类型包括整数和浮点数.整数包括Fixnum和 ...

  2. 5分钟用Spring4 搭建一个REST WebService

    前置技能 ① 使用maven来管理java项目 这个技能必须点一级,以便快速配置项目. 本文实际上是我学习Spring的过程中搬的官网上的demo,使用maven配置项目. ② jdk 1.8+   ...

  3. Objective-C中的单例模式

    ​    ​单例模式算是设计模式中比较简单的一种吧,设计模式不是只针对某种编程语言,在C++, Java, PHP等其他OOP语言也有设计模式,笔者初接触设计模式是通过<漫谈设计模式>了解 ...

  4. eclipse导入项目Archive for required library cannot be read or is not a valid ZIP file

    原因 :部分文件毁坏. 解决办法:1. 在eclipse中运行maven clean install 2. 报错,找到报错的文件物理删除,然后重新运行maven clean install  3. 循 ...

  5. VNC的安装和配置

    服务端环境:CentOS 6.7 客户端环境:Windows 7 1.服务器安装VNC服务端 2.编辑vnc配置文件 3.设定VNC的密码 4.查看vnc的会话信息 5.客户端测试vnc连接 Refe ...

  6. cssRules在不同浏览器中的兼容性

    在一份HTML文档中可以用三种方式添加样式信息: 1.通过<link>元素引用外部样式表: 2.通过<style>元素在文档的头部添加样式信息: 3.在具体的文档元素上通过st ...

  7. 五小步让VS Code支持AngularJS智能提示

    本文想通过配置VS Code来实现对AngularJS的智能提示.在一般的情况下对于在HTML页面是支持提示的.但是在js页面就不是很友好,它是记忆你之前的输入,要是之后有重复的输入,VS Code会 ...

  8. 学C++的经验总结

    下面的是学C++时要注意的. 1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<Thinking In C++>,不要看<C++变成死相>: 3.看<T ...

  9. C++_系列自学课程_第_6_课_bitset集_《C++ Primer 第四版》

    在C语言中要对一个整数的某一个位进行操作需要用到很多的技巧.这种情况在C++里面通过标准库提供的一个抽象数据类型 bitset得到了改善. 一.标准库bitset类型 1.bitset的作用 bits ...

  10. C++_系列自学课程_第_5_课_vector容器_《C++ Primer 第四版》

    再一次遇到 vector 这个单词; 每一次见到这个单词都感觉这个单词非常的 "高大上"; 数字遇到vector马上就可以360度旋转: 当 "电" 遇到vec ...