Activity的启动模式

原创 2015年11月21日 10:58:56

Activity的启动模式有四种,

分别是 standard、singleTop、 singleTask singleInstance。

一  课前须知

(1)Android是使用返回栈来管理活动的

(2)平时我们使用的启动模式一般都是系统默认值standard。

(3)启动模式的选择可以在AndroidManifest.xml 中配置,给<activity>标签指定 android:launchMode属性值即可,如图所示:


二  启动模式,看图即知




三  实例测试分析这四种启动模式

   需求实例:

(1)共有三个Activity,分别是MainActivity,SecondActivity和ThirdActivity

(3)这三个Activity都有一个Button(btnSkip)

(3)点击btnSkip依次跳转到下一个Activity

(4)按Back依次返回,直到应用程序完全退出。

四   standard启动模式:

(4.1 ) 代码

这里附上MainActivity的Java代码,其他两个差不多,唯一不同是Intent指定的目标跳转活动参数不一。

打印log,查看跳转的Activity实例

package com.example.acticitydemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
	private Button btnSkip;
	
	public static final String TAG = "nate";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG,this.toString());
        btnSkip = (Button)this.findViewById(R.id.btnSkip);
        btnSkip.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(MainActivity.this,SecondActivity.class);
				startActivity(intent);
			}
		});
    }
}

(4.2)  查看log信息


(4.3)  三个Activity入栈过程如下图



(4.4)   销毁实例

按三下Back返回键,三个Activity依次出栈,且销毁实例。出栈顺序ThirdActivity--->SecondActivity---->MainActivity

4.5  疑问

这是最常见的启动模式,依次启动了三个不相同的Activity。但是如果把启动的目标Activity指定为同一个Activity实例呢?

试一下不就知道了,我们把MainActivity的Intent改一下 ,Intent intent = new Intent(MainActivity.this,MainActivity.class);

然后同样的我们点击三下btnSkip按钮,来启动Activity

查看log


可以看出,在standard启动模式下,启动三次MainActivity,系统会创建三个不同实例的MainActivity

查看入栈过程


这时 要想退出应用程序,需要按三次Back返回键。

结论:对于使用 standard 模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建 该活动的一个新的实例。

五  singleTop模式

如果返回栈的栈顶已是该活动,则不用创建新实例,直接使用即可

(5.1)改变需求:让MainActivity跳转到SecondActivity,然后让SecondActivity跳转到SecondActivity

(5.2)改变Activity的Intent

MainActivity :       Intent intent = new Intent(MainActivity.this,SecondActivity.class);
SecondActivity:   Intent intent = new Intent(SecondActivity.this,SecondActivity.class);

(5.3)配置启动模式

AndroidManifest.xml文件的<activity>标签配置android:launchMode="singleTop"

(5.4)运行程序,点击btnSkip两次,查看log发现


一共启动了三次Activity,却只创建了两个(MainActivity和SecondActivity),所以只需点击两次Back返回键即可退出应用程序

入栈过程图


六  singleTask 启动模式

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

之前我们已经知道了singleTop模式,会发现,如果栈顶Activity与启动的Activity相同,则不需要再次创建该启动的Activity实例,但是如果启动的Activity与栈中(不确定是否是栈顶)的某一个Activity相同,那么系统会重新创建一个Activity实例吗?

答:singleTop模式下只有栈顶与启动的Activity相同才不会重新创建新的实例。而singleTask 模式下,不管是不是栈顶,只要栈中有相同的Activity,就不会重新创建新的实例

分析过程与五一致,这里不做过多解释

七 singleInstance模式

(7.1)问题猜想

想象以下场景,假设我们的程序中有一个 活动是允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实 例,应该如何实现呢?使用前面三种启动模式肯定是做不到的,因为每个应用程序都会有自 己的返回栈,同一个活动在不同的返回栈中入栈时必然是创建了新的实例。而使用 singleInstance模式就可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活 动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实 例的问题。 

 (7.2)改变需求

这里我们用 四 standard启动模式的代码  ,然后稍作修改即可,具体改动如下:

(1)打印log的值我们改为 Log.i(TAG,"The Task ID is "+getTaskId());获取返回栈的ID

(2)改变SecondActivity的启动模式为singleInstance

(7.3)运行程序,查看log


可以发现  ,MainActivity和ThirdActivity在同一个返回栈中,而SecondActivity在另一个返回栈中

这时,我们按下Back返回键三次惊奇的发现,界面直接从ThirdActivity跳转到了MainActivity,然后又从MainActivity跳转到SecondActivity,最后从SecondActivity退出程序。仔细一想,确实如此,因为MainActivity和ThirdActivity在同一个返回栈中,而SecondActivity又在另一个返回栈中,所以会出现这样的情况

入栈过程如图







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

Activity启动模式

  • 2016年08月26日 14:56
  • 12.62MB
  • 下载

Activity生命周期与启动模式

  • 2017年08月08日 14:11
  • 26.15MB
  • 下载

Android面试题(一)——Activity的生命周期和启动模式

Android面试题(一)——Activity的生命周期和启动模式引言 这份面试题系列文章旨在查漏补缺,通过常见的面试题发现自己在Android基础知识上的遗漏和欠缺,验证所学是否扎实。 这是系列的第...

activity启动模式测试

  • 2016年05月12日 21:10
  • 6.79MB
  • 下载

Activity四种启动模式

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

Android启动模式以及如何通过adb指令查看app当前运行的activity

Activity的启动模式是我们实际开发以及面试中经常会用到的知识点,对Activity的四种启动模式我们应该有一个比较清楚的理解。先声明,这里的阐述比较适合初学者,如果有更深入的理解,欢迎大家批评指...

android的Activity启动模式

  • 2016年03月16日 17:59
  • 516KB
  • 下载

Activity启动模式

  • 2016年07月23日 17:51
  • 6.57MB
  • 下载

# Android中Activity四种启动模式和taskAffinity属性详解 #(4)

## 四 实例验证singleInstance的行为 ## 根据上面的讲解,并且参考谷歌官方文档,singleInstance的特点可以归结为以下三条: 1. 以singleInstance模...
  • Blumamy
  • Blumamy
  • 2015年02月06日 11:28
  • 255

Activity启动模式实例

  • 2015年04月12日 21:30
  • 2.08MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Activity的启动模式
举报原因:
原因补充:

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