微子学习Android之Activity启动模式

在进入启动模式学习前我们先了解一下:

1.一个应用程序一般都是由多个activity组成的。
2.任务栈(task stack)(别名back stack后退栈) 记录存放用户开启的activity的。(不懂请看微子学Android之Task和BackTask)
3.一个应用程序一被开启系统就给他分配一个任务栈,当所有的activity都退出的时候,任务栈就清空了。
4.任务栈的id是一个integer的数据类型 自增长的。
5.在Android操作系统里面会存在多个任务栈,一个应用程序一个任务栈。
6.桌面应用和一般的应用程序是一样的,任务栈的行为也是一样。
7.默认情况下, 关闭掉一个应用程序,清空了这个应用程序的任务栈。应用程序的进程还会保留。

下面进入正题。。。

Activity的启动模式

Android为了使我们能够打破默认的堆栈先进后出模式,提供了两个种方式:一种是在AndroidManifest.xml定义Activity时指定它的加载模式,另一种是在用Intent开启一个Activity时,在Intent中加入标志。如果两种方式都用了,则后者的优先级更高。
两种方式的差别在于,前者在于描述自己,向别的Activity等声明你们如何来加载我;而后者则是动态的,指出我要求你(要启动的Activity)以某种启动模式启动。

  根据Activity的不同的启动模式,它在Task Stack(别名 BackStack 回退栈)中的状态是不一样的。Activity可以通过AndroidManifest.xml清单文件配置,在节点中的android:launchMode属性设置。它有四个选项:

standard
singleTop
singleTask
singleInstance

standard
  标准启动模式,也是默认启动模式,如果不设置android:launchMode属性的话。standard模式下的Activity会依照启动的顺序压入Task Stack中。

  下图是standard模式下,Activity的压栈和回退操作示意图:
  这里写图片描述
  singleTop

  顶部单例模式,这种Activity启动模式,启动一个Activity的时候如果发现Task Stack的栈顶已经存在这个Activity了,就不会去重新创建新的Activity对象,而是复用这个栈顶已经存在的Activity对象,避免同一个Activity被重复开启。

  下图是singleTop模式下,Activity的压栈和回退操作示意图:
  这里写图片描述
  singleTop的应用场景很多,一般适用于可以复用而又有多个开启渠道的Activity,避免当一个Activity已经开启并获得焦点后,再次重复开启。比如说浏览器书签页面, 避免栈顶的activity被重复的创建,解决用户体验问题。,就是一个singleTop模式的Activity。Android的浏览器是基于WebKit内核编写的,它是支持JavaScript脚本语言的,可以通过JavaScript脚本设置浏览器书签,这样如果存在多个页面存在保存书签的JavaScript脚本,就会导致书签页面被多次开启,所以书签页面被设置为singleTop模式,这样可以避免在保存多个书签的时候重复开启书签页面。 应用场景:

singleTask

 开启一个Activity的时候,检查Task Stack里面是否有这个Activity的实例存在,如果存在的话,BackStack里这个Activity上所有的其他Activity都被弹出。

  下图是singleTask模式下,Activity的压栈和回退操作示意图:
  这里写图片描述
   singleTask的的适用场景为一般程序的主页面,当回退到主页面的时候,清除Task Stack中,它之上的所有Activity,这样避免程序导航逻辑的混乱。比如Android系统的浏览器的主页面,就是singleTask模式的,上面提到,android下浏览器是Webkit内核的,它是由C语言编写的,而每次打开新的网页如果重新开启一个Activity,是非常耗费系统资源的(需要解析HTML、Script脚本),所以被设置为singleTask模式,这样在浏览器应用里,无论打开多少个页面,使用的都是同一个Activity。所以以后如果存在很耗费系统资源的Activity,可以考虑使用singleTask开启模式。

singleInstance

  被标记为singleInstance启动模式的Activity,在启动的时候,会开启一个新的Task Stack,这个BackStack里只有一个Activity的实例存在,并且把这个Task Stack获得焦点。这是一种很极端的模式,它会导致整个设备的操作系统里,只会存在一个这个Activity示例,无论是从何处被启动的。

  下图是singleInstance模式下,Activity的压栈和回退操作示意图: 
  这里写图片描述
  singleInstance一般适用于需要在系统中只存在一个实例的场景,比如Android系统的来电页面,多次来电均使用的是一个Activity。

  当然,在Android中,除了在AndroidManifest.xml清单文件中配置LauncherMode属性外,还可以在代码中设置启动模式。在组件中,启动一个Activity,需要用到startActivity()方法,其中传递一个Intent,可以使用Intent.setFlags(int flags)来设置新启动的Activity的启动模式,而通过代码设置Activity的启动模式的方式,优先级要高于在AndroidManifest.xml清单文件中的配置。

Intent.setFlag(int flags)方法传递的一个整形的数据,被Android系统设置为了常量:

FLAG_ACTIVITY_NEW_TASK:这个标识会使新启动的Activity独立创建一个Task。
FLAG_ACTIVITY_CLEAR_TOP:这个标识会使新启动的Activity检查是否存在于Task中,如果存在则清除其之上的Activity,使它获得焦点,并不重新实例化一个Activity,一般结合FLAG_ACTIVITY_NEW_TASK一起使用。
FLAG_ACTIVITY_SINGLE_TOP:等同于在LauncherMode属性设置为singleTop。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值