如何正确理解和使用 Activity的4种启动模式

关于Activity启动模式的文章已经很多,但有的文章写得过于简单,有的则过于注重细节,本文想取一个折中,只关注最重要和最常用的概念,原理和使用方法,便于读者正确应用。

Activity的启动模式有4种,分别是standard.singleTop. SingleTask. singleInstance,可以在AndroidMainifest.xml文件中指定每一个Activity的启动模式。一个Android应用一般都会有多个Activity,系统会通过任务栈来管理这些Activity,栈是一种后进先出的集合,当前的Activity就在栈顶,按返回键,栈顶Activity就会退出。Activity启动模式不同,系统通过任务栈管理Activity的方式也会不同,以下将分别介绍。

1 Standard模式

Standard模式是Android的默认启动模式,你不在配置文件中做任何设置,那么这个Activity就是standard模式,这种模式下,Activity可以有多个实例,每次启动Activity,无论任务栈中是否已经有这个Activity的实例,系统都会创建一个新的Activity实例,以下是实验验证。

新建一个FirstActivity,用一个Button去启动它本身:

发现每次都会启动一个新的FristActivity, Log信息如下

什么时候用standard模式呢?standartd模式是activity的默认模式,大部分情况下,都应该使用这种模式,也就是在配置文件中什么都不用做,当确实有特殊需求时,再考虑其他模式。

2 SingleTop模式

SingleTop模式和standard模式非常相似,主要区别就是当一个singleTop模式的Activity已经位于任务栈的栈顶,再去启动它时,不会再创建新的实例,如果不位于栈顶,就会创建新的实例,现在把配置文件中FirstActivity的启动模式改为SingleTop,我们的应用只有一个Activity,FirstActivity自然处于任务栈的栈顶。

当应用第一次启动后,我们再按Button去启动新的FirstActivity,发现Log信息中不再打印onCreate函数,说明不再创建新的FirstActivity实例。

这里有一个新的问题,对于每次启动Activity,我们该如何分别处理。答案就是onNewIntent()函数,虽然系统不会调用onCreat(),但会调用onNewIntent,我们可以在这个函数做相应的处理。

当一个Activity已经在栈顶,但依然有可能启动它,而你又不想产生新的Activity实例,此时就可以用singleTop模式。例如,一个搜索Activity,可以输入搜索内容,也可以产生搜索结果,此时就可以用singleTop模式,不会用户每次搜索都会产生一个实例。

3 SingleTask模式

SingleTask模式的Activity在同一个Task内只有一个实例,如果Activity已经位于栈顶,系统不会创建新的Activity实例,和singleTop模式一样。但Activity已经存在但不位于栈顶时,系统就会把该Activity移到栈顶,并把它上面的activity出栈。修改上面的程序,新建一个SecondActivity,将FirstActivity设置为singleTask启动模式,并让它启动SecondActivity,再让SecondActivity来启动FirstActivity。

Log信息如下

当SecondActivity启动FirstActivity时,并不会调用FirstActivity的onCreate函数,但会调用onNewIntent函数,同时会调用SecondActivity的onDestroy函数,SecondActivity实例被销毁。

singleTask模式和前面两种模式的最大区别就是singleTask模式是任务内单例的,所以我们是否设定Activity为singleTask模式,就是看我们activity是否需要单例,例如你的某个Activity

里面有一个列表,如果有多个实例,有可能导致用户看到的列表不一致,有的Activity需要经常启动,如果每次都创建实例,会导致占用资源过多,这些情况都可以使用singleTask模式,但启动singleTask模式的Activity会导致任务栈内它上面的Activity被销毁,有可能会影响用户体验,使用时要注意。

4 SingleInstance模式

singleInstance模式也是单例的,但和singleTask不同,singleTask只是任务栈内单例,系统里是可以有多个singleTask Activity实例的,而singleInstance Activity在整个系统里只有一个实例,启动一singleInstanceActivity时,系统会创建一个新的任务栈,并且这个任务栈只有他一个Activity。

SingleInstance模式并不常用,如果我们把一个Activity设置为singleInstance模式,你会发现它启动时会慢一些,切换效果不好,影响用户体验。它往往用于多个应用之间,例如一个电视launcher里的Activity,通过遥控器某个键在任何情况可以启动,这个Activity就可以设置为singleInstance模式,当在某应用中按键启动这个Activity,处理完后按返回键,就会回到之前启动它的应用,不影响用户体验。

