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
- //启动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生命周期与启动模式的更多相关文章
- Android Activity生命周期及启动模式
曾经搞过许多东西,再熟练的东西一段时间没有碰都会生疏或忘记.后来体会到写成文档记录下来的重要性,但有些word或ppt记录下来的东西随着时间流逝会丢失,或者不愿去看.或许保存成博客的形式,会是更好的选 ...
- Activity生命周期以及启动模式对生命周期的影响
前天用户体验反馈的一个需求,要求每次进入应用都定位到首页;这个操作很明显不适合放在首页Activity(启动模式为SingleTask)的onResume中,如果对Activity的启动模式和生命周期 ...
- Android查缺补漏--Activity生命周期和启动模式
一.生命周期 onCreate():启动Activity时,首次创建Activity时回调. onRestart():再次启动Activity时回调. onStart():首次启动Activity时在 ...
- Android03-Activity生命周期及启动模式
1.返回栈概念 2.生命周期 1. onCreate() 这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动 第一次被创建的时候调用.你应该在这个方法中完成活动的初始化操作,比如 ...
- Activity生命周期以及启动模式对生命周期的影响(二)
前面一篇文章概述了Android四大组件之一的Activity生命周期方法的调用先后顺序,但对于非标准启动模式下Activity被多次调用时的一些生命周期方法并未详细阐述,现在针对该情况着重记录. 现 ...
- 关于activity生命周期,启动模式和tag
Acticity启动模式 1.standard:Activity的默认加载方法,该方法会通过跳转到一个新的activity,同时将该实例压入到栈中(不管该activity是否已经存在在Task栈中,都 ...
- Android开发艺术探索(一)——Activity的生命周期和启动模式
Activity的生命周期和启动模式 生命周期有? 1.典型情况下的生命周期—>指有用户参与的情况下,Activity所经过的生命周期改变 2.异常情况下的生命周期—>指Activity被 ...
- 《Android开发艺术探索》读书笔记 (1) 第1章 Activity的生命周期和启动模式
第1章 Activity的生命周期和启动模式 1.1 Activity生命周期全面分析 1.1.1 典型情况下生命周期分析(1)一般情况下,当当前Activity从不可见重新变为可见状态时,onRes ...
- Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式
Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...
随机推荐
- 重磅开源:TN文本分析语言
tn是desert(沙漠之鹰)和tan共同开发的一种用于匹配,转写和抽取文本的语言(DSL).并为其开发和优化了专用的编译器.基于递归下降方法和正则表达式,能解析自然文本并转换为树和字典,识别时间,地 ...
- iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流
在上一篇博客中<iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流>,自定义瀑布流的列数,Cell的外边距,C ...
- Ubuntu杂记——链接ln的使用:创建和删除符号链接
原文链接:http://blog.csdn.net/janpylx/article/details/6761910 一 . 使用方式 ln [option] source_file dist_file ...
- codefordream 关于js初级训练
这里的初级训练相对简单,差不多都是以前知识温习. 比如输出“hello world”,直接使用console.log()就行.注释符号,“//”可以注释单行,快捷键 alt+/,"/* ...
- winform中textbox属性Multiline=true时全选
1.文本框右键属性 => 添加KeyDown事件. 2.添加如下代码: private void txt_result_KeyDown(object sender, KeyEventArgs e ...
- ZOJ Problem Set - 1115 Digital Roots
水题记录: 注:此题题目并没有限定数值的大小,所以要用字符串进行处理 #include <stdio.h> #include <string.h> int main() { ] ...
- Hive启动报错: Found class jline.Terminal, but interface was expected
报错: [ERROR] Terminal initialization failed; falling back to unsupported java.lang.IncompatibleClassC ...
- 【Python实战】机型自动化标注(搜狗爬虫实现)
1. 引言 从安卓手机收集上来的机型大都为这样: mi|5 mi|4c mi 4c 2014022 kiw-al10 nem-tl00h 收集的机型大都杂乱无章,不便于做统计分析.因此,标注显得尤为重 ...
- Scala比较器:Ordered与Ordering
在项目中,我们常常会遇到排序(或比较)需求,比如:对一个Person类 case class Person(name: String, age: Int) { override def toStrin ...
- Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)
一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...