Android中Activity的LunchMode参数详解

来源:互联网 发布:淘宝的体验中心在哪里 编辑:程序博客网 时间:2024/05/21 10:20

在Android中,每个Activity有4种LaunchMode,分别是:standard、singleTop、singleTask、singleInstance,默认是standard。在AndroidManifest.xml的对应Activity中配置该参数。下面对这四种模式进行实例验证加深理解。

        设计两个Activity,分别称为A,B,每个Activity上面都放置两个按钮,一个启动A,一个启动B。界面如下:(上面的一行文字用来识别是在A界面还是在B界面)

此图为A界面,B界面没有最上一行的字。

 

A界面java代码如下:

[java] view plaincopy
  1. public class LunchModeActivityA extends Activity {  
  2.     @Override  
  3.     public void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         setContentView(R.layout.main);  
  6.           
  7.         Button buttonActivityA = (Button) this.findViewById(R.id.buttonActivityA);  
  8.         Button buttonActivityB = (Button) this.findViewById(R.id.buttonActivityB);  
  9.         //启动ActivityB  
  10.         buttonActivityA.setOnClickListener(new OnClickListener() {  
  11.             @Override  
  12.             public void onClick(View v) {  
  13.                 Intent _intentB = new Intent(LunchModeActivityA.this,LunchModeActivityB.class);  
  14.                 startActivity(_intentB);  
  15.             }  
  16.         });  
  17.           
  18.         //启动ActivityA  
  19.         buttonActivityB.setOnClickListener(new OnClickListener() {  
  20.             @Override  
  21.             public void onClick(View v) {  
  22.                 Intent _intentA = new Intent(LunchModeActivityA.this,LunchModeActivityA.class);  
  23.                 startActivity(_intentA);  
  24.             }  
  25.         });  
  26.         Log.i("LunchModeActivityA","Task:"+getTaskId()+" LunchModeActivityA onCreate.");  
  27.     }  
  28.   
  29.     @Override  
  30.     protected void onDestroy() {  
  31.         super.onDestroy();  
  32.         Log.i("LunchModeActivityA","Task:"+getTaskId()+" LunchModeActivityA onDestroy.");  
  33.     }  
  34.       
  35.     @Override  
  36.     protected void onNewIntent(Intent intent) {  
  37.         super.onNewIntent(intent);  
  38.         Log.i("LunchModeActivityA","Task:"+getTaskId()+" LunchModeActivityA onNewIntent.");  
  39.     }  
  40. }  


同理,LunchModeActivityB也类似实现,重装上面三个方法并进行log跟踪。

 

测试开始:

1.两个Actiity的LaunchMode都为默认的standard,启动Ap,看到输出:
Task:11 LunchModeActivityA onCreate.

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


点击界面上启动A的按钮,看到输出: 
Task:11 LunchModeActivityA onCreate.

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

点击启动B的按钮, 
Task:11 LunchModeActivityB onCreate. 

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

再启动B, 
Task:11 LunchModeActivityB onCreate. 

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

按Back键依次返回桌面,输出依次为: 
Task:11 LunchModeActivityB onDestroy.

Task:11 LunchModeActivityB onDestroy.

Task:11 LunchModeActivityA onDestroy.

Task:11 LunchModeActivityA onDestroy. 

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


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

2.B设置为SingleTop,启动Ap:
 
Task:12 LunchModeActivityA onCreate.

再启动A: 
Task:12 LunchModeActivityA onCreate.

再启动B: 
Task:12 LunchModeActivityB onCreate. 

再启动B: 
Task:12 LunchModeActivityB onNewIntent.

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

按Back键依次返回桌面,输出依次为: 
Task:12 LunchModeActivityB onDestroy.

Task:12 LunchModeActivityA onDestroy.

Task:12 LunchModeActivityA onDestroy.

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

3.B设置为SingleTask,启动Ap:
 
Task:3 LunchModeActivityA onCreate.

启动B: 
Task:3 LunchModeActivityB onCreate.

启动A: 
Task:3 LunchModeActivityA onCreate. 

启动B: 
Task:3 LunchModeActivityB onNewIntent. 
Task:3 LunchModeActivityA destroyed. 

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

4.B设置为SingleInstance,启动Ap:
 
Task:4 LunchModeActivityA onCreate.

启动B,此时新创建了任务栈5,和先前的A并不在一个任务。 
Task:5 LunchModeActivityB onCreate.

再启动B,没有创建新实例: 
Task:5 LunchModeActivityB onNewIntent.


再启动A,再旧的任务4中创建了A的新实例 
Task:4 LunchModeActivityA onCreate.

按下Back键: 
Task:4 LunchModeActivityA onDestroy.

看输出和前面没区别,但是注意界面,此时不是切换到B界面,因为此时活动任务是4,所以A被显示了出来


再次按下Back键: 
Task:4 LunchModeActivityA onDestroy.

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

 

总结:被该属性表示的Activity会标记成另一个Taskid,并且该Activity的实例不会重复创建,back的时候是最后一个显示和退出的。