您的位置:首页 > 移动开发 > Android开发

Activity的启动模式

2015-11-21 10:58 501 查看
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 android