Activity的四种启动模式,浅析
概念:activity栈(Task),Android的Task是一个有点麻烦的概念,Android并没有提供可以调用Task的API,因此开发者无法直接访问到Task,只能调用activity的getTaskId()来获取它所在的Task的ID。事实上可以将Task理解成Activity栈,Task以栈的形式来管理activity:先启动的activity被放在栈底,后创建的activity被放在栈顶。
1.Standard
标准模式,是默认的加载模式。
通过Standard模式创建的activity,Android会为它创建一个新的实例,并将该实例放到当前Task栈中,(并不会生成新的Task栈)。
以下是相关操作:
开启activity :LaunchmodelAC -> 再次点击按键,开启LaunchmodelAC -> 再次点击按键,开启LaunchmodelAC -> 点击返回键 -> 点击返回键
下面是各个LaunchmodelAC实例(activity)的生命周期,TaskID.
可以看出:
在采用Standard模式时,
1.不会重新生成一个Task栈。
2.可以创建同一个activity的多个实例,并且多个activity的生命周期按照正常的执行。
3.新创建的activity的实例被放入到Task栈的栈顶。
4.当旧activity仍然在task栈内,但不在栈顶时(不在前台了),会依次执行旧activity的onPause() =>【新activity的onCreate(),onStart(),onResume() (新activity在前台了) 】=> 旧activityonStop(),但不会执行旧activity的onDestroy();
5.当activity不再位于前台,并且当前正处于Task栈顶,那么才会onPause(),onStop(),onDestroy()
2.SingleTop
SingleTop模式和Standard模式基本相似,但有一点不同:当将要启动的目标activity已经位于Task栈顶时,系统不会重新创建目标activity的实例,而是直接复用已有的activity实例。
点击按钮创建两次launchmodelAC的实例,结果如下图。
可以看到:
1.只创建了该activity的唯一一个实例,没有重新创建新的Task栈
2.activity的生命周期和Standard一致。
这个过程中Task栈的情况:从左到右==>栈底到栈顶
Task::MainAC --> LaunchmodelAC //从主菜单界面进入到LaunchmodelAC
Task::MainAC --> LaunchmodelAC //从LaunchmodelAC 进入到LaunchmodelAC,在栈顶所以不会重新创建实例
3.当该activity不位于Task栈的栈顶时(有其他的activity位于栈顶),和Standard模式一样,会再次为该activity创建一个新的实例放入栈顶。之前的实例仍然存在栈内原始位置。
这个过程中Task栈的情况:从左到右==>栈底到栈顶
Task::MainAC --> LaunchmodelAC //从主菜单界面进入到LaunchmodelAC
Task::MainAC --> LaunchmodelAC --> LaunchmodelAC2 //从 LaunchmodelAC进入到LaunchmodelAC2
Task::MainAC --> LaunchmodelAC --> LaunchmodelAC2 -> LaunchmodelAC //从 LaunchmodelAC2进入到LaunchmodelAC
Task::MainAC --> LaunchmodelAC --> LaunchmodelAC2 //从 LaunchmodelAC点击返回键
Task::MainAC --> LaunchmodelAC //从 LaunchmodelAC2点击返回键
3.SingleTask
采用SingleTask模式时,activity能够保证在同一个Task中只有一个实例,当系统采用SingleTask模式启动activity时,有如下三种情况:
1.如果将要启动的activity不存在,系统将会创建目标activity的实例,并将它放入Task栈顶;
2.如果将要启动的activity已经存在Task栈的栈顶,那么按照SingleTop模式行为一样,不会再重新创建该activity的实例;
3.如果将要启动的activity已经存在,但没有位于Task栈的栈顶,系统将会将位于该activity上面的所有activity移出Task栈,从而使目标activity转入栈顶。
可以看出:
1.打开LaunchmodelAC后,再开启LaunchmodelAC2,再从中打开LaunchmodelAC,此时点击返回键,直接就回到了主菜单界面了
这个过程中Task栈的情况:从左到右==>栈底到栈顶
Task::MainAC --> LaunchmodelAC //从主菜单界面进入到LaunchmodelAC
Task:: MainAC -->LaunchmodelAC --> LaunchmodelAC2 //从LaunchmodelAC 进入到LaunchmodelAC2
Task:: MainAC -->LaunchmodelAC //从LaunchmodelAC2进入到LaunchmodelAC
4.SingleInstance
在这个模式中,系统保证无论从哪个Task中启动目标activity,只会创建一个目标activity实例,并会使用一个全新的Task栈来加载该activity实例。
当系统采用SingleInstance模式启动目标activity时,可分为以下两种情况:
1.如果要启动的目标activity不存在,系统会先创建一个新的Task,再创建目标activity的实例,并将它放入栈顶。
2.如果将要启动的目标activity已存在,无论它位于哪个应用程序中、位于哪个Task中,系统都会把该activity所在的Task转到前台(一般会有一个切换的画面效果),从而使该activity显示出来。
需要指出的是,采用SIngleInstance模式加载的activity总数会位于Task栈顶,且采用singleInstance模式加载的activity所在的Task只包含该activity。
可以看出:
这个过程中Task栈的情况:从左到右==>栈底到栈顶:
Task1::MainAC --> LaunchmodelAC //从主菜单界面进入到LaunchmodelAC 、
Task1::MainAC --> LaunchmodelAC //Task1 的情况
Task2::LaunchmodelAC2 //Task1 的情况,以SingleInstance方式启动 LaunchmodelAC2,新建了一个Task2,并将LaunchmodelAC2放在栈顶
//此时从 LaunchmodelAC2点击返回键,回到了Task1,Task2被销毁
Task1::MainAC --> LaunchmodelAC //Task1 的情况
Task2::LaunchmodelAC2 //Task2 的情况
//此时以SingleInstance方式启动 LaunchmodelAC2,新建了一个Task3,并将LaunchmodelAC2放在栈顶
Task1::MainAC --> LaunchmodelAC //Task1 的情况
Task3::LaunchmodelAC2 //Task3 的情况
参考:疯狂Android(第四版).237