Activity四种启动模式的详解

本文详细介绍了Android中Activity的四种启动模式:standard、singleTop、singleTask和singleInstance的特点及应用场景,并通过示例代码展示了不同模式下Activity的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activity是Android的四大组件之一,Activity的启动模式一共有4种,分别是standard、singleTop、singleTask和singleInstance,可以在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式。如下图:


接下来就一一介绍并详解activity的启动模式:

Standard模式:是活动默认的启动模式,在不进行显示指定的情况下,所有活动都会自动使用这种启动模式。如果启动三个同样的活动,需要按三次back键才能退出。

新建一个项目,在activity_main.xml里添加一个按钮和文本:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.itman.activitydemo.MainActivity" >

    <Button
        android:id="@+id/bt_change"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="跳转到页面一" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/bt_change"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="68dp"
        android:textSize="30sp"
        android:text="这是页面一" />

</RelativeLayout>



在MainActivity.java里编辑如下代码:

public class MainActivity extends ActionBarActivity {
	private static final String TAG = "MainActivity";
	private Button bt_change;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Log.e(TAG, "我是页面一");
		bt_change = (Button) findViewById(R.id.bt_change);
		bt_change.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				startActivity(new Intent(MainActivity.this,MainActivity.class));
			}
		});
	}


}


运行此项目,点击跳转两次,查看LOG打印情况:


MainActivity一共启动了三次,这是需要点击三次back才可以退出项目。重复的活动需要不断的创建,这样做非常耗费资源。为了解决这种情况,于是就出现了singleTop模式。


singleTop模式:在启动活动是如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。如果目前MainActivity已经处于栈顶,每当想要再启动一个MainActivity时都会直接使用栈顶活动,因此MainActivity只有一个实例,仅按一次back键就可以退出程序。

之前的项目其他的代码无需改动,只需在AndroidManifest.xml中把MainActivity的启动模式设置成singleTop,如下图:


运行项目,并点击跳转,查看LOG打印情况:


你会发现不管点击多少次,MainActivity实例都只有一个,仅按一次back就可以退出项目。但是如果MainActivity不在栈顶,而是FristActivity在栈顶,栈里面MainActivity的实例在FristActivity实例的下面,这时再启动MainActivity它依旧会创建一个新的实例,而不是利用栈里面的实例,这种情况也会一定情况的耗费资源。但是singleTask模式可以应付这种情况。


singleTask模式:每当启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。

在先前的项目中添加一个activity_frist.xml布局文件,代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.itman.activitydemo.FristActivity" >

     <Button
        android:id="@+id/bt_change"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="跳转到页面一" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/bt_change"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="68dp"
        android:textSize="30sp"
        android:text="这是页面二" />

</RelativeLayout>


再添加一个FristActivity.java文件,别忘了在AndroidManifest.xml里注册活动FristActivity(Android四大组件都需在AndroidManifest.xml里注册

public class FristActivity extends ActionBarActivity {
	private static final String TAG = "singleTask";
	private Button bt_change;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.e(TAG, "我是页面二");
		setContentView(R.layout.activity_frist);
		bt_change = (Button) findViewById(R.id.bt_change);
		bt_change.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				startActivity(new Intent(FristActivity.this,MainActivity.class));
			}
		});
	}

}


最后别忘了把MainActivity的启动模式改成singleTask。运行项目点击跳转到FristActivity,再点击跳转回MainActivity,查看LOG打印情况:


当再点击跳转回MainActivity时,程序并没有新创建一个MainActivity的实例,而是直接使用栈里面的MainActivity实例,这时只需点击一次back便可退出项目。


最后一个启动模式有点特殊,理解起来比前面三种难一点,但也不是很难。

singleInstance模式如果活动指定了这个模式,启动该活动的时候就会启用一个新的返回栈来管理这个活动。正常而言我们项目里的活动都会有一个指定的栈来管理的,并且全部活动都由这个栈来管理。但是如果有活动指定了singleInstance模式,那么项目将会开启一个新的栈来管理这个活动。

在之前项目中添加多一个SecondActivity.xml布局文件和SecondActivity.java文件(别忘了注册),无需添加任何功能代码,只需添加一个LOG打印信息就可,并改动一下FristActivity里跳转页面的代码:



并把FristActivity设置成singleInstance模式:



运行项目,点击跳转页面一直跳转到页面三,查看LOG打印情况:



我们点击跳转的顺序是从页面一到页面三,但是当我们按back按钮的时候会发现,页面三会直接回到页面一,再按一次才页面二,再按一次才退出项目。这是因为页面一和三都是在同一个栈里,而页面二是指定了singleInstance模式,被另外一个栈管理着,所以才会出现这种情况。

以上就是activity四种启动模式的详解,各都有各的优点和特色,大家理解好,并根据项目的需求运用好不同的启动模式,希望能给大家带来帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值