Activity LaunchMode验证

引用地址:http://mypyg.iteye.com/blog/919643

在Android中,每个Activity有4种LaunchMode,默认是standard,下面对这四种模式进行实例验证加深理解。


设计两个Activity,分别称为A,B,每个Activity上面都放置两个按钮,一个启动A,一个启动B。

界面如下:(上面的一行文字用来识别是在A界面还是在B界面)


在代码中实现onCreate():

Java代码 复制代码 收藏代码
  1. Button btnA = (Button)findViewById(R.id.btnA);   
  2.         btnA.setOnClickListener(new OnClickListener() {            
  3.             public void onClick(View v) {   
  4.                 // TODO Auto-generated method stub   
  5.                 startActivity(new Intent(A.this, A.class));   
  6.             }   
  7.         });   
  8.            
  9.         Button btnB = (Button)findViewById(R.id.btnB);   
  10.         btnB.setOnClickListener(new OnClickListener() {            
  11.             public void onClick(View v) {   
  12.                 // TODO Auto-generated method stub   
  13.                 startActivity(new Intent(A.this, B.class));   
  14.             }   
  15.         });   
  16.            
  17.         Log.e("Task:"+getTaskId(), "A" + mId + " created.");   
Button btnA = (Button)findViewById(R.id.btnA);
		btnA.setOnClickListener(new OnClickListener() {			
			public void onClick(View v) {
				// TODO Auto-generated method stub
				startActivity(new Intent(A.this, A.class));
			}
		});
        
        Button btnB = (Button)findViewById(R.id.btnB);
        btnB.setOnClickListener(new OnClickListener() {			
			public void onClick(View v) {
				// TODO Auto-generated method stub
				startActivity(new Intent(A.this, B.class));
			}
		});
        
        Log.e("Task:"+getTaskId(), "A" + mId + " created."); 




onNewIntent():

Java代码 复制代码 收藏代码
  1. Log.e("Task:"+getTaskId(), "A" + mId + " onNewIntent.");  
Log.e("Task:"+getTaskId(), "A" + mId + " onNewIntent.");



onDestroy():

Java代码 复制代码 收藏代码
  1. Log.e("Task:"+getTaskId(), "A" + mId + " destroyed.");  
Log.e("Task:"+getTaskId(), "A" + mId + " destroyed.");



这样就可以直观的从Logcat输出中看到Activity的创建、销毁以及请求的响应。

1.两个Actiity的LaunchMode都为默认的standard,启动Ap,看到输出:
Task:9(380): A1 created.

A被创建了一个实例A1,并且放在了任务9中。
此时任务栈中内容为:
A

点击界面上启动A的按钮,看到输出:
Task:9(380): A2 created.

A再次被创建了一个新的实例A2,仍然放在任务9中。
此时任务栈中内容为:
AA

点击启动B的按钮,
Task:9(380): B1 created.

B被创建一个新的实例B1,仍然放在任务9中。
此时任务栈内容为:
AAB

再启动B,
Task:9(380): B2 created.

B又被创建了一个新的实例B2,仍然在任务9中。
任务栈内容为:
AABB

按Back键依次返回桌面,输出依次为:
Task:9(380): B2 destroyed.

Task:9(380): B1 destroyed.
Task:9(380): A2 destroyed.

Task:9(380): A1 destroyed.

任务栈的变化次序为:
AABB
AAB
AA
A

结论:
每个Intent,都创建了一个新的Activity来响应,并且Back时是按照弹栈的顺序处理的。

2.B设置为SingleTop,启动Ap:
Task:10(409): A1 created.

再启动A:
Task:10(409): A2 created.

再启动B:
Task:10(409): B1 created.

再启动B:
Task:10(409): B1 onNewIntent.


结论:
当B不在栈顶时,仍然会创建B的新实例。
当B在栈顶时,请求启动B的Intent并没有触发创建B的新实例,而是触发了栈顶B的onNewIntent()


按Back键依次返回桌面,输出依次为:
Task:10(409): B1 destroyed.

Task:10(409): A2 destroyed.

Task:10(409): A1 destroyed.


结论:
虽然发送了四次Intent,但实际上只创建了3个Activity,所以只有3次销毁输出。


3.B设置为SingleTask,启动Ap:
Task:11(438): A1 created.

启动B:
Task:11(438): B1 created.

启动A:
Task:11(438): A2 created.

启动B:
Task:11(438): B1 onNewIntent.

Task:11(438): A2 destroyed.


结论:
当B已经存在时,再次请求B会触发已经存在的B1实例的onNewIntent;
并且如果B所在的任务栈上面有其他Activity,那么其他Activity会被销毁。


4.B设置为SingleInstance,启动Ap:
Task:12(466): A1 created.

启动B,此时新创建了任务栈13,和先前的A1并不在一个任务。
Task:13(466): B1 created.

再启动B,没有创建新实例:
Task:13(466): B1 onNewIntent.
再启动A,再旧的任务12中创建了A的新实例
Task:12(466): A2 created.

按下Back键:
Task:12(466): A2 destroyed.
看输出和前面没区别,但是注意界面,此时不是切换到B界面,因为此时活动任务是12,所以A1被显示了出来
再次按下Back键:
Task:12(466): A1 destroyed.

此时因为任务12已经结束,B1所在的任务13成为活动任务,B1的界面才被显示出来。

posted on 2011-07-17 09:34  渺之一粟  阅读(292)  评论(0编辑  收藏  举报

导航