在网上找了半天资料,还是很糊涂,纠结半天还是决定自己实践一下。由于不知道怎么在控制台查看返回堆栈,所以还是根据应用页面跳转来看栈中情况。
创建a,b两个应用,在a中只用一个页面AvtiviytA_1,b有两个页面AvtiviytB_1,AvtiviytB_2。AvtiviytA_1,AvtiviytB_1都使用按钮跳转AvtiviytB_2,Intentd的Flags都设置为FLAG_ACTIVITY_NEW_TASK。AvtiviytB_2中有一个按钮跳转AvtiviytB_1页面,Intent的Flags不设置。AvtiviytA_1和AvtiviytB_1的launchMode属性都为默认。
1、AvtiviytB_2的launchMode的属性默认
首先是AvtiviytB_2设置launchMode属性为默认。
在AvtiviytA_1中启动AvtiviytB_2,打开应用B。多次在AvtiviytA_1开启后,在应用b中点击返回,转到应用a,再次打开应用b,还有AvtiviytB_2。多次关闭后才最终退出。这说明AvtiviytA_1打开的AvtiviytB_2页面没有复用,在应用b的栈中存在多个AvtiviytB_2.
2、AvtiviytB_2的launchMode的属性singleTask
之后将AvtiviytB_2设置launchMode属性为singleTask,即栈内复用。
(1)只在AvtiviytA_1启动
只在AvtiviytA_1中点击按钮后启动了b应用,其中只有一个AvtiviytB_2页面,在AvtiviytA_1中多次点击也只有一个AvtiviytB_2页面。
(2)先在AvtiviytB_1启动,再在AvtiviytA_1启动
先启动AvtiviytB_1,点击按钮后启动了一个AvtiviytB_2,在点击按钮新建AvtiviytB_1页面。此时栈中从下向上应为:AvtiviytB_1-AvtiviytB_2-AvtiviytB_1。
再在AvtiviytA_1中启动,跳转到应用b,此时b的栈从下向上应为:AvtiviytB_1-AvtiviytB_2。按返回,先返回AvtiviytB_1,在退出b应用。
3、总结
FLAG_ACTIVITY_NEW_TASK会优先找亲和性(taskAffinity属性)一样的栈,有则根据要创建的Activity的launchMode属性决定新建或复用。如果没有亲和性一样的栈,就新建一个栈,再在栈中创建Activity实例。