android 如何使用LaunchMode

今天,简单讲讲android的启动模式LaunchMode,以及如何根据自己的需要设置LaunchMode。

这个其实也很简单,我每次使用android studio新建activity时,系统都使用了默认的LaunchMode,即standard模式的LaunchMode。但是自己一直没有写博客总结这个功能,主要是没有必要。直到最近需要做一个功能,即App切换后台后,再次进入App时,需要跳到主页,而之前的activity需要自动销毁,这个功能当时居然不会做,于是在网上查找资料,最终发现LaunchMode可以解决这个问题。这里记录一下。

我们知道默认情况下,当我们多次启动同一个activity时,系统会创建多个实例并把他们一个个放入任务栈,当我们按back键,这些activity又会一个个退出。在讲activity的launchmode之前,我们有必要了解下“任务栈(Task Stack)”这个概念。在Android中是使用任务(Task)来管理Activity的,任务就是存放在栈里面的Activity的集合,这个栈就是称为任务栈。

概念解释

Task

Task叫做任务,这个简单,表示我们需要完成的事情,注意,这里我们说的是任务,是个名词,例如要发短信,那我们的任务就是发送一条短信,仅此而已,再例如教官说:”张三,你去吃屎!”,ok,那张三的任务就是吃屎。

Back Stack

我们常叫做回退栈,或者是任务栈,这个是什么意思呢?上面我们说过,需要完成任务,那我们就需要使用一系列的Activity来完成,例如发短信,则完成该任务需要如下步骤:

  1. 打开短信主页面MainActivity
  2. 点击添加短信按钮,打开NewSMSActivity
  3. 在NewSMSActivity中编写短信并发送

以上的任务中涉及到两个Activity,那这两个Activity就存放在这个Back Stack中,又因为Back Stack是栈类型的数据结构,所以上面的步骤在这个Back Stack中的活动顺序如下:

  1. MainActivity先压栈
  2. 点击添加按钮,NewSMSActivity压栈,
  3. 短信发送完成,点击返回按钮,NewSMSActivity弹栈,回到MainActivity
  4. 在MainActivity点击返回按钮,MainActivity弹栈,此时该Back Stack为空,就返回到Launcher了

所以我们明白了,这个回退栈其实就是一个存储Activity实例的容器,执行每个Task时,先创建一个Back Stack,在Task执行过程中将所使用的Activity都按照FILO的顺序以此压入这个Back Stack,Task目标完成之后,按下返回按钮时,Back Stack中的Activity按照压栈相反地的顺序以此弹栈,直到栈中没有Activity实例时,进入Launcher。

由此,我们还可以知道,每个Task和Back Stack是一一对应的关系,一般情况下,每需要执行一个Task时,都至少需要一个Back Stack容器,并且这个容器中都至少会有一个Activity实例。

Activity一共有以下四种launchMode:

standard

singleTop

singleTask

singleInstance

1.standard

standard是标准启动模式,也是默认启动模式,这种情况下,不管当前Back Stack(回退栈)中有没有要启动的Activity实例,系统 都会将一个新的Activity实例放在栈顶。假设我们现在有两个Activity,一个是MainActivity,另外一个是MainActivity2,我们先从MainActivity中启动MainActivity2,然后在MainActivity2中不断启动MainActivity2,看看效果:

因为启动模式是standard,所以每当我们打开一个Activity,就会有一个Activity放在Back Stack栈顶,因此,当我们多次打开MainActivity2之后,我们需要点击6次回退按钮才能回到主界面,虽然整个应用只有两个Activity,但是MainActivity2却在栈中保存了多份实例。

2.singleTop

singleTop就比较有意思了,当一个Activity的启动模式是singleTop时,如果当前Back Stack栈顶是要启动的Activity,那么就不会再创建一个Activity实例,而是直接显示当前栈顶的Activity,同时调用该Activity的onNewIntent()方法;否则就会创建一个新的Activity实例放在栈顶。还是上面那个栗子,改变Activity启动模式后我们看看有什么不同:

这下不管我们启动MainActivity2多少次,最终都只需点击两次后退按钮就能回到主界面,因为当MainActivity2处于栈顶的时候系统不会再创建新的MainActivity2实例,只是会调用当前实例的onNewIntent方法。

2.1应用场景

singleTop的使用场景还是比较多的,比如说我们目前正处在ActivityA上,这时系统忽然接收到一条广播,这条广播要求打开ActivityA,那么这个时候就没有必要再创建一次ActivityA放在栈顶,否则当你退出ActivityA的时候就会发现要连续点击两次才能退出ActivityA。还有就是微信的搜索功能,当我们点击搜索按钮之后,微信会跳转到查询结果页面,但是在查询结果页面,为了我们能够接着搜索,该页面上方还有搜索框,如此一来,如果不使用singleTop启动模式,那么当我们搜索十次之后岂不是要按十次返回键才能回到主页面?实际上肯定不是这样的,这里就是singleTop使用的最好例子之一。

