- standard 默认启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。
- singleTop 如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
- singleTask
singleTask和下面的singleInstance 一样,都是全局唯一的,且 at the root of the new task。区别是singleInstance 栈中只能有它自己,它开启的activity,也要放在另一个栈里面(具体放在哪个栈里是由taskAffnity决定的,默认应该是原来那个应用程序所在的栈)而由singleTask开启的activity会放在singleTask所在的栈。 如果在栈中已经有该Activity的实例,就重用该实例(不会调用onCreate方法,会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
(!注意:只在AndroidManifest.xml配置activity为singleTask是不会创建新的任务栈的,还必须配置taskAffinity属性为一个不同于整个应用程序taskAffinity的值,该activity才会新开一个任务栈;如没有配置taskAffinity属性,则虽然没有分配新的任务栈,但其他特性还是有的,如重新打开时会调用newIntent,且会清空上面所有的activity等)
- singleInstance 也需要和taskAffinity共用才能产生效果。在一个新栈中创建该Activity实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity的实例存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。系统不会让其他的activities运行在所有持有的task实例中,这个activity是独立的,并且task中的成员只有它,任何其他activities运行这个activity都将打开一个独立的task。
备注:
1、task是比进程更高级的一个逻辑概念,用户的一个task,有可能包括多个进程,(如:application中调用了支付宝支付功能,则会把支付宝支付模块添加到自己的task中执行,但支付宝支付模块却是一个独立的进程,跑在支付宝的进程下的);一个进程也可以存在于多个task中,通过adb shell dumpsys activity可以观察到。
2、singleTask和singleInstance回退时都遵守先把进入的栈一个个弹出后再进入另一个栈回退。所以,他们回退顺序有可能与用户的操作顺序不同(特别是singleInstance)
参考:
http://developer.android.com/guide/components/tasks-and-back-stack.html
http://blog.csdn.net/luoshengyang/article/details/6714543
对activity的四种启动模式的理解
时间:2024-3-2 19:15 作者:韩俊 分类: Android
标签: android