Activity四种启动模式:
1.standard:标准模式(默认模式):启动一次创建一次实例,如果启动activity的Context不是ActivityContext会报错,standard模式创建任务栈为包名,非ActivityContext没有任务栈名字。解决:1.用ActivityContext;2.指定Flag为Flag_Activity_new_Task,重新开一个任务栈。
2.singleTop:栈顶复用,如果已经为栈顶复用只调OnNewIntent()。onCreate()等不调用,不在栈顶,重新创建。
3.singleTask:栈内复用,单实例模式,如果在它需要的栈内有实例,直接调用,走onNewIntent(),将其置为top且清掉原来在它之上的activity。场景1.任务栈T1内有Activity ABC,D需要任务栈T2,那么会创建T2并把D压入。场景2.D需要任务栈T1,则直接在T1内创建D,这样T1内就是ABCD。场景3.启动B,任务栈为T1,此时直接调用B并清除C,这样T1内就是AB。
4.singleInstance:加强单实例,除了拥有singleTask的所有特点以为,它必须单独在一个任务栈,只要它在就不会重新实例。
TaskAffinity:任务栈名,给activity指定任务栈名后启动的activity就会在该任务栈存在,任务栈名为字符串且必须包含“.”。
allowTaskReparenting:属性值为Boolean,是否允许任务栈转移。
启动模式两种方法:显示和隐式。
1.显式:java类实现,优先级高,但不能指定singleInstance模式。
2.隐式:xml文件定义,不能指定Flag
Flag:
1.FLAG_ACTIVITY_NEW_TASK:singTask模式。
2.FLAG_ACTIVITY_SINGLE_TOP:singTop模式。
3.FLAG_ACTIVITY_CLEAR_TOP:与singleTask一块用,清掉它之上的所有。
4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:不再历史列表显示。可在xml文件内指定该属性为true。
举例1.前台任务栈内AB,后台任务栈CD,启动D,此时整个后退列表为ABCD;如果启动C,则后退列表为ABC,D被清掉。
举例2.standard模式A,singleTask模式BC且指定任务栈T2,顺序ABCAB。默认任务栈内A,T2内BC,此时C启动A,A会进入到T2,此时T2内为BCA,A再启动B,则CA会被清掉,这样默认任务栈内为A,T2内为B。点击一次后退,B被清掉,后台任务栈A显示,再后退一次,回到桌面。
举例3.taskAffinity+allowTaskReparenting,应用A启动应用B中Activity C,如果C需要任务栈转移,B启动后C直接从A的任务栈转移到B。