Android开发艺术探索 读书笔记3

三、Activity的启动模式

最近事情比较多,没有系统的学习时间,也没有时间写博客。导致停滞了一周多,今天抽时间继续我的学习之旅。

在实际情况中,在一个App中,系统会创建一个任务栈,将我们的Activity实例一一放入,而任务栈是一种后进先出的栈结构。所以在最后打开的Activity是在最上层,而只有后面的Activity销毁后,我们才能看到前面的Activity。而在反复启动同一个Activity的时候,系统重复建立多个实例,会十分的浪费资源。在设计Activity启动的时候,有考虑到这种情况,所以就有了LunchMode。

目前有四种启动模式

1.standard: 标准模式 系统默认模式,每启动一个Activity都会创建一个新的实例,不管之前创建过与否。被创建的实例的生命周期都符合典型的Activity的生命周期。他的onCreate、onStart、onResume都会被调用。这是一种典型的多实例实现。在这个模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。(当我们用ApplicationContext去启动standard模式的Activity时候,会报错。由于非Activity类型的Context并没有所谓的任务栈,解决这个问题的方法就是为带启动Activity指定FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候回为它创建一个新的任务栈,这个时候启动Activity实际上是以singleTask模式启动的)

注:一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。

2.singleTop:栈顶复用模式,这种模式下,如果Activity出去任务栈的栈顶,再次启动Activity的时候,不会被重新创建实例,同时它的onNewIntent方法会被调用。通过这个方法可以取出当前请求的信息,需要注意的是,这个Activity的onCreate、onStart不会被系统调用。如果Activity已存在实例,但是不在栈顶,系统仍然会创建新的实例。

3.singleTask:栈内复用模式。这是一种单实例模式,在这种模式下只要Activity在一个栈存在,多次启动这个Activity都不会在这个栈中创建新的实例,系统也会调用onNewIntent。在明确栈标志位的时候,系统启动singleTask模式的Activity的时候,会先寻找是否存在目标任务栈,如果不存在则创建一个目标栈,如果存在,就看目标栈中是否存在Activity的实例,如果不存在,就创建实例并压入栈中,如果实例存在则会吧Activity调到栈顶并调用onNewIntent,此时将Activity调到栈顶的时候,会将该Activity实例上方的所有实例清出栈。(例如:任务栈s中,有ADBC四个实例,C在栈顶,此时系统启动目标栈为s的singleTask模式的D,启动完成则任务栈s中为AD,而对于BC则已经出栈)。

4.singInstance:单实例模式,该模式下,除了拥有singleTask所有特性外,具有此种模式的Activity只有单独地位于一个任务栈,换句话说该模式下,启动Activity,系统会为它创建一个新的任务栈,然后Activity独自在这个新的任务栈中。并在这个栈中,处于singleTask模式。

今天到这了,后面继续复习Activity启动的所需目标栈,就是对应TaskAffinity。以及allowTaskReparenting属性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值