2011年12月19日 星期一

Android - activity : launchMode(3) - singleTask介紹

singleTask和singleInstance類似,在一個application啟動時,這個activity都只會產生一次實體。差別在 於singleTask會在原本的task裡面,而singleInstance會產生一個新的task,而且這個task裡面永遠只有自己這個 activity。

為了看出task是否相同,請在原本程式中的
txt1_history.setText(mString + this.toString() + "  -->  \n");

利用getTaskId調整為
txt1_history.setText(mString + this.toString() + "   , taskId : " + this.getTaskId()+"  -->  \n");
A2 和A3也是以此類推調整程式。

然後在AndroidManifest.xml中,把A2改為
<activity android:name=".A2" android:label="@string/app_name" android:launchMode="singleTask"/>

接下來啟動程式,activity順序為A1->A3->A2->A1->A3->A2,結果如下







































A2的taskID是26,和前面activity一樣





































當A3到A2時,直接跳到剛才產生的A2




















因 為A2是singleTask,所以不論從那個activity,只要用startActivity呼叫A2時,都會去找出剛才已經產生過的A2,而不會 重新產生一個實體。而且A2之後產生的activity也都會跟著消失,此時A2在activity stack的最頂層。此時activity stack由底到頂應該是A1,A3,A2。

接下來在A2開始按Back Key退回去,順序會是A2 -> A3 -> A1

假設今天是把A1設為singleTask的話,會有什麼效果?
想像今天的程式有一個類似主畫面(選單)的activity,不管去到那個activity都可以用startActivity回到這個主畫面,而且希望回到主畫面後,如果按下Back Key就可以結束整個程式的話,就可以對這個主畫面設定為singleTask。

1 則留言:

  1. 你好~想請教你一個關於singleTask的問題, 在singleTask的官方文件中有提到 "The system creates a new task and instantiates the activity at the root of the new task", 但以你這邊的實驗看到的結果好像不太符合, 一方面它並沒有create new task也沒有at the root of the new task, 請問這是什麼原因呢? 就官方文件來理解, singleTask和singleInstance的唯一差別是, singleInstance的task裡只會有它自己一個成員, 而singleTask是有可能含有其他activity的

    感謝~

    回覆刪除