Android中Activity四种启动方式

一,任务栈的理解
参考自:https://developer.android.com/guide/components/tasks-and-back-stack.html

1.闲扯两句

一个Android应用是包含若干个Activity的,每个 Activity 均围绕用户可以执行的特定操作设计,并且能够启动其他 Activity。 这些Activity之间可以借助Intent进行跳转,这些跳转的发起点一般也是Activity。例如,电子邮件应用可能有一个 Activity 显示新邮件的列表。用户选择某邮件时,会打开一个新 Activity 以查看该邮件。
想象一个场景,某一个应用因为实际需求包含了很多的Activity,Activity在代码层次上就是一个Java类,每启动一个Activity,其实就是创建一个实例或者说将后台的实例拿到前台运行。这个过程中,启动一个Activity是需要时间的,并且一个Activity从创建–>可见–>可交互,然后还会有一个数据的初始化过程,肯定是需要一定的时间的,如果这些Activity没有一个合适的数据结构去组织,再想要达到一个好的使用体验是很困难了。

2.Android系统对Activity的组织结构

摘自google官方
 考虑下上图这个启动的流程,当应用启动了Activity1之后,Activity1又启动了Activity2,Activity2又启动了Activity3,那么我们进行返回操作的时候,当然是回退到最后一幅图的状态。这样的数据结构就是一个栈的形式:“后进先出”。这样的结构对一般的依次启动,链式的跳转下一个Activity,常规的返回上一个Activity自然是可以胜任的。但是如果这样,在第三张图中,Activity3要启动Activity1,这种状态处理?
(1).将Activity1上面的两个Activity都pop出去,然后Activity1处于栈顶,通过系统回调方法的执行就可以再次恢复
(2).重新创建一个新的Activity1实例,然后onCreate()–>onStart()–>onResume()进行
(3).重新开一个新的栈,创建一个Activity1,然后onCreate()–>onStart()–>onResume()
dang,需要是一直在变的,早晚都会有这样那样的需求的,那么类似这些情况怎么去处理呢?

二,Activity的四种启动模式

哪四种?各有什么特征?

(1)standard 标准模式
只要创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新的创建的实例,退出Activity就会在任务栈中销毁该实例。
(2)singleTop 栈顶复用
这种模式会在当前要激活的Activity实例是否在任务栈顶,如果处于栈顶则不再重新创建新的实例,会重用已存在的实例,否则会在任务中创建新的实例。
(3)singleTask 栈内复用
对比singleTop模式,如果将要激活的Activity已经存在任务栈中了,则将该任务栈中该实例以上的Activity实例全部出栈,然后调用该实例的newIntance()方法重用该Activity,使该实例处于栈顶位置,否则就重新创建一个新的Activity实例。
(4)singleInstance 全局单例
当该模式的Activity实例在任务栈中被创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用该实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。
google官网的表格总结:
这里写图片描述

怎么设置launchMode?

  • 在Manifest.xml文件中,用launchmode属性设置Activity的启动模式:
<activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden"
            android:label="@string/app_name"
            android:windowSoftInputMode="adjustUnspecified|stateHidden"
            android:launchMode="standard|singleTop|singleInstance|singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
  • 通过在Intent中设置标记位指定launchMode
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
  • 启动模式和标记位的对应关系:
    • FLAG_ACTIVITY_NEW_TASK -> singleTask
    • FLAG_ACTIVITY_SINGLE_TOP -> singleTop
    • FLAG_ACTIVITY_CLEAR_TOP : 同一个任务栈中位于它上面的Activity都要出栈
    • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS -> android:excludeFromRecents
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TechMix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值