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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

NIO框架之MINA源码解析(五):NIO超级陷阱和使用同步IO与MINA通信

1、NIO超级陷阱之所以说NIO超级陷阱,就是因为我在本系列开头的那句话,因为使用缺陷导致客户业务系统瘫痪。当然,我对这个问题进行了很深的追踪,包括对MINA源码的深入了解,但其实之所以会出现这个问题...

集合工具类之Map特点和实现类的详解

集合工具类之Map特点和实现类的详解

Activity四种启动模式

  • 2016年07月21日 09:41
  • 30.55MB
  • 下载

Android中Activity四种启动模式和taskAffinity属性详解

在android应用开发中,打造良好的用户体验是非常重要的。而在用户体验中,界面的引导和跳转是值得深入研究的重要内容。在开发中,与界面跳转联系比较紧密的概念是Task(任务)和Back Stack(回...

activity的四种启动模式

  • 2014年09月19日 12:02
  • 15KB
  • 下载

Activity四种启动模式

  • 2016年01月04日 09:22
  • 184KB
  • 下载

# Android中Activity四种启动模式和taskAffinity属性详解 #(2原创分享)

activity有四种启动模式,分别为standard,singleTop,singleTask,singleInstance。如果要使用这四种启动模式,必须在manifest文件中标签中的launc...
  • Blumamy
  • Blumamy
  • 2015年02月04日 14:22
  • 538

Activity四种启动模式Demo

  • 2013年07月23日 11:00
  • 73KB
  • 下载

activity四种启动模式demon

  • 2016年09月27日 15:18
  • 5.96MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Activity四种启动模式的详解
举报原因:
原因补充:

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