Android中launchMode模式詳解

來源:互聯網
上載者:User

關於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.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 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.