在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。

Activity具有四种启动模式:standard、singleTop、singleTask、singInstance。启动模式可通过AndroidManifest.xm中Activity的launchMode属性配置,或者通过使用Intent flags设置。

standard模式

默认启动方式,当执行startActivity时,默认会创建一个新的Activity实例并加入到任务栈中。

singleTop模式

当执行startActivity时,如果当前任务栈中已经具有该Activity实例,并且位于栈顶,则不会创建新实例,而会调用原有实例的onNewIntent方法。否则,创建新的实例并加入栈顶。

比如:假如任务的后退栈中包含四个ActivityA-B-C-D(D位于栈顶)。当新的Intent希望启动D,而D得launchMode是默认的“standard”,则将会产生一个新的D加入到栈顶,则后退栈变成A-B-C-D-D。 如果D的launchMode是"singleTop",则原有的D实例将会通过onNewIntent来接受intent。则任务栈依然是A-B-C-D。 如果要求启动B,则将会新建一个D加入到栈中,即使B的launchMode是"singleTop"。

singleTask模式

如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的onNewIntent()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。

在这个位置,我有一个疑问,新创建的Activity实例是加入到原有任务栈中还是创建一个新的任务栈呢? 之所以会有这个疑问,是因为Google的官方文档上的描述是这样的:

文字信息是:

The system creates a new task and instantiates the activity at the root of the new task. However, if an instance of the activity already exists in a separate task, the system routes the intent to the existing instance through a call to itsonNewIntent() method, rather than creating a new instance. Only one instance of the activity can exist at a time.

大意是,对于设置为"singleTask"的Activity,如果在task中不存在该Activity实例,系统将创建一个新的task和新的Activity实例,然后将这个Activity实例放在新的task的根(也就是栈底)。如果已经存在该实例,则通过调用onNewIntent将intent传递给该实例。

我们的关注点放在是否创建新的task上,在我看来一个task就对应一个后退栈,那么是否意味着利用singleTask新创建的Activity实例会放到新的栈上呢?

在博客园或者CSDN上看到很多博主关于singleTask的模式的介绍都没有明确这一点,因此很是疑问。不过,在网上看到一篇文章《深刻理解Activity启动模式XXX》,应该能解答我的疑惑。里面有说到:

一个Activity的Launch Mode为singleTask时,在新建这个Activity时,默认taskAffinity情况下,一般不会新建task,taskAffinity属性默认application中是相同的,那么就会新建在当前栈。…… 其实,把启动模式设置为singleTask,framework在启动该activity时只会把它标示为可在一个新任务中启动,至于是否在一个新任务中启动,还要受其他条件的限制。增加一个taskAffinity属性给启动的singleTask的aty,那么将在新task启动。

对于这个问题暂时先搁置,之后想办法做实验进行验证。

singleInstance模式 

整个系统中有且只有一个该Activity实例,且该实例位于单独的一个栈中,该栈中有且只有一个该Activity。当再次启动该Activity时,调用onNewIntent传递intent。

一个Activity的Launch Mode为singleInstance时,总是在新的任务中开启,并且这个新的任务中有且只有这一个实例,也就是说被该实例启动的其他activity会自动运行于另一个任务中。当再次启动该activity的实例时,会重用已存在的任务和实例。并且会调用这个实例的onNewIntent()方法,将Intent实例传递到该实例中。和singleTask相同,同一时刻在系统中只会存在一个这样的Activity实例。

   一个Activity的Launch Mode为singleInstance时,与singleTask模式相同的是在新建这个Activity时,会把它放在一个新的stack中并置于顶部(即放在新的task中)。与singleTask模式不同的是,这个新建的task的stack永远只会有一个元素,就是这个Activity自己。如果这个Activity已经在某个Task的stack中了(这个stack必定只有一个元素,那就是这个Activity自己),此时只会调用它的onNewIntent(),而不会调用onCreate()。

最新文章

  1. Java 8函数编程轻松入门(四)方法引用
  2. Python中Unicode字符串
  3. Zabbix监控和分布式部署实施方案
  4. Firefly官方教程之Netconnect使用文档
  5. java汉字转拼音以及得到首字母通用方法
  6. php-mysql结果集函数比较
  7. [转] 用管道获得shell 命令的输出
  8. VS路宏 vc++于OutDir、ProjectDir、SolutionDir不同的路径
  9. WCF学习——构建第二个WCF应用程序(六)
  10. 基于MongoDB.Driver的扩展
  11. 两个MMCM共享时钟输入时的严重警告和错误
  12. Wndows下Apache+php+Mysql环境的搭建及其涉及的知识(转)
  13. Vue 知识整理—01-基础
  14. g++编译的makefile模板库和脚本
  15. java基础---->java8中的函数式接口
  16. Kaggle比赛NCFM图像分类任务简介
  17. 【题解】bzoj 4478 [Jsoi2013]侦探jyy
  18. 【UOJ#67】新年的毒瘤(Tarjan)
  19. jquery 显示 隐藏
  20. linux-修改时区时间

热门文章

  1. atm-interface-shopping
  2. React学习记录一
  3. DC84问
  4. Java List 的深拷贝
  5. 使用数组的splice方法以及循环嵌套来实现数组去重
  6. cf982d Shark
  7. HTML5/CSS3速成教程
  8. bash shell命令与监测的那点事(二)
  9. [python][django学习篇][15]博客侧栏--自定义模板标签
  10. mysql的下载及配置(复制1)