Activity的四种启动模式--看Android开发艺术探索总结

2019-04-14 19:08发布

activity是有四种启动模式的:standard,singleTop,singleInstance,singleTask
android的任务栈,默认对于每一个应用都有一个任务栈,如果应用A中要启动应用B的activity,那么B中的Activity会加入到应用A的任务栈。默认情况下Activity加入的任务栈是启动这个Activity的组件所在的任务栈。
默认的启动模式是standard,这种启动模式每次都会重新启动一个Activity的实例,所以可能会出现在同一个任务栈中有同一个activity的多个实例,也可能出现一个activity的实例出现在多个任务栈中。
singleTop启动模式:对于这种启动模式的Activity,如果任务栈的栈顶刚好是当前的activity,则直接调用activity的onNewIntent()方法,如果不在栈顶则新建一个activity的实例。
singleTask启动模式:如果Activity A的启动模式为singleTask,要启动A,首先查看任务栈中是否有A的实例,如果有A位于栈顶的实例,则直接将intent发送给onNewIntent()处理,如果不在栈顶,则会把A前面的Activity出栈,这样就存在一个cleartop的功能,如果没有则新建一个A的实例。A要放入的任务栈,是要跟A在AndroidManifest中定义的taskAffinity有关系。 存在以下几种情况: 1.比如当前任务栈S1种列表为ABC,这个时候想启动在任务栈S2种的D,如果D在任务栈S2种,并且位于栈顶,那么就直接通过onNewIntent()启动任务D,这个时候S1 的堆栈顺序还是ABC,S2中的顺序还是D在栈顶;如果D不在栈顶,比如顺序为ACDEF,那么就会弹出EF将D切换到栈顶,此时S2顺序为ACD。 如果S2中没有D,则会新建一个D的实例,并将D放在栈顶。
2.如果D需要在任务栈S1中,如果S1中没有D的实例则创建一个D的实例放在栈顶,如果S1中存在一个D的实例,就会将压在上面的Activity先弹出,直到D在栈顶,通过onNewIntent()进行处理。
singleInstance启动模式:这种启动模式跟singleTask基本上是一样的。只有一个区别,在这个模式下的activity实例所处的task中,只能有这个activity实例,不能有其他的实例,一旦该模式的activity的实例已经存在于某个栈中,任何应用在激活该Activity时都会重用该栈中的实例,解决了多个task共享一个activity。
一般activity的启动模式还会跟taskAffinity和allowTaskReparenting clearTaskOnLaunch,finishOnTaskLaunch,alwaysRetainTaskState.

Activity在Activity栈中的加载顺序时可以通过intent.setFlag(flag)进行控制的。
Intent常用标示:
FLAG_ACTIVITY_BROUGHT_TO_FRONT 这个表示一般是系统进行设置,比如将ACtivity设置为singleTask。



对于这四种模式来说,只有standard的模式不存在通过onNewIntent()重新进行activity的启动,其它三种模式都会出现通过onNewIntent()重新启动acitivity。