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的LaunchMode的设置

二,Activity的四种启动模式
 根据具体开发中的需求不同,Activity共有四种不同的启动方式,在Manifest.xml文件中,用launchmode属性设置Activity的启动模式:
 也许您希望应用中的 Activity 在启动时开始新任务(而不是放置在当前任务中);
 当启动 Activity 时,您希望将其现有实例上移一层(而不是在返回栈的顶部创建新实例);
 您希望在用户离开任务时,清除返回栈中除根 Activity 以外的所有其他 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>

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

三,任务的管理
 Activity的启动模式除了在AndroidManifest文件中静态声明之外,也可以在startActivity时通过Intent的标记设定。
 您可以使用的主要 Intent 标志包括:

FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_SINGLE_TOP

猜你喜欢

转载自blog.csdn.net/yyg_2015/article/details/70819451