3.singleTask

当一个Activity启动模式设置为singleTask时,如果要启动ActivityA,但是当前Back Stack中已经存在ActivityA只是不在栈顶,这个时候会将ActivityA上面的Activity全部移除,使得ActivityA处于栈顶,同时也会调用ActivityA的onNewIntent方法。换句话说,对于一个Activity而言,整个Back Stack中最多只存在它的一个实例。假如我们有两个Activity,这两个Activity的启动模式都是singleTask,在MainActivity中启动MainActivity2,在MainActivity2中启动MainActivity,然后点击回退按钮,会出现什么情况?看下图:

我们来简单分析一下,应用启动之后,Back Stack中只有一个MainActivity,当MainActivity启动MainActivity2的时候,这个时候栈中并没有MainActivity2,所以会创建一个MainActivity2的实例放在栈顶,当MainActivity2启动MainActivity时候,由于栈中已经有了MainActivity,只是不在栈顶,这个时候系统会将栈顶了MainActivity2移除(调用MainActivity2的生命周期方法),然后MainActivity就会处于栈顶,这个时候栈中只有一个Activity,所以点击一次回退按钮就能回到手机主界面。

3.1应用场景

singleTask一般用在应用程序的主界面,对于大部分应用,当我们在主界面点击回退按钮的时候都是退出应用,那么那么当我们第一次进入主界面之后,主界面位于栈底,以后不管我们打开了多少个Activity,只要我们再次回到主界面,都应该使用将主界面Activity上所有的Activity移除的方式来让主界面Activity处于栈顶,而不是往栈顶新加一个主界面Activity的实例(说到这里小伙伴们应该知道怎么样退出一个App了吧)。

.singleInstance

singleInstance总的来说用的还是比较少见,singleInstance和singleTask比较像,不同的是当我们将一个Activity启动模式设置为singleInstance时,当启动这个Activity时,系统会把这个Activity放在一个新的Task中,然后如果有其他应用要使用也从这个新的Task中调用该Activity。注意这里有了一个很大的不同就是系统中有了两个Task,假如我们有两个Activity,MainActivity和MainActivity2,MainActivity的启动模式为默认模式,MainActivity2的启动模式为singleInstance,当我们从MainActivity启动MainActivity2之后,然后点击home键,再从任务管理器回到MainActivity2,然后点击回退按钮,看看会出现什么情况:

当我们通过任务管理器回到MainActivity2的时候,点击一下回退按钮竟然没有回到MainActivity,而是直接退出应用,这是因为MainActivity2所在的栈中就它一个Activity,那么点击回退按钮当然会退出当前应用。

简单讲讲,其实standard模式就是每次跳转activity都新建activity,然后将之前的activity存入Stack栈顶,退出时从Stack栈顶取activity。singleTop模式基本和standard模式一样,只是如果跳转的activity已经在Stack栈顶,就不会重新创建activity,而是复用之前Stack栈顶的activity,并且回调activity的onNewIntent()方法,但是它的onCreate()、onStart()方法不会被调用。singleTask模式每次跳转activity时先看Stack栈是否存在跳转的activity,如果存在,则直接复用Stack栈的activity,系统会调用它的onNewIntent()方法。如果不存在,则新建activity,这是和standard模式一样。singleInstance模式比较特别,当跳转到singleInstance启动模式的activity时,系统会重新创建Stack栈,这里主要一点,singleInstance启动模式存入activity的Stack栈和直接的activity的Stack栈是不一样的,如何此时将singleInstance启动模式的activity存入Stack栈,那么按返回键是不能返回到之前的activity的,因为两个activity的Stack栈是不一样的。返回键的功能其实就是将相同Stack栈顶的activity取出,如果相同Stack栈没有activity,则退出App。

这里,大家应该已经知道了我开始提出的问题:App切换后台后,再次进入App时必须跳转到主界面,而之前的activity必须销毁,这个功能怎么做?其实就是将主界面的activity的launchmode设置为singleTask。因为当我们启动App时,首先跳转的是主界面,所以MainActivity位于Stack栈的栈底,其他界面都是通过MainActivity跳转的,所以当其他界面跳转到MainActivity时,由于栈中已经有了MainActivity,只是不在栈顶,这个时候系统会将MainActivity之上的activity移除,也就是销毁了activity。然后MainActivity就会处于栈顶,这个时候栈中只有一个Activity。

android 如何使用LaunchMode就讲完了。

就这么简单。

猜你喜欢

转载自blog.csdn.net/bzlj2912009596/article/details/81126214
今日推荐