先给出结论:Activity的启动模式的设计的主要目的是为了解决应用页面交互需求的不同场景。
具体不同的启动模式,适合解决什么样的场景问题,我们先来看看Activity的启动模式都有哪些。
1、standard标准模式
在介绍标准模式之前,先介绍一下多个Activity实例在内存当中的维护数据结构是什么,所有的Activity实例被创建后,都会加入到栈数据结构中,在Android知识体系的术语中,被称为任务栈。任务栈是一种后进先出的数据结构。在后续的其它三种模式的介绍中,虽然其和标准模式存在差异,但无论如何是离不开栈这种数据结构的特性,亦即”后进先出“。这一句话,读起来不是很好理解,那么需要在后文中需要细致品味至理解。
那么标准模式正是每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。在这种模式下,启动了这个Activity,那么这个Activity就运行在启动它的那个Activity的任务栈中。比如Activity A启动了Activity B(B是标准模式),那么B就会进入到A所在任务栈中。
这里面有一个问题,android应用中的第一个Activity是如何启动的,第一个任务栈又是如何创建的?
在Android的应用工程中,我们应用程序能够启动,我们必须在Manifest.xml清单文件中,配置启动Activity,代码如下:
<activity
android:name=".business.user.activity.SplashActivity"
android:theme="@style/SplashTheme"
android:windowSoftInputMode="stateHidden|adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
本篇文章,主要是阐述Activity的启动模式,就不对Launcher Activity的过程做详细的分析,直接给出结论:应用的第一个Activity的启动,是通过系统交互行为完成的,并且在创建和启动这个Activity的时候,也会创建管理这个Activity的任务栈(点击桌面应用icon->创建用来管理Activity的任务栈->系统寻找对应的启动Activity)。
另外,标准模式的Activity是不能使用ApplicationContext去启动的,大多初学者,应该遇到过这样的错误,如下:AndroidRuntimeException: Calling startActivity from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.Is this really you want?
这里面的原因就是非Activity类型的context,并没有所谓的任务栈,解决这个问题的方法根据建议是设置标志位。但是通过设置标志位的方式,其实改变了当前Activity的启动模式,所以在实际应用开发的过程中,我们需要根据实际的场景去决定,是通过设置标志位的方式换掉当前要启动的Activity的启动模式,还是使用一个Activity的Context来满足当前Activity的启动。
使用场景结论:标准启动模式,适用于app里面的大部分普通页面&