關於Android中launchMode的文章介紹的真心不少,廣為流傳而且介紹的最詳細的莫過於這篇文章http://blog.csdn.net/android_tutor/article/details/6310015。但是這篇文章中關於singletask和singleinstance在評論中還是有些不解和爭論,在此根據執行個體重點說下這兩種模式:
執行個體簡介:有兩個Activity,分別為AActivity和BActivity,介面相同。點擊按鈕A和B,分別啟動AActivity和BActivity,觀察效果:
上代碼:
layout_task.xml<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjxicj4KPC9wPgo8cD48L3A+CjxwcmUgY2xhc3M9"brush:java;">
AActivity.java
package com.example.activitytask;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class AActivity extends Activity{private static final String TMG = "ActivityTask";private static int mIndex = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_task) ;mIndex++ ;Log.i(TMG,"AActivity Create"+mIndex+" TaskId="+getTaskId()) ;Button _buttonStartA = (Button)findViewById(R.id.buttonStartA) ;_buttonStartA.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent _intent = new Intent(AActivity.this,AActivity.class) ;startActivity(_intent) ;}}) ;Button _buttonStartB = (Button)findViewById(R.id.buttonStartB) ;_buttonStartB.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent _intent = new Intent(AActivity.this,BActivity.class) ;startActivity(_intent) ;}}) ;}@Overrideprotected void onDestroy() {super.onDestroy();Log.i(TMG,"AActivity Destory"+mIndex+" TaskId="+getTaskId()) ;mIndex--;}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);Log.i(TMG,"AActivity onNewIntent"+mIndex+" TaskId="+getTaskId()) ;}}
BActivity.javapackage com.example.activitytask;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class BActivity extends Activity{private static final String TMG = "ActivityTask";private static int mIndex = 0 ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_task) ;mIndex++ ;Log.i(TMG,"BActivity Create"+mIndex+" TaskId="+getTaskId()) ;Button _buttonStartA = (Button)findViewById(R.id.buttonStartA) ;_buttonStartA.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent _intent = new Intent(BActivity.this,AActivity.class) ;startActivity(_intent) ;}}) ;Button _buttonStartB = (Button)findViewById(R.id.buttonStartB) ;_buttonStartB.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent _intent = new Intent(BActivity.this,BActivity.class) ;startActivity(_intent) ;}}) ;}@Overrideprotected void onDestroy() {super.onDestroy();Log.i(TMG,"BActivity Destory"+mIndex+" TaskId="+getTaskId()) ;mIndex--;}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);Log.i(TMG,"BActivity onNewIntent"+mIndex+" TaskId="+getTaskId()) ;}}1.設定兩個Activity的android:launchMode="singleTask"
程式剛啟動時的列印結果點擊startB按鈕列印效果
進入BActivity介面後,這時再點擊startA按鈕列印結果(先清屏)
這時我們發現BActivity銷毀,此時再點擊startB,BActivity重新建立
總結:當一個Activity被設定為singletask時
(1)它並沒有建立新的任務棧(根據上面列印效果展示,AActivity和BActivity的TaskId都等於76)
(2)如果它已經存在於棧中,再次請求觸發此Activity時,會調用此類執行個體的onNewIntent方法,不會重新建立新的執行個體
(3)如果此類所在的任務棧上面有其它Activity,那麼其它的Activity會被銷毀
2.設定兩個Activity的android:launchMode="singleInstance"
程式剛啟動時的列印結果
點擊startB按鈕列印效果
進入BActivity介面後,這時再點擊startA按鈕列印結果(先清屏)
再點擊startB按鈕列印結果(先清屏)
總結:當一個Activity被設定為singleinstance時
(1)如果此Activity沒有執行個體,它會建立一個新的任務棧。(TaskId一個81,一個82)(2)如果任務棧中已經有此執行個體,會調用onNewIntent方法,不會建立新的任務棧和執行個體
(3)獨立成Taskstack ,並且有且僅有你自己 ,孤家寡人 。而且始終保持一個執行個體離棧的時候 , 先退當前的task ,再退另外的task