我的第一篇博客——从android开始:
接下来就记录一下我在学习Activity启动模式的时候所学到的东西,大部分也都是从一些前辈写的书籍上面了解的,这里之所以写下来的目的主要是要对自己所学的东西有个系统的整理,同时也有助于之后的学习。而且我也会加入自己在学习的过程中通过代码验证得来的更加直观的结果。
Activity的启动模式(属性名为LunchMode):
1.standard(标准模式),关于标准模式,这也是系统默认的模式。标准模式的特点就是,当我们多次启动同一个Activity的时候,系统就会创建多个实例并把它们放到任务栈中,也就是说每启动一个标准模式下的Activity,系统都会创建一个新的实例。同时被启动的Activity会被放到所启动它的那个Activity的任务栈中。
从命令行打印出系统任务栈的情况,可以看出,在APP中我先点击按钮调用MainActivity然后调用SecondActivity,最后在调用MainActivity,此时的MainActivity创建了新的实例。(此时MainActivity和SecondActivity的启动模式都为standard模式)
2.singleTop(栈顶复用模式),通过字面意思我们可以看出,当Activity处于栈顶时,启动该Activity则不用在创建该Activity的实例,但是当栈顶的Activity不是要启动的Activity时,系统就会创建新的实例。
在本次调试中,Activity的启动顺序是MainActivity->ThridActivity->SecondActivity->SecondActivity,从打印出来任务栈的情况我们可以看出,SecondActivity只有一个实例。(其中MainActivity和ThirdActivity的启动模式是standard模式,SecondActivity的启动模式是SingleTop模式)
3.singleTask(栈内复用模式),这是一种单例模式,在这种模式下,只要栈内存在该Activity的实例,系统就会调用该Activity,但同时,在该模式下的Activity会有一种clearTop的效果,即会导致该栈内所用该Activity上的活动全部出栈。
Activity的启动顺序是MainActivity->SecondActivity->ThridActivity->MainActivity->SecondActivity->ThridActivity,从任务栈打印的结果可以看出,在任务栈中只用三个Activity,其中每个Activity只存在一个实例。(MainActivity的启动模式是standard模式,SecondActivity的启动模式是SingleTop模式,ThridActivity的启动模式是SingleTask模式,从而可以看出SingleTask模式有清除它在栈内在它上面的Activity实例)
4.singleInstance(单实例模式),这种模式的特性与singleTask相近,但是使用这种模式的Activity,在被启动时,系统会为该Activity单独的开辟一个任务栈,并且只要这个任务栈不被系统销毁,当启动同样的Activity时,都会调用该Activity。
Activity的启动顺序是MainActivity->SecondActivity->ThridActivity-->MainActivity->SencondActivity->ThridActivity,从任务栈的打印情况我们可以看出总共有两个任务栈,其中SecondActivity单独存在一个任务栈中,MainActivity和ThridActivity存在一个栈中。(MainActivity的启动模式为standard模式,SecondActivity的启动模式是singleInstance,ThridActivity的启动模式为SingleTask模式)
在开发的过程中,我们可以根据不同的情况,选用最为适合的启动模式来适应我们的软件功能。
demo测试的部分代码如下(这里只列出配置代码,其他代码只是Activity之间的相互调用就不在列出):
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:launchMode="standard"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SeconedActivity" android:launchMode="singleInstance"> </activity> <activity android:name=".ThridActivity" android:launchMode="singleTask"> </activity> </application>