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