这个知识估计快被人写烂了,但是为了自己印象深刻,我还是要自己写一次。>.<
注:文中cls都是Activity的class对象
1.standard
系统默认的启动方式,每次启都会创建一个新的Activity实例,一个任务栈允许多个该Activity实例存在,被启动的Activity自动放入启动它的Activity的任务栈,比如任务栈1中的Activity A启动了Activity B,则B自动放入任务栈1。
AndroidManifest.xml
<activity
android:launchMode="standard"/>
复制代码
Java代码
context是Activity实例
Intent intent = new Intent(context, cls);
context.startActivity(intent);
复制代码
context不是Activity实例 注意:该Activity的taskAffinity必须为默认值或者不设置
Intent intent = new Intent(context, cls);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
复制代码
2.singleTop
该启动方式下,如此该Activity的没有实例在任务栈,则创建一个实例放入栈顶;如果有实例在任务栈,但不在栈顶,则再创建一个实例放入栈顶;如果有实例在任务栈,且在栈顶,则不再创建实例。
任务栈1有A、B、C三个Activity,如果从栈底到栈顶的顺序为[A,B,C],singleTop方式启动C,则不再创建C的实例;如果从栈底到栈顶的顺序为如果从栈底到栈顶的顺序为[A,C,B],启动C,则重新创建一个C的实例,并放入栈顶[A,C,B,C]。
AndroidManifest.xml
<activity
android:launchMode="singleTop"/>
复制代码
Java代码
context是Activity实例
Intent intent = new Intent(context, cls);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(intent);
复制代码
context不是Activity实例
Intent intent = new Intent(context, cls);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(intent);
复制代码
3.singleTask
这是一种Activity的栈内单例模式,即只要该Activity所在任务栈有一个实例存在,启动它的时候都不会再次创建。启动这个Activity的时候,如果它的任务栈里没有这个Activity的实例存在,就会创建一个实例并压入它的任务栈顶;如果它的任务栈已经存在这个Activity的实例,就会清空这个任务栈所有在该Activity前面的Activity。
任务栈1有从栈底到栈顶的顺序为**[A,B,C],singleTask方式启动D,则创建D实例,放入任务栈1[A,B,C、D];任务栈1有从栈底到栈顶的顺序为[A,B,C],singleTask方式启动B,则不创建A实例,清空A上的所有Activity,任务栈变为[A,B]**。
AndroidManifest.xml
<activity
android:launchMode="singleTask"/>
复制代码
Java代码
context是Activity实例
Intent intent = new Intent(context, cls);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
复制代码
context不是Activity实例
Intent intent = new Intent(context, cls);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
复制代码
4.singleInstance
这是一种Activity的单例模式,拥有singleTask的所有特性,并且这种启动方式启动的Activity,系统会为它创建一个独立的任务栈,这个任务栈只允许该Activity存在。
AndroidManifest.xml
<activity
android:launchMode="singleInstance"/>
复制代码
Java代码
context是Activity实例
没找到
复制代码
context不是Activity实例
没找到
复制代码
另:onNewIntent(Intent intent)
该方法跟启动方式有关,当Activity的启动方式是singleTop、singleTask或者singleInstance时,如果不需要重创建实例,则调用已存在实例的onNewIntent(Intent intent) ,新的Intent传入onNewIntent(Intent intent)。