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).。
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。
在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).。
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。