开发者有时会问:为什么要为Activity指定加载模式?加载模式有什么作用?在这里,我简单的介绍以下,鄙人的理解:
Android中主要采用Task来管理Activity,当我们启动一个应用时,Android就会为之创建一个Task;然而Android中并没有为Task提供API,我们可以把Task理解为Activity栈,Task以栈的形式管理Activity.
1.在AndroidManifest.xml中配置Activity时,可以指定android:launchModel属性,该属性用于配置Activity的加载模式。
四大启动模式,只有singleInstance可能会重新创建一个全新的Task,拥有两个Task栈;其余的三种模式只有一个Task栈
2.启动模式可以在代码中启动,也可以在清单文件中设置
(1)代码中启动(借助Intent的flag属性)
(2)清单文件中配置
3.下面我写了一个Demo,两个Avrivity(A与B),每一个Activity里有一个TextView,两个Button
(1)AActivity.class
/** * Activity的四种启动方式: * standard:默认的模式,每次启动startActivity()方法都会新建一个Activity对象 * singTop:在当前任务栈中,判断栈顶是否为当前的Activity,如果是,直接使用;如果不是,再创建新的Activity,放入栈顶 * singleTask:在当前任务栈中,判断栈里是否存在Activity,如果不存在,创建一个新的Activity入栈;如果存在,会把该Activity之上的所有Activity清除出栈,显示当前Activity * singleInstance:新创建一个任务栈,放入新创建的Activity,该任务栈只允许存在一个Activity实例,如果已存在,那么切换到该任务栈。 * */ public class AActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_a); } //启动AActivity public void buttonOneClick(View view){ Intent intent = new Intent(this,AActivity.class); startActivity(intent); } //启动BActivity public void buttonTwoClick(View view){ Intent intent = new Intent(this,BActivity.class); startActivity(intent); } }
(2)BActivity.class
public class BActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_b); } //启动AActivity public void buttonOneClick(View view){ Intent intent = new Intent(this,AActivity.class); startActivity(intent); } //启动BActivity public void buttonTwoClick(View view){ Intent intent = new Intent(this,BActivity.class); startActivity(intent); } }
(3)activity_a.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_a" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.langdon.taiyang.androidtest.Intent.AActivity"> <TextView android:id="@+id/tv_activity_one" android:text="A-->Activity" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/bt_activity_one" android:layout_below="@+id/tv_activity_one" android:text="A--Activity" android:onClick="buttonOneClick" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/bt_activity_two" android:layout_below="@+id/bt_activity_one" android:text="B--Activity" android:onClick="buttonTwoClick" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout>
(4)activity_b.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_b" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.langdon.taiyang.androidtest.Intent.BActivity"> <TextView android:id="@+id/tv_activity_two" android:text="B-->Activity" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/bt_activity_three" android:layout_below="@+id/tv_activity_two" android:text="A--Activity" android:onClick="buttonOneClick" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/bt_activity_four" android:layout_below="@+id/bt_activity_three" android:text="B--Activity" android:onClick="buttonTwoClick" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout>
4.运行结果以及四种启动模式分析
![]() |
![]() |
从配置文件中可以看出AActivity没有设置launchMode属性,默认会启用standard启动模式,下面我们以图1分析启动模式
图1
(1)android:launchMode="standard"
当应用程序开启时,A(AActivity)入栈,在AActivity中点击B--Activity按钮,会重新创建BActivity实例,B(BActivity)入栈,同时跳转到BActivity中;然后在BActivity中点击A--Activity按钮,A(AActivity)入栈,同时跳转到AActivity中.Task栈中的情况如图1所示。
(2)android:launchMode="singleTop"
当应用程序开启时,A(AActivity)入栈,在AActivity中点击B--Activity按钮,会重新创建BActivity实例,B(BActivity)入栈,同时跳转到BActivity中;然后在BActivity中点击A--Activity按钮,A(AActivity)入栈,同时跳转到AActivity中.Task栈中的情况如图1所示。
Activity系列讲解---Activity的四大启动模式
原文:http://www.cnblogs.com/langdon/p/6266052.html