文章目的:详解Activity的四种加载(启动)模式
前言:活动的启动模式在实际项目中我们应该根据特定的需求为每个活动指定恰当的启动模式。启动模式一共有四种,分别是 standard、singleTop、singleTask和singleInstance,可以在AndroidManifest.xml 中通过给<activity>标签指定android:launchMode属性来选择启动模式。
开发环境:
- 编写代码工具:Android Studio 2.2.2
- compileSdkVersion 25
- buildToolsVersion “25.0.0”
- minSdkVersion 19
- targetSdkVersion 25
- compile ‘com.android.support:appcompat-v7:25.0.0’
提示:文章末尾下载项目时注意开发环境的更改,以免造成不必要的时间浪费。
一、standard
standard 是活动默认的启动模式,在没有手动修改启动模式前提下,所有活动都会自动使用这种启动模式,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用standard 模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。
我们现在通过实践来体会一下 standard 模式,我们新建一个项目名叫ActivityLoadMode,在默认的布局文件activity_main中创建一个button,然后新建一个布局名叫second_main中创建一个button。
activity_main.xml中
<<span style="font-size:18px;">LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/first_button"
android:text="点击跳转到第二个Activity"/>
</LinearLayout></span>
second_main.xml中
<span style="font-size:18px;"><strong><</strong>LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/two_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击跳转到第一个Activity" />
</LinearLayout></span><strong>
</strong>
MainActivity.java中
public class MainActivity extends AppCompatActivity {
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("MainActivity", this.toString());
mButton = ((Button) findViewById(R.id.first_button));
/**
* 点击跳转到第二个页面
*/
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this,SecondActivity.class));
}
});
}
}
在SecondActivity.java中
public class SecondActivity extends AppCompatActivity {
private Button mButton;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_main);
Log.e("SecondActivity", this.toString());
mButton = ((Button) findViewById(R.id.two_button));
/**
* 点击跳转到第一个界面
*/
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(SecondActivity.this,MainActivity.class));
}
});
}
}
准备完毕,我们运行程序后,点击button来相互跳转。查看打印的日志Loge()
我们可以清楚的看到,Activity在不断的创建新的实例。
再放一张图来解释
二、singleTop
通过standard学习后,你会觉得standard模式不太合理,活动明明已经在栈顶了,为什么再次启动的时候还要创建一个新的活动实例呢?所以这时候就是singleTop发挥作用了。当活动的启动模式指定为 singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动, 则认为可以直接使用它,不会再创建新的活动实例。
我们修改 AndroidManifest.xml 中 MainActivity的启动模式,添加这句话android:launchMode="singleTop"
<activity
android:name=".MainActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
我们再次运行程序,执行和standard一样的操作。
我们会发现,这和standard怎么一样的?还是会创建新的实例。不要急,细心的你会发现,singleTop的意思是,栈顶的Activity打开自己时,不会创建新的实例。我们将MainActivity中的跳转方法改成这样:
public class MainActivity extends AppCompatActivity {
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("MainActivity", this.toString());
mButton = ((Button) findViewById(R.id.first_button));
/**
* 点击跳转到第二个页面
*/
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//startActivity(new Intent(MainActivity.this,SecondActivity.class));
//跳转自己
startActivity(new Intent(MainActivity.this,MainActivity.class));
}
});
}
}
看,是不是只创建了一个Activity!
三、singleTask
singleTask的存在就是为了解决singleTop重复创建栈顶活动的问题。当活动的启动模式指定为singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
我们修改AndroidManifest.xml
<activity
android:name=".MainActivity"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
修改完成后,我们再次运行程序,两个Activity之间来回切换,会发现只创建了一个MainActivity,而且在MainActivity点击返回,就可以退出程序了。
四、singleInstance
singleInstance 模式应该算是四种启动模式中最特殊也最复杂的一个了,指定为 singleInstance 模式的活动会启用一个新的返回栈来管理这个活动。因为本篇为新人向讲解,而singleInstance在应用中并不多,所以不多做解释,直接放个图,简单理解一下。
五、总结
Activity的启动模式在我们应用开发中,最常用的依然是默认的standard模式,我们要根据不同的开发需求,选择不同的启动模式,可以更加简单的处理我们的代码逻辑。
项目下载地址:http://pan.baidu.com/s/1kURDm5p
欢迎大家加微信进行技术交流和提出意见, 欢迎大家关注我的微信公众号,我一定会最快回复你!