Activity的启动模式可以在清单文件AndroidManifest.xml中,配置<Activity…/>元素的时候通过android:launchMode属性进行设置。
android:launchMode属性有四个选项,分别代表了不同的启动模式:
· standard:标准模式,也是默认启动模式。
· singleTop:单顶模式。
· singleTask:单任务模式。
· singleInstance:单例模式。
下面就这四个启动模式分别进行讲解。
standard是标准启动模式,也是默认启动模式。如果不为Activity设置启动模式的话,standard模式下的Activity会依照启动的顺序依次压入到当前任务(Task)的回退栈(Back Stack)中。
下图简单演示了standard的启动模式下,Activity的压栈与弹栈回退操作的示意图:
singleTop为单顶模式,在这种启动模式下,不会去重复创建Activity新的实例,而是复用这个栈顶已经存在的Activity,避免同一个栈顶的Activity被重复启动并压栈。
下图简单演示了singleTop的启动模式下,Activity的压栈与弹栈回退操作的示意图:
从上图可以很清晰的了解singleTop的启动模式下,Activity在回退栈(Back Stack)中的进出模式。singleTop的应用场景很多,一般适用于可以复用而又有多个启动渠道的Activity。Android系统中有一个应用就是应用了singleTop设置了Activity的启动模式,就是Android的浏览器。Android的浏览器是基于WebKit内核编写的,它是支持JavsScript脚本语言的,可以通过JavaScript脚本设置浏览器的书签。浏览器的书签Activity被设置为了singleTop模式,这样可以避免保存多个书签的时候,重复开启书签Activity。
singleTask是单任务模式。处于这种模式下的Activity,在被启动的时候,会检查当前任务(Task)的回退栈(Back Stack)中是否已经存在了这个Activity的实例,哪怕它并不处于当前回退栈(Back Stack)的栈顶。如果存在的话,将清空这个回退栈(Back Stack)中,这个Activity实例之上,所有其它的Activity,导致这个Activity处于栈顶并且获得显示焦点。
下图简单演示了singleTask的启动模式下,Activity的压栈与弹栈回退操作的示意图:
从上图可以很清晰的了解singleTop的启动模式下,Activity在回退栈(Back Stack)中的进出模式。而singleTask的适用场景为一般应用程序的主页面,当回退到主页面的时候,清楚任务栈(Back Stack)中,它之上所有的Activity,这样避免应用程序Activity导航逻辑的混乱。比如Android系统的浏览器应用的主页面,就被设置为了singleTask这个启动模式,前面提到,Android的浏览器是基于WebKit内核的,它是由C语言编写的,而每次打开新的网页如果重新开启一个Activity,是非常消耗系统资源的,所以被设置为了singleTask模式,这样在浏览器应用里,无论打开多少个页面,使用的都是同一个activity 。
singleInstance是单例模式,被标记为singleInstance启动模式的Activity,在启动的时候,会开启一个新的任务(Task),并将这个Activity压入新开启任务(Task)的回退栈(Back Stack)中,这个回退栈(Back Stack)里只有一个Activity的实例存在,并且使这个任务(Task)获得显示焦点。这是一种极端的模式,它会导致整个设备的操作系统里,只会存在一个这个Activity的实例,无论它是从何处被启动的。
下图简单演示了singleInstance的启动模式下,Activity的压栈与弹栈回退操作的示意图:
singleInstance一般适用于需要在系统中只存在一个Activity实例的场景,比如Android系统的来点页面,多次来点均使用的是同一个Activity的实例来显示。
当然,在Android中,处理在清单文件AndroidManifest.xml中配置<Activity…/>元素的时候设置android:launchMode属性之外,还可以在代码中,启动Activity的时候动态设置启动模式。在Android组件中启动一个Activity,需要用到startActivity()方法,其中传递一个Intent对象,可以使用Intent.setFlag (int flags)方法来设置这个Intent包含的待启动的Activity的启动模式。而通过代码动态设置Activity的启动模式的方式,其优先级要更高于在清单文件AndroidManifest.xml文件中对<Activity…/>元素的配置。
Intent.setFlags (int flags)方法传递一个整形的数据,被以整形常量的形式定义在Intent中,有非常多的选择,这里介绍几个常用的:
· FLAG_ACTIVITY_NEW_TASK:这个标识会使新启动的Activity独立创建一个Task。
· FLAG_ACTIVITY_CLEAR_TOP:这个标识会使新启动的Activity检查是否存在于Task中,如果存在则清除其之上的Activity,使它获得焦点,并不重新实例化一个Activity,一般结合FLAG_ACTIVITY_NEW_TASK一起使用。
· FLAG_ACTIVITY_SINGLE_TOP:等同于在LauncherMode属性设置为singleTop。