关闭

Activity的启动模式

标签: Activityandroid
161人阅读 评论(0) 收藏 举报
分类:

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又在另一个返回栈中,所以会出现这样的情况

入栈过程如图







0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6319次
    • 积分:357
    • 等级:
    • 排名:千里之外
    • 原创:29篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条