Activity的启动

来源:互联网 发布:肛门灌啤酒 知乎 编辑:程序博客网 时间:2024/06/04 18:20

主要知识点:

1.Activity和Task的启动模式有哪些? 每种含义是什么?

2.

3.对于android:taskAffinity这些问题大家也要了解。





 Activity的四种启动模式与Intent对象 (带FLAG_ACTIVITY_* 常量)共同决定activity组件在被调用时将要发生的动作。


在android里,有4种activity的启动模式,分别为:

“standard” (默认)

“singleTop”

“singleTask”

“singleInstance”

 

   四种模式主要可分成两组 "standard" 和"singleTop" 活动属于一个群组, 另一个群组包括 "singleTask" 和 "singleInstance" 。


   1) 如何决定所属task  

       "standard" 或者 "singleTop" 的Activity 启动模式可以多次被实例化。这些实例instances可以属于任意的task,且可以位于任意的activity栈中。它们被启动后将与调用startActivity方位于同一个task中(除非Intent对象包含FLAG_ACTIVITY_NEW_TASK属性,在这种情况下将启动一个新的task, ———见 taskAffinity

   属性).。

      2) "standard" 与 "singleTop"启动模式的区别只有一个方面::

“standard”对于每一个启动Intent都会生成一个activity的新实例,每个Instance处理一个单个的Intent。

“singleTop”的activity如果在目标task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。

singleTop要求如果创建intent的时候栈顶已经有要创建 的Activity的实例,则将intent发送给该实例,而不发送给新的实例。

当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法。

如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。

    在其它情况下————例如,如果一个“singleTop”Activity实例已经在目标task栈中存在,但是不在栈顶,又或者位于栈顶但不在目标task中——这时一个新的instance将会被创建且位于栈顶。

   举例:现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。

如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D

如果这时候给B发Intent的话,不管B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。


  3)相比较而言,, "singleTask" 和"singleInstance" activities can only begin a task. 他们总位于activitity栈底部,而且,在某一时刻设备中只能拥有一个该activity实例。 —有且只有一个task.

4)  "singleTask" activity 允许别的 activities 位于其所在的task中。该activity位于活动栈stack根部, but other activities (necessarily "standard" and "singleTop" activities) can be launched into the same task. 

   相反, "singleInstance" activity不允许其它的activity成为其所在的 task的一部分。“singleInstance”独占一个task,它是所在task中的唯一的activity, 如果它启动了一个新的activity,不管新的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。

For more information on launch modes and their interaction with Intent flags, see the Activities and Tasks section of the Application Fundamentals document.

它们主要有如下不同:

 

 

 






1. Intent的几种有关Activity启动的方式有哪些,你了解每个含义吗?

Intent的一些标记有

FLAG_ACTIVITY_BROUGHT_TO_FRONT 、

FLAG_ACTIVITY_CLEAR_TOP、如果被启动的activity已经运行在当前 task,将不会再创建新的活动实例,位于其上的其它activity将会被关闭。

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET、

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS、新的活动将不会只在在最近活动列表当中

FLAG_ACTIVITY_MULTIPLE_TASK

FLAG_ACTIVITY_SINGLE_TOP    如果目标Activity已经运行在栈顶,将不会再启动 

FLAG_ACTIVITY_NEW_TASK :

   当传递给startActivity()的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记时,系统会为需要启动的activity寻找与当前activity不同的task,如果要启动的activity的affinity属性与当前所有的task的affinity属性不相同,系统会新建一个带那个affinity属性的task,并将要启动的activity压到新建的task栈中;否则将activity压入那个affinity属性相同的栈中。



      2)相比较而言, "singleTask" 和 "singleInstance" 启动模式的activitity只能开启一个新的task(有且只有一个 task)。它们总是在activity栈的根部。而且,设备上在某一时刻只能拥有该activity的一个Instance。
      2)相比较而言, "singleTask" 和 "singleInstance" 启动模式的activitity只能开启一个新的task(有且只有一个 task)。它们总是在activity栈的根部。而且,设备上在某一时刻只能拥有该activity的一个Instance。
原创粉丝点击