說明一下,你們看這個帖子以前對Task,有必定的瞭解。並且看完這個以後,最好再看看taskAffinity屬性,由於在實際應用中他們通常是聯合使用的。spa
在Android的中Activity有4種啓動方式:"standard"、"singleTop"、"singleTask"、"singleInstance"。orm
下面就分輕重點講講這些啓動方式。get
一、standard啓動方式it
這種方式也是系統默認的。說的簡單點,咱們在使用startActivity()方法的時候,系統就會啓動一個新的Activity實例,無論它先前啓動沒有。若是想知道具體細節能夠查看這個帖子http://marshal.easymorse.com/archives/2950,我在這裏就不細細講解了。方法
配圖說明:im
二、singleTop啓動方式總結
若是你們把standard啓動方式看懂了,這個我就說一下區別,你們就明白了。若是咱們要調用的Activity在Task棧頂,系統不會像在standard方式下建立一個新的實例,而是調用onNewIntent()方法,來引導intent到棧頂的實例。若是調用的Activity不在Task棧頂,系統此時調用方式與standard方式下的如出一轍。margin
舉個例子:activity
如今task棧元素爲A-B-C-D(D在棧頂),這時候給D發一個啓動intent,若是D是 「standard」的,則生成D的一個新實例,棧變爲A-B-C-D-D。top
若是D是singleTop的話,則不會生產D的新實例,棧狀態仍爲A-B-C-D
若是這時候給B發Intent的話,無論B的launchmode是」standard」 仍是 「singleTop」 ,都會生成B的新實例,棧狀態變爲A-B-C-D-B。
注意:在一個Activity處理新的intent的時候,用戶不能使用Back button來返回到先前的Activity。直到新的intent到達onNewIntent()方法中後,才能夠。
三、singleTask啓動方式
若是已經有其餘的Task而且包含Activity實例,那就直接調用那個Task的實例。(只有一個Task中會有) 而不是建立一個新的實例。重點:假如你啓動一個singleTask的Activity,同時這個Activity在background task中,那麼整個background task都會被調入到前臺來。下面這幅圖就很好的說明這個問題。
有人問若是我調用圖中的Activity X,會怎樣?系統會先把Activity Y銷燬,而後再將Activity X放到前臺。
四、singleInstance啓動方式
singleInstance 新建一個Task,且在該Task中只有它的惟一一個實例。 (只有一個Task會有,且該Task中只有它)。「singleInstance」是其所在棧的惟一activity,它會每次都被重用。
總結:
standard 每次都會新建,每一個Task均可以有,且每一個Task均可以有多個實例(每一個Task均可以有,且能夠有多個)
singleTop 當前實例若是在棧頂,就不新建實例,調用其OnNewIntent。 如不在棧頂,則新建實例 (每一個Task均可以有,且能夠有多個,在棧頂時可複用)
singleTask 新建一個Task,若是已經有其餘的Task而且包含該實例,那就直接調用那個Task的實例。(只有一個Task中會有)
singleInstance 新建一個Task,且在該Task中只有它的惟一一個實例。 (只有一個Task會有,且該Task中只有它)
intent的flag能夠覆蓋activity的啓動模式:
FLAG_ACTIVITY_NEW_TASK 相似singleTask
FLAG_ACTIVITY_SINGLE_TOP 相似singleTop
FLAG_ACTIVITY_CLEAR_TOP 無對應
補充說明,裏面遺漏的東西。
用戶必定要可以離開一個task,和再回到這個task。因此,"singleTask"和"singleInstance",只能用做啓動Activity的屬性。若是不這樣,咱們在啓動一個singleTask的Activity以後,使用Home鍵到主界面,就會回不去了,由於它不表明一個應用的啓動。