今天,简单讲讲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就讲完了。

 

就这么简单。

更多相关文章

  1. aFinal框架
  2. Android(安卓)startActivityForResult()的用法
  3. Message Android的享元模式
  4. activity和service之间的相互通信方法
  5. Qt on Android,输入法弹出后,界面无法自适应
  6. Android高频面试专题 - 基础篇(一)Activity
  7. Activity的四种加载方式
  8. Android常用功能实例
  9. android中file的使用实例

随机推荐

  1. 在SQL Server启动时自动执行存储过程。第
  2. sqlserver只有MDF文件恢复数据库的方法
  3. sqlserver 游标的简单示例
  4. SQL SERVER性能优化综述(很好的总结,不要
  5. SQL Server常用管理命令小结
  6. mssql无数据库日志文件恢复数据库的方法
  7. 用SQL建立索引的方法步骤
  8. MSsql每天自动备份数据库并每天自动清除l
  9. SQL语句实现SQL Server 2000及Sql Server
  10. sql高级技巧几个有用的Sql语句