2013年5月7日 星期二

[Android] Activity的四種launchMode

Activity有四種launchMode
  • standard
  • singleTop
  • singleTask
  • singleInstance
可在androidManifest.xml中設定
<activity android:name=".actA" android:launchMode="singleTask"</activity>
1.standard
standard為預設值,androidManifest.xml如果沒有設定launchmode,就會以standard來跑,
這個模式,每次都會create一個新的activity

2.singleTop
當你的activity已經是在最上層,就不會在產生一個activity,但如果當下的activity不是在最上層,則會產生一個新的activity。
舉二個例子來說:
A.假設程式只有一個activity,所以無論如何你的activity都是在最上層,這個時候就不會產生新的activity。
B.假設程式有二個activities A->B,這樣候B開啟A時,則會變成A->B->A,這是因為A不是在最上層,所以就會產生一個新的A。

3.singleTask 意思就是指,同一個Task中只能只一個activity。如果在發現Activity的instance已經存在,則清空這個instance则之上的Activity,使其處於最上層。
我們假設B設成singleTask,
舉個例子來說:
假設有A->B->C->D,當D又用startActivity呼叫B時,則B不會產生一個新的activity,且會將在他上面的C-D清掉,所以stack裡只剩下A,B。

4. singleInstance 這個模式較為複雜,activity要已一個新的task來開啟,而且保證不再有其他Activity instance進入。
舉個例子來說:
actA是standard開啟,actB是singleInstance,
開啟順序為actA1(task1) -> actB(task2) ->actA2(task1),
actB會已一個新的task來開啟(如下圖),
所以當按back鍵時,就變成actA2(task1)->actA1(task1)->actB(task2) 。















總結:
- standard : 每次都會產生一個實例(instance)。
- singleTop : 如果activity在最上層,就不會產生新的實例。
- singleTask :永遠只有一個實例,而且只要被呼叫都會保持在最上層。
- singleInstance :永遠只有一個實例,而且該task只有它一個實例。

補充:
如果自己想做實驗,在onCreate利用下面二種方法拿到activity ID及task ID 。
 @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.first);
        //拿activity ID  
        TextView textView = (TextView) findViewById(R.id.textView);  
        textView.setText(this.toString()); 
        //拿task ID  
        TextView taskIdView = (TextView) findViewById(R.id.taskIdView);  
        taskIdView.setText("current task id: " + this.getTaskId()); 
       
    }  

reference:
http://my2drhapsody.blogspot.tw/2012/08/activity-launchmode.html
http://developer.android.com/guide/components/tasks-and-back-stack.html
http://blog.csdn.net/liuhe688/article/details/6754323

沒有留言:

張貼留言