1.A-standard B-standard


144723435.png

A-B(在每一次跳转都是重新生成Activity时,上一个ActivityonSaveInstanceState都会被调用)


Activity的LaunchMode_第1张图片

B-A


Activity的LaunchMode_第2张图片

返回到B (因为是从A返回到B,并且B 1088254416还存在task里,所以onRestart被调用,-->onStart-->onResume


Activity的LaunchMode_第3张图片

返回到A


Activity的LaunchMode_第4张图片

返回 整个退出(AB都为standard的结果是所有的Activity都是重新生成的,因为互相跳转后都不在栈顶。


2.A-singleTop

144755194.png

A-A(因为还是启动ActivityA,并且task中存在又在栈顶,所以onResume直接被调用)


144755366.png

返回(整个退出)


144755550.png

这个模式在这个场景下比较有用,比如:如果有一个其他的应用想启动你的Activity(launch modesingleTop),而你当前的Activity正好在栈顶,那么就会调用到onNewIntent方法


3.A-standardB-singleTask


144755870.png

A-B


Activity的LaunchMode_第5张图片

B-A


Activity的LaunchMode_第6张图片

A-B (因为启动另外一个Activity,但是task中又存在,所以onRestart被调用,-->onStart-->onResume

Activity的LaunchMode_第7张图片

返回到A


Activity的LaunchMode_第8张图片

返回(整个退出)


144934408.png

当在调用到ActivityBonNewIntent时,之前的ActivityA调用了onDestory。也就是说,系统发现栈中存在ActivityB的实例时,ActivityAActivityB都弹栈了。


4.A-singleTask


144934525.png

A-A


144952888.png

返回(整个退出)


144952599.png

5.A-singleTask B-singleTask


144952987.png

A-B


Activity的LaunchMode_第9张图片

B-AActivityA已经存在task中,所以ActivityA调用onNewIntent。又因为是从ActivityB跳到ActivityA,所以ActivityA调用onRestart-->onStart-->onResume。并且ActivityB弹栈,调用onDestroy


Activity的LaunchMode_第10张图片

A-BActivityB已经onDestory,所以再次从ActivityAActivityBActivityB重新生成,onCreate-->onStart-->onResume。由于这个ActivityB是重新生成的,所以ActivityA就算launchModesingleTask,也不会弹栈调用onDestroy






Activity的LaunchMode_第11张图片

返回到A


Activity的LaunchMode_第12张图片

返回(整个退出)


145010751.png

------------------------------------------------------------------

A-singleTask B-singleTask


145010913.png

A-B


Activity的LaunchMode_第13张图片

B-A


Activity的LaunchMode_第14张图片

A-B


Activity的LaunchMode_第15张图片

B-A


Activity的LaunchMode_第16张图片

返回(整个退出)


145029494.png

6.A-singleTask B-singleInstance


145029930.png

A-B


Activity的LaunchMode_第17张图片

B-A(除开每次跳转到新的Activity,上一个ActivityonSaveInstanceState会被调用;每次跳转到已经出现过的Activity,但因为切换了task,所以上一个ActivityonSaveInstanceState依然会被调用)


Activity的LaunchMode_第18张图片

返回到B


Activity的LaunchMode_第19张图片

返回(整个退出)


145046538.png

两个Activity是在不同的Task中,其次,当调用到onNewIntent时,ActivityB没有被Destroy,互不干涉。

A-singleTask B-singleInstance


145046504.png

A-B


Activity的LaunchMode_第20张图片

B-A


Activity的LaunchMode_第21张图片

A-B


Activity的LaunchMode_第22张图片

返回到A


Activity的LaunchMode_第23张图片

返回(整个退出)

145323255.png

7.A-singleTask B-singleInstanceC-standard


145323508.png

A-B


Activity的LaunchMode_第24张图片

B-C


Activity的LaunchMode_第25张图片

返回到A


Activity的LaunchMode_第26张图片

返回到B


Activity的LaunchMode_第27张图片

返回(整个退出)


145325304.png

刚进入应用,创建TaskAActivityA为栈顶,从ActivityAActivityBActivityB进入TaskB(如果再次进入ActivityB,则不创建Task,调用onNewIntent),此时TaskB中的ActivityB为栈顶,从ActitivyBActivityCActivityC为栈顶。


  一直按返回键,先从TaskA中依次将Activity弹出,然后再从TaskB中将ActiviyB弹出。ActiviyC->ActivityA->ActivityB


  这里分析一个问题,浏览器的LaunchModesingleTask,所以如果当你点击一个连接下载文件时(由一个activity来处理下载,launchmodestandard),如果再次进入浏览器,那么下载页面就被Destory了,那么这里我们可以把下载页面LaunchMode设置为singleInstance可以解决这个问题。