以上分析了Activity的4种启动模式,将Activity设置为哪种启动模式并没有标准答案,有时候,你可能发现将某个Activity设置为一种启动模式或者另一种启动模式,并没有明显区别,而具体的评判标准就是看哪种模式更满足应用功能,更有利于用户体验。

Android activity启动模式相关推荐

  1. Android Activity 启动模式详解

    最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...

  2. Android Activity启动模式,回退栈管理!

    (一): Activity被回收了怎么办?当系统内存不足的时候Activity是有可能被回收的,打个比方用户在A Activity启动了B Activity那么A就处于停止状态,由于内存不足A会被回收 ...

  3. Android Activity启动模式总结

    简介 Activity 作为 Android 四大组件之一,几乎是被接触得最多的.Activity 中有个启动模式的概念,分别是 standard.singleTop.singleTask 以及 si ...

  4. android activity启动模式_从0系统学Android--2.5Activity启动模式

    本系列文章目录:更多精品文章分类 本系列持续更新中-. Activity 的启动模式一共有四种,分别是:standard.singleTop.singleTask.singleInstance .在实 ...

  5. android activity启动模式_Android知识点【Activity】清单文件

    哈喽 好久不见,最近太忙了 请大家原谅 今天我们来说一下android清单文件Activity都有哪些配置,来先上图: 大家一下子看了这么多属性可能觉得有些懵逼,我这边也是就常用的一些数据给大家做一下 ...

  6. android:Activity启动模式

    SingleTask与onNewIntent,onRestart ActivityA 在AndroidManifest.xml中配置launchMode="singleTask", ...

  7. Android初级开发笔记-- activity启动模式的学习(1)

    第一次学习Android中一个很重要的概念,启动模式.文章记录的也只是一些入门知识,随着学习的深入还会有activity启动模式的学习(2)和(3). 下面分三个小点说一下对启动模式的理解区别以及如何 ...

  8. Android中Activity启动模式详解

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

  9. Android中Activity启动模式

    Android中Activity启动模式一共是四种,这里我写一下我对其的理解: 1.standard(默认) 2.singleTop,如果某个Activity设置了该属性,且当前Activity就是这 ...

最新文章

  1. JavaScript中正则表达式学习(一)
  2. 5分钟,看尽芯片和摩尔定律“你追我赶”的抗衡50年
  3. 基于京东手机销售数据用回归决策树预测价格
  4. Objective-C设计模式——单例Singleton(对象创建)
  5. 我终于搞清楚了和String有关的那点事儿。
  6. 使用U盘在Windows与Mac上传输数据
  7. Python学生信息管理系统的开发
  8. 一文看懂搜狗招股书:90次提到AI,王小川持股5%,净利3.7亿
  9. java day08【String类、static关键字、Arrays类、 Math类】
  10. Atitit 部署了个webdav服务 as root 目录 1.1. WEB-INF copy to root dir only a web.xml use... 1 1.2. Java.ba
  11. 计算机无法连接到桌面,Win7系统桌面天气小工具提示解决方案无法连接到服务...
  12. SDN技术的发展应用任重而道远
  13. 互联网日报 | 2月8日 星期一 | 乐视回应App图标“欠122亿”;中国联通成立联通数科;高德地图上线13万个旅游厕所信息...
  14. Win10+VS2017+Pytorch-gpu+cude10.0+cudnn7.5环境搭建
  15. Html中a标签用法总结:创建email,电话,描点链接等。以及防止链接被搜索引擎收录
  16. 红楼梦人物出场统计python_红楼梦有多少人物统计(一)
  17. Python小程序之购买商品
  18. 精益管理的几大核心理念
  19. Halcon 第三章『Morphology形态学』◆第3节:顶帽运算与底帽运算
  20. 毗邻目录算法与左右值无限分支算法的结合

热门文章

  1. [css] 简述你对BFC规范的理解
  2. 工作298:无路由页面
  3. 前端学习(2783):封装myrequest并绑定到全局
  4. 前端学习(2388):封装请求模块
  5. 前端学习(2329):angular之路由
  6. 前端学习(534):多列布局1
  7. 前端学习(505):垂直居中的第一种方式的优点和缺点
  8. excel服务器2010网站,excel服务器2010
  9. 已知网友建立html,职称计算机模拟试题:Dreamweaver网页设计模拟试题及答案(5)...
  10. c语言冒泡排序法程序填空_【C语言】两种方式实现冒泡排序算法