1.A-standard B-standard
A-B(在每一次跳转都是重新生成Activity时,上一个Activity的onSaveInstanceState都会被调用)
B-A
返回到B (因为是从A返回到B,并且B 1088254416还存在task里,所以onRestart被调用,-->onStart-->onResume)
返回到A
返回 整个退出(A和B都为standard的结果是所有的Activity都是重新生成的,因为互相跳转后都不在栈顶。)
2.A-singleTop
A-A(因为还是启动ActivityA,并且task中存在又在栈顶,所以onResume直接被调用)
返回(整个退出)
这个模式在这个场景下比较有用,比如:如果有一个其他的应用想启动你的Activity(launch mode为singleTop),而你当前的Activity正好在栈顶,那么就会调用到onNewIntent方法
3.A-standardB-singleTask
A-B
B-A
A-B (因为启动另外一个Activity,但是task中又存在,所以onRestart被调用,-->onStart-->onResume)
返回到A
返回(整个退出)
当在调用到ActivityB的onNewIntent时,之前的ActivityA调用了onDestory。也就是说,系统发现栈中存在ActivityB的实例时,ActivityA和ActivityB都弹栈了。
4.A-singleTask
A-A
返回(整个退出)
5.A-singleTask B-singleTask
A-B
B-A(ActivityA已经存在task中,所以ActivityA调用onNewIntent。又因为是从ActivityB跳到ActivityA,所以ActivityA调用onRestart-->onStart-->onResume。并且ActivityB弹栈,调用onDestroy)
A-B(ActivityB已经onDestory,所以再次从ActivityA到ActivityB,ActivityB重新生成,onCreate-->onStart-->onResume。由于这个ActivityB是重新生成的,所以ActivityA就算launchMode是singleTask,也不会弹栈调用onDestroy)
返回到A
返回(整个退出)
------------------------------------------------------------------
A-singleTask B-singleTask
A-B
B-A
A-B
B-A
返回(整个退出)
6.A-singleTask B-singleInstance
A-B
B-A(除开每次跳转到新的Activity,上一个Activity的onSaveInstanceState会被调用;每次跳转到已经出现过的Activity,但因为切换了task,所以上一个Activity的onSaveInstanceState依然会被调用)
返回到B
返回(整个退出)
两个Activity是在不同的Task中,其次,当调用到onNewIntent时,ActivityB没有被Destroy,互不干涉。
A-singleTask B-singleInstance
A-B
B-A
A-B
返回到A
返回(整个退出)
7.A-singleTask B-singleInstanceC-standard
A-B
B-C
返回到A
返回到B
返回(整个退出)
刚进入应用,创建TaskA,ActivityA为栈顶,从ActivityA到ActivityB,ActivityB进入TaskB(如果再次进入ActivityB,则不创建Task,调用onNewIntent),此时TaskB中的ActivityB为栈顶,从ActitivyB到ActivityC,ActivityC为栈顶。
一直按返回键,先从TaskA中依次将Activity弹出,然后再从TaskB中将ActiviyB弹出。ActiviyC->ActivityA->ActivityB。
这里分析一个问题,浏览器的LaunchMode为singleTask,所以如果当你点击一个连接下载文件时(由一个activity来处理下载,launchmode为standard),如果再次进入浏览器,那么下载页面就被Destory了,那么这里我们可以把下载页面LaunchMode设置为singleInstance可以解决这个问题。