分享

activity的launchMethod

 quasiceo 2015-03-24


经过好久的测试,终于把这些属性测试完了,真的无法想象会有什么样的各种情况

       注: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. 


An activity will always be paused before receiving a new intent, so you can count on onResume being called after this method. 
Note that getIntent still returns the original Intent. You can use setIntent to update it to this new Intent.

(因为一个activity可能由不同的intent的启动

常用 如下方法设置新的intent,否则返回的会是第一次启动时候的Intent

protected void onNewIntent(Intent intent) {
setIntent(intent);
super.onNewIntent(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 >

1、如果此时打开a2 ,则activity栈中只会剩下a1>a2

2、如果按home退出,然后打开应用B,

 

应用B,可以通过a1的入口activity打开应用A,因为没有设置flag,则默认会将a1加入应用B所在的task

taskB中

actB>        a1>

1、如果现在打开a2  则像设置flag_activity_new_task机制,如果task栈中没有A应用的task, 则在新的task中打开a2

2、当前A应用已经打开过,则a2之前的A  task中的a2之前的activity会被清空,则当前activity栈情况是  actB>a1 (taskB中)    a1>a2(taskA)

3.、回退的时候,按当前activity栈回退

 

 

范例二

         (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栈的顺序一次出栈

 

如果有什么疏忽的地方,希望同学多多指点...   或者这个问题太拗口了,实在难以表述,不懂的多交流

 

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多