经过好久的测试,终于把这些属性测试完了,真的无法想象会有什么样的各种情况 注:activity栈系列截图是上一篇提到的工具的截图
1、不能在一个应用中打开另外一个应用中的非入口activity,否则会报权限被阻的异常 2、如果打开的是主入口,且没有通过Intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK)设置,则会把新的activity添加到当前的activity所在的task内 3、如果设置了,则会从task栈中寻找是否有已启动的指定activity的task a、 如果有,则这个task放在栈顶,且把新创建activity添加到栈顶 (因为这个task放在了task栈顶这时候如果按回撤键,则会按这个task的activity栈依次出栈) b、如果没有,则新创建一个task,开启一个新的activity 4、activity和task关系可以简化为如下图
|- 开始正题 activity中launchMethod |- 默认是standard,就是常见的activity的调用,下边说剩下三种 1、 singleTop: 如果是singleTop类型,则栈顶的activity只能有一个这个activity。如果栈顶就是这个activity,再要打开这个activity,则会使用栈顶的这个实例,不会创建新的activity
注意onNewIntent()方法的说明 This is called for activities that set launchMode to "singleTop" in their package, or if a client used the Intent.FLAG_ACTIVITY_SINGLE_TOP flag when calling
startA ctivity. In either case, when the activity is re-launched while at the top of the activity stack instead of a new instance of the activity being started, onNewIntent() will be cal led on the existing instance with
the Intent that was used to re-launch it. (因为一个activity可能由不同的intent的启动 常用 如下方法设置新的intent,否则返回的会是第一次启动时候的Intent protected void onNewIntent(Intent intent) { ) 2、 singleTask a、单例的,即一个Task中只能有一个activity实例,但是这个activity也只能出现在所在应用运行的task中 b、如果没有设置flag也不会通过入口函数被包含在别的应用的task中
范例: 假设 actA为singleTask, 如果别的应用通过意图打开,且入口activity是singleTask,则会在新的Task中打开 如果任务栈中actA放在栈底部,再此打开actA,则,A之上的activity会清空 范例一: 应用A activity栈流程 且a2是singleTask的activity
taskA中打开顺序 a1 > a2 > a3 > a1 >
应用B,可以通过a1的入口activity打开应用A,因为没有设置flag,则默认会将a1加入应用B所在的task taskB中 actB> a1>
范例二: (taska)a1>home >(taskb)b>a1> 如果 此时打开a2,会自动切到taska 下打开a2
3、singleInstance: singleInstance纯粹是单实例,在一个独立task中创建,什么时候需要,如果task栈中,就拿过来用。如果没有则创建一个新的task
假设a1 是singleInstance类型的activity,所在的task 是task1 假设应用A调用activity的顺序是 a>a1>a2>a A 假设对应的task2, 则当调用a1的时候,会把task1放在栈顶,则activity栈对应的顺序是
但是,当调用完之后,打开a的时候,会把task2放在栈顶,新建的activity放在task2栈顶,而task1则被放到task2之下 这时候home键返回,打开B应用,假设要调用的流程是b1>a>a1>a2 则task2和task1放在了栈底,调用了b1>a之后如图
调用a1的时候,task1又被放到了栈顶 打开a2之后 ,没用了又被扔回去了,但是这里singleInstance类型的activity又有了特别之处
singleInstance类型的activity打开的activity如果不设置flag,默认也不会放在自己的task中,类型和设置flag为new_task是一样的,如果纯在应用对应的task,会放在这个task中(如例子中的task2),如果没有,则会创建一个新的task,把activity放进去
则,最后结果是把task2放在栈顶,task1其次,然后才是B应用在的task
当然,如果按回退键,就是按activity栈的顺序一次出栈
如果有什么疏忽的地方,希望同学多多指点... 或者这个问题太拗口了,实在难以表述,不懂的多交流
|
|