Android Activity 启动模式和任务栈

时间:2021-05-27 22:14:40

在了解了基本的Activity的生命周期后,我们能够很好的在一个Activity上面做相关的业务。但是这是不够的,因为Android通过任务栈来保存整个APP的Activity,合理的调度任务栈才能够提供良好的用户体验。而栈的结构,相信大家都知道——先进后出的线性表,新启动的Activity会位于任务栈的栈顶,处于活动的状态,其他的Activity虽然不在活动状态了,但是依然保留在任务栈中,处于停止的状态(也就是onStop被触发了,但是onDestory没有被触发)。

一般情况下,返回键和调用finish方法会移除顶部的Activity,然后让后面的Activity恢复活动,但是这也就是在一般情况下。AndroidMainfest.xml文件下面的属性 android:LaunchMode或者Intent的flag能够打破这种状态。

下面会先介绍一下AndroidMainifest的启动模式

  • standard
  • singleTop
  • singleTask
  • singleInstance

1.standard

默认的启动模式,如果不指定Activity的启动模式,则使用这种方式来启动Activity,这种模式下,每次启动都会创建新的实例,创建后的Activity都会覆盖在原Activity上面.下图展示的就是此启动模式下的栈的状态:

  Android Activity 启动模式和任务栈

2.singleTop

如果指定启动Activity为singleTop模式,启动时会判断当前栈顶是不是要启动的Activity,如果是则不创建新的Activity而是直接引用这个Activity,如果不是则创建新的Activity,这种模式通常适用于接受到消息后显示的界面。这种启动模式不会创建新的Activity,但在启动Activity的时候调用onNewIntent()方法。举个例子来说,当任务栈中有A、B、C三个Activity,而C的启动模式是singleTop的,那么在此启动C的时候,系统就不会创建C的实例了,而是会调用C的onNewIntent方法,当前任务栈中依然是A、B、C三个Activity。

3.singleTask

singleTask模式与singleTop类似,不过singleTop是检测栈顶是否是需要启动的Activity,而singleTask则是检测整个栈中是否存在当前需要启动的Activity,如果存在,就将该Activity置于栈顶,并将改Activity以上的Activity都销毁。不过这里是指在同一个App中启动这个singleTask的Activity,如果其他程序以singleTask模式来启动这个Activity,那么将创建一个新的任务栈。不过需要注意的是:如果启动的模式为singleTask的Activity已经在后台的一个任务栈里面了,那么启动后,后台的这个任务栈将一起被切换到前台,如图:

Android Activity 启动模式和任务栈

通过查看上图,我们也可以知道,使用这个模式创建的Activity不是在新的任务栈中被打开,就是将已打开的Activity切换到前台。使用的环境,读者自己去领悟吧,在这里就不多赘述了。

4.singleInstance

声明为singleInstance的Activity会出现在一个新的任务栈里面,这个任务栈只存在这一个Activity。此Activity被创建后是被共享的,也就是说再次激活此Activity的时候是不需要创建实例的,而是直接调出此Activity。

注意:如果在一个singleTop 或者 singleInstance 的ActivityA中通过startActivityForResult()方法来启动一个ActivityB,那么系统将直接返回Activity.RESULT_CANCELED而不会再去等待返回,这是由于系统在Framework层做了对这两种启动模式的限制,因为Android开发者认为不同的Task中间,默认是不能传递数据的,如果一定要传递,那就只能通过Intent。

除了在AndroidMainfest声明启动方式,也可以通过Intent来声明此次启动Activity的方式。 还有一些在AndroidMainfest里面做清理任务栈和其他的操作的标签,通过看相关的API文档能够很容易的了解到。这里不做过多的描述。还有就是,了解Activity的任务栈了,但是不要滥用,一定要根据项目的实际需求来使用任务栈.