在说Activity启动模式之前,先说下Activity Task栈:
Task任务栈是用来管理应用程序Activity的一个容器,可简单理解为,一个应用程序就是一个Task.
但是并不是说一个应用程序就只有一个Task,可以有多个Task,
而Activity启动模式就是基于栈的。
Activity启动模式有以下4种 :
1,Standard
2,SingleTask;
3,SingleTop
4,SingleInstance
Standard:
activity默认启动模式,即在Androidmanifest.xml中没有对<activity>标签进行设置launchMode时,
这种模式就是每次启动都会在Activity Task栈中压入一个Activity.即使它已经存在这个栈里面,也不会复用。
onCreate()-->onStart()--onResume()-->onPostResume()
SingleTask:
即将被激活的Activity将只存在一个Task中,不能指定其运行在另外一个Task,而这个Task的创立一般由
RootActivity即栈底的Activity来实现,比如我们应用的MainActivity,当我们把MainActivity的launchMode置为"SingleTask"
时,整个应用的Task即已被确定。且SingleTask启动模式的Activity,会在它被激活时,把位于它上面的Activity都Push出栈。
这个对于返回退出应用处理很方便。
第一次创建时:onCreate()--->onStart()-->onResume()-->-->onPostResume()
第二次被激活,如果存在栈里面:
onNewIntent()-->onResume()--->onPostResume()
SingleTop:
当启动或激活这个模式的Activity时,系统首先会从Task栈顶去找这个Activity 是否已经存在,如果栈顶存在则直接用,
onNewIntent()-->onResume()-->onPostResume()
如果栈顶不存在,即使栈里面存在这个Activity,其也会重新创建。onCreate()-->onStart()-->onResume()-->onPostResume()
SingleInstance:
这个启动模式可以理解成与SingleTask相反,SingleTask是确保同一Task,是可以允许别的Activity存在的,
而SingleInstance是单例,单独的一个Task,单独的Activity,
如:MainActivity启动,创建的TaskId为276,点击btn跳转至A界面,A的launchMode="SingleInstance"
在A界面,getTaskId(),打印值为277
返回再点击跳转至A界面,getTaskId()=288;
当启动或激活这个模式的Activity时,系统也是首先从Task里面找,有没有存在,如果存在,则直接复用,
当点击返回时,Activity随即销毁。
onNewIntent()-->onResume()-->onPostResume()
界面跳转如下:
A-->B(singleInstance)-->C--->B
返回:
B-->C-->A
备注:当程序退出,再进入时,MainActivity中getTaskId()=289,在整个系统栈中,它是累加的,