Activity四种启动模式的详解

原创 2017年05月02日 22:20:06

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四种启动模式的详解,各都有各的优点和特色,大家理解好,并根据项目的需求运用好不同的启动模式,希望能给大家带来帮助。

版权声明:欢迎以任何形式转载,但请注明作者和出处

Activity四种启动模式详解

最近在学习《Android开发艺术探索》,所以对所学习到的知识做个总结,就算是做笔记吧。 Activity的启动模式目前有四种,分别是standard、singleTop、singleTask和si...
  • Mr_wzc
  • Mr_wzc
  • 2016年06月23日 20:16
  • 2677

Activity的四种启动模式及使用场景

standard、singleTop、singleTask、singleInstance 默认Activity为standard标准模式,多次启动同一个Activity时,系统会创建多个实例,在这种模...
  • Liu_yunzhao
  • Liu_yunzhao
  • 2017年10月16日 22:47
  • 807

[Android开发]Activity的四种启动模式及其应用场景

启动模式(launchMode)在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用...
  • CodeEmperor
  • CodeEmperor
  • 2016年01月08日 11:39
  • 15570

Activity四种启动模式说明

1,standard标准模式: 每次启动一个Activity都会重新创建一个实例,即调用Activity创建时的生命周期方法onCreate,onStart,onResume;被启动的Activity...
  • u011959433
  • u011959433
  • 2016年03月21日 15:54
  • 2141

彻底弄懂Activity四大启动模式

最近有几位朋友给我留言,让我谈一下对Activity启动模式的理解。我觉得对某个知识点的理解必须要动手操作才能印象深刻,所以今天写一篇博文,结合案例理解Activity启动模式。由于之前看过“区长”的...
  • mynameishuangshuai
  • mynameishuangshuai
  • 2016年05月24日 16:04
  • 59143

Activity四种启动模式的利用场景

一.singleTask: 场景1: 需求说明:如果自己的客户端处于运行状态,按下Home键后台挂起。此时如果使用微信调起自己的客户端某 个页面,不做任何处理的情况下,按下回退或者当前Activi...
  • berber78
  • berber78
  • 2014年02月21日 16:42
  • 10474

浅谈Activity的四种启动模式

本文主要聊聊Activity的四种启动模式,请看文章!
  • itluochen
  • itluochen
  • 2016年09月20日 19:31
  • 1525

Android学习之Activity的四种启动模式与特点

Acitivty的四种启动模式与特点activity有四种启动模式,分别为: standard singleTop singleTask singleInstance 可以和activity的fla...
  • u011726984
  • u011726984
  • 2015年10月27日 23:36
  • 2808

Android学习历程--Activity的四种启动模式

我们都知道Activity有四种启动模式,那么什么是个启动模式呢? 所谓的启动模式就是Activity的启动策略 启动模式有4种,分别为standard、singleTop、singleTask、...
  • xiaoxiaobai123456
  • xiaoxiaobai123456
  • 2017年03月21日 22:56
  • 285

activity的四种启动模式区别_launchmode图文详解

Activity的launchMode详细分析 应用中的每一个Activity都是进行不同的事物处理。以邮件客户端为例,InboxActivity目的就是为了展示收件箱,这个Activity...
  • androidstar_cn
  • androidstar_cn
  • 2016年10月03日 23:55
  • 849
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Activity四种启动模式的详解
举报原因:
原因补充:

(最多只允许输入30个字)