Android 四种launchMode及疑问
之前对于四种模式的理解仅限于理论和一两个简单的测试(singleTop和singleTask)
今天脑袋抽风想都实际测一下,晕,测到 singleInstance杯具了
请对四种模式熟悉的朋友直接跳到文章底部,帮忙看下singleInstance的问题,谢谢
未标明launchMode的Activity都是默认启动模式
1,standard
每次都会新建一个Activity实例
2,singleTask
栈空间简易示意:A -- B -- C
最后用startActivity(intent)从C跳到A后,由于栈空间已经存在A的实例,A上面的Activity B和C出栈(即onDestroy销毁),A置于栈顶
如果A中重写了onNewIntent(...)方法,会同时接到C跳A的intent数据
3,singTop
栈空间简易示意:A -- B -- C
最后用startActivity(intent)从C跳到A后,即使栈控件已经存在A的实例,Android系统也会重新创建一个A的实例并且置于栈顶,当然重写的onNewIntent(...)方法也不会接到intent数据, 变成:
4,singleInstance(代码跳转逻辑:A -- B -- C -- A -- B -- C .....)
1,起始Activity非singleInstance (实际跳转顺序:A -- B -- C -- A -- B -- C .....)
A,C位于同一栈中,taskId相同, B在另一个栈中,与他们taskId不同,此栈在B未被销毁前只能有B一个Activity(B在创建之后,onNewIntent(...)也可以接到其他Activity跳转的intent数据),整个过程中,B只创建了一次,A与C每次都创建一个实例
2,起始Activity为singleInstance(实际跳转顺序:A -- B -- C -- A -- C -- A -- C .....)
代码中第一种情况相同,但实际跳转顺序却不同,
第一次A -- B -- C 实际跳转完成之后,当从C回到A(A在创建之后,onNewIntent(...)也可以接到其他Activity跳转的intent数据)后,再从A跳B时,却跳到了C页面,依次循环,整个过程中,B只是在一开始创建时出现了一次,之后从A都是直接跳C,A当然是单实例的,但是C也只创建了一次,相当于是单实例
多次跳转按物理返回键时:
如果当前页面是A,则A销毁,出现C,接着C销毁,出现B,B销毁,应用程序结束
如果当前页面是C,则C销毁,出现B,接着B销毁,出现A,A销毁,应用程序结束
返回键的实际跳转情况属于正常,因为A的taskId, 与B,C不同,不在同一栈中
但singleInstance的第2中情况,第一次A--B--C--A跳完之后,为啥从A却进入了C并且是之前的实例C,并不是想象中的新创建一个Activity B的实例 ?
求指教哈,谢谢...