singleTask启动分析与试验结果(app内研究):
试验1、MainActivity是singleTask启动模式,启动顺序MainActivity-->A,A-->MainActivity
MainActivity.onCreate --myPid--1107--threadId--1--getTaskId--75--isTaskRoot--true
MainActivity.onResume --myPid--1107--threadId--1--getTaskId--75--isTaskRoot--true
A .onCreate --myPid--1107--threadId--1--getTaskId--75--isTaskRoot--false
A .onResume --myPid--1107--threadId--1--getTaskId--75--isTaskRoot--false
MainActivity.onNewIntent--myPid--1107--threadId--1--getTaskId--75--isTaskRoot--true
MainActivity.onResume --myPid--1107--threadId--1--getTaskId--75--isTaskRoot--true
A .onStop --myPid--1107--threadId--1--getTaskId--75--isTaskRoot--false
A .onDestroy --myPid--1107--threadId--1--getTaskId--75--isTaskRoot--false
可见进程id,线程id,taskid都相同。
MainActivity是栈的底部,再次启动MainActivity,进入的是onNewIntent,然后就会杀死位于其上的所有Activity的。
试验2、A是singleTask启动模式,启动顺序MainActivity-->A-->B,B-->A
MainActivity.onCreate --myPid--3827--threadId--1--getTaskId--82--isTaskRoot--true
MainActivity.onResume --myPid--3827--threadId--1--getTaskId--82--isTaskRoot--true
A .onCreate --myPid--3827--threadId--1--getTaskId--82--isTaskRoot--false
A .onResume --myPid--3827--threadId--1--getTaskId--82--isTaskRoot--false
B .onCreate --myPid--3827--threadId--1--getTaskId--82--isTaskRoot--false
B .onResume --myPid--3827--threadId--1--getTaskId--82--isTaskRoot--false
A .onNewIntent--myPid--3827--threadId--1--getTaskId--82--isTaskRoot--false
A .onResume --myPid--3827--threadId--1--getTaskId--82--isTaskRoot--false
B .onStop --myPid--3827--threadId--1--getTaskId--82--isTaskRoot--false
B .onDestroy --myPid--3827--threadId--1--getTaskId--82--isTaskRoot--false
分析如试验1。从结果中可以看出尽管A是singleTask启动模式,但并未创建信的task。而且其也不是task的根部。
总结:
1、singleTask并不是总是新建一个task任务栈,如果此app的栈(不包括singleInstance的任务栈,因为其单独享受一个task)已经存在,就会使用此栈,如果不存在就会创建一个新的task
2、Intent.FLAG_ACTIVITY_NEW_TASK 标志的作用同singleTask,所以它的使用结论同1。
3、当singleTask的Activity再次启动时,会清空在其以上的所有Activity,尽管它不是在task的根部。