大家都知道,相关的文章也很多:
standard :
标准模式,每次启动Activity都会创建一个新的Activity实例,并且将其压入任务栈栈顶,
而不管这个Activity是否已经存在。Activity的启动三回调(onCreate()->onStart()->onResume())
都会执行。
singleTop :
栈顶复用模式.这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,
所以它的启动三回调就不会执行,同时Activity的onNewIntent()方法会被回调.如果Activity已经
存在但是不在栈顶,那么作用于standard模式一样.
singleTask:
栈内复用模式.创建这样的Activity的时候,系统会先确认它所需任务栈已经创建,否则先创建任务栈.
然后放入Activity,如果栈中已经有一个Activity实例,那么这个Activity就会被调到栈顶,
onNewIntent(),并且singleTask会清理在当前Activity上面的所有Activity.(clear top)
singleInstance :
加强版的singleTask模式,这种模式的Activity只能单独位于一个任务栈内,由于栈内复用的特性,
后续请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了
不知是有些文章说的有误,还是我的能力有限,发现:singleTask并不会新创建独立的task,不知道上面的内容中是否说的这个意思。一下有我的代码验证:
写一个类,获取栈的相关信息:
public class TaskTest {
public static void showTask(Activity activity) {
ActivityManager activityManager = (ActivityManager) activity.getSystemService(Activity.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> list = activityManager.getRunningTasks(100);
int size = list.size();
ActivityManager.RunningTaskInfo task;
for (int i = 0; i < size; i++) {
task = list.get(i);
Log.v("栈id", "" + task.id);
Log.v("栈底activity", task.baseActivity.getClassName());
Log.v("栈顶activity", task.topActivity.getClassName());
Log.v("栈中activity数量", task.numActivities + "");
Log.v("栈结束", "===================================");
}
}
}
遗憾的是,只能获取栈中的顶和底两个activity信息,中间的都不知道。
在每个activity的onResume()方法中调用这个方法,查看控制台打印信息:
一、standard
栈id: 9
栈底: com.znke.android_task.AActivity
栈中: com.znke.android_task.BActivity
栈中: com.znke.android_task.CActivity
栈中: com.znke.android_task.DActivity
栈顶: com.znke.android_task.EActivity
栈: ===================================
栈id: 2
栈底: com.lenovo.launcher.Launcher
栈顶: com.lenovo.launcher.Launcher
栈: ===================================
A>B>C>D>E,5个activity顺序启动,都用标准模式。
发现整个进程中,出了activity的任务栈外,还有个Launcher的任务栈。
二、singleTop
栈id: 22
栈底: com.znke.android_task.AActivity
栈中: com.znke.android_task.BActivity
栈中: com.znke.android_task.CActivity
栈顶: com.znke.android_task.AActivity
栈: ===================================
栈id: 2
栈底: com.lenovo.launcher.Launcher
栈顶: com.lenovo.launcher.Launcher
栈: ===================================
A>B>C>A>A>A,启动顺序,A使用的是singleTop模式。栈顶上的A只有一份
三、singleTask
栈id: 20
栈底: com.znke.android_task.AActivity
栈顶: com.znke.android_task.AActivity
栈: ===================================
栈id: 2
栈底: com.lenovo.launcher.Launcher
栈顶: com.lenovo.launcher.Launcher
栈: ===================================
A>B>C>D>A启动顺序,A使用的是singleTask模式。栈顶还是A,只是它上面的其他activity全部没了
四、singleInstance
栈id: 14
栈底: com.znke.android_task.CActivity
栈中: com.znke.android_task.DActivity
栈顶: com.znke.android_task.EActivity
栈: ===================================
栈id: 13
栈底: com.znke.android_task.BActivity
栈顶: com.znke.android_task.BActivity
栈: ===================================
栈id: 12
栈底: com.znke.android_task.AActivity
栈顶: com.znke.android_task.AActivity
栈: ===================================
栈id: 2
栈底: com.lenovo.launcher.Launcher
栈顶: com.lenovo.launcher.Launcher
栈: ===================================
A和B用了singleInstance模式,其他的都是标准模式。