最近一直在被activity之间传值问题所纠结,然后我所要求是不是简单的传值,它们包括应用间的传值与应用内的传值,并且加上了activity的加载模式,这个就有点不一样了。那今天就以android里activity的四种加载模式为话题说说吧。
总所周知,activity有四种加载模式:standard,singleTop,singleTask,singleInstance。standard模式也就是标准模式,是activity默认的模式,这个比较简单,就不讲。下面主要就说说其它三种。
singleTop
我觉得学习它得跟standard一起。他们唯一的却别就是,当一个启动目标为singleTop模式的activity已经有实例在当前Task栈顶的时候,activity不会重新实例化,而是使用在Task栈顶的那个activity(具体的过程:onResume->onNewIntent->onResume).
测试(由于情况太多,代码却简单,代码就不贴了,都是直接打log的事情):
第一种情况:应用里调用
A(main+launcher),B(singleTop) : A->B--startActivity-->B 同个Task,不重新生成一个B的实例
A(main+launcher),B(singleTop) : A->B--startActivityForResult-->B 同个Task, 会重新生成一个B的实例
第二种情况:应用间调用
A1(main+launcher),A2(main+launcher+singleTop) : A1->A2--startActivity-->A2 同个Task,不重新生成一个A2的实例
A1(main+launcher),A2(main+launcher+singleTop) : A1->A2--startActivity-->A2 同个Task,会重新生成一个A2的实例
看来,SingleTop模式似乎与启动方式有关,与是否是应用间调用没有关系:当以startActivityForResult方式启动时候,跟standard模式一模一样。
singleTask
它跟后面说的singleInstance一起学。他们的唯一却别就是:singleInstance模式的activity且只能存在一个单独的Task,且这个Task之鞥有且仅有它本身一个activity;而singleTask没有这个要求(即含有singleTask-activity的Task可以含有很多activity)。singleTask意思就是说:这个activity只能有一个实例,只能存在一个Task。官方上说:The system creates a new task and instantiates the activity at the root of the new task. However, if an instance of the activity already exists in a separate task, the system routes the intent to the existing instance through a call to its onNewIntent()
method, rather than creating a new instance. Only one instance of the activity can exist at a time. Although the activity starts in a new task, the BACK key still returns the user to the previous activity.我感觉没有说清楚,我们暂且不管,先测试:
第一种情况:应用里调用
A(main+launcher),B(singleTask),C : A-startActivity->B->startActivityForResult->C-startActivity->B 同个Task,不会重新生成B实例,C销毁。
A(main+launcher),B(singleTask),C : A-startActivityForResult->B-startActivityForResult->C-startActivityForResult->B 同个Task,不会重新生成B实例,C销毁。第1、3个startActivityForResult无法返回数据
数据如下:图片中的数据均是主界面TaskActivity开始截图的,上为
第二种情况:应用间调用
A1(main+launcher),A2(main+launcher+singleTask) : A1-startActivity->A2-startActivity->A2 不同Task,不会重新生成A2
A1(main+launcher),A2(main+launcher+singleTask) : A1-startActivityForResult->A2-startActivityForResult->A2 不同Task,不会重新生成A2,第1,2个startActivityForResult失效
看来,应用里调用singleTask模式的activity时候,不会产生新的Task,而应用间调用singleTask模式的activity时候,会产生新的Task。另外startActivityForResult函数对启动singleTask模式的activity会失效。另外,当重用前面的singleTask模式的activity时,该Task栈中间的activity会被销毁。
singleInstance
上面说了,这里就不讲了。测试结果就是:除了在应用里调用时为都不同Task,其它的都一样。
注意:“singleInstance”独占一个task,其它activity不能存在那个task里;如果它启动了一个新的activity,不管新 的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。而另外三种模式,则可以和其它activity共存。
总结:启动activity方法的不同,是否为应用间调用,不同activity加载模式都会造成预期的影响。太晚了,先发表吧,过几天会修复的。