关Activity的Launch mode

在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.");   



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


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


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

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

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


点击界面上启动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 


结论: 
每个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的界面才被显示出来。 

Demo 下载 

文章来源:http://mypyg.iteye.com/blog/919643 
 

作者:码农豆豆
微信公众号:
出处:http://www.cnblogs.com/fly_binbin/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果文中有什么错误,欢迎指出。以免更多的人被误导。
原文地址:https://www.cnblogs.com/fly_binbin/p/2341773.html