如何正確理解和使用 Activity的4種啓動模式

關於Activity啓動模式的文章已經不少,但有的文章寫得過於簡單,有的則過於注重細節,本文想取一個折中,只關注最重要和最經常使用的概念,原理和使用方法,便於讀者正確應用。html

         Activity的啓動模式有4種,分別是standard.singleTop. SingleTask. singleInstance,能夠在AndroidMainifest.xml文件中指定每個Activity的啓動模式。一個Android應用通常都會有多個Activity,系統會經過任務棧來管理這些Activity,棧是一種後進先出的集合,當前的Activity就在棧頂,按返回鍵,棧頂Activity就會退出。Activity啓動模式不一樣,系統經過任務棧管理Activity的方式也會不一樣,如下將分別介紹。函數

1 Standard模式spa

Standard模式是Android的默認啓動模式,你不在配置文件中作任何設置,那麼這個Activity就是standard模式,這種模式下,Activity能夠有多個實例,每次啓動Activity,不管任務棧中是否已經有這個Activity的實例,系統都會建立一個新的Activity實例,如下是實驗驗證。xml

新建一個FirstActivity,用一個Button去啓動它自己:htm

 

發現每次都會啓動一個新的FristActivity, Log信息以下blog

 

何時用standard模式呢?standartd模式是activity的默認模式,大部分狀況下,都應該使用這種模式,也就是在配置文件中什麼都不用作,當確實有特殊需求時,再考慮其餘模式。資源

2 SingleTop模式get

SingleTop模式和standard模式很是類似,主要區別就是當一個singleTop模式的Activity已經位於任務棧的棧頂,再去啓動它時,不會再建立新的實例,若是不位於棧頂,就會建立新的實例,如今把配置文件中FirstActivity的啓動模式改成SingleTop,咱們的應用只有一個Activity,FirstActivity天然處於任務棧的棧頂。博客

         當應用第一次啓動後,咱們再按Button去啓動新的FirstActivity,發現Log信息中再也不打印onCreate函數,說明再也不建立新的FirstActivity實例。it

         這裏有一個新的問題,對於每次啓動Activity,咱們該如何分別處理。答案就是onNewIntent()函數,雖然系統不會調用onCreat(),但會調用onNewIntent,咱們能夠在這個函數作相應的處理。

 

         當一個Activity已經在棧頂,但依然有可能啓動它,而你又不想產生新的Activity實例,此時就能夠用singleTop模式。例如,一個搜索Activity,能夠輸入搜索內容,也能夠產生搜索結果,此時就能夠用singleTop模式,不會用戶每次搜索都會產生一個實例。

         3 SingleTask模式

         SingleTask模式的Activity在同一個Task內只有一個實例,若是Activity已經位於棧頂,系統不會建立新的Activity實例,和singleTop模式同樣。但Activity已經存在但不位於棧頂時,系統就會把該Activity移到棧頂,並把它上面的activity出棧。修改上面的程序,新建一個SecondActivity,將FirstActivity設置爲singleTask啓動模式,並讓它啓動SecondActivity,再讓SecondActivity來啓動FirstActivity。

            

         Log信息以下

 

當SecondActivity啓動FirstActivity時,並不會調用FirstActivity的onCreate函數,但會調用onNewIntent函數,同時會調用SecondActivity的onDestroy函數,SecondActivity實例被銷燬。

singleTask模式和前面兩種模式的最大區別就是singleTask模式是任務內單例的,因此咱們是否設定Activity爲singleTask模式,就是看咱們activity是否須要單例,例如你的某個Activity

裏面有一個列表,若是有多個實例,有可能致使用戶看到的列表不一致,有的Activity須要常常啓動,若是每次都建立實例,會致使佔用資源過多,這些狀況均可以使用singleTask模式,但啓動singleTask模式的Activity會致使任務棧內它上面的Activity被銷燬,有可能會影響用戶體驗,使用時要注意。

4 SingleInstance模式

singleInstance模式也是單例的,但和singleTask不一樣,singleTask只是任務棧內單例,系統裏是能夠有多個singleTask Activity實例的,而singleInstance Activity在整個系統裏只有一個實例,啓動一singleInstanceActivity時,系統會建立一個新的任務棧,而且這個任務棧只有他一個Activity。

SingleInstance模式並不經常使用,若是咱們把一個Activity設置爲singleInstance模式,你會發現它啓動時會慢一些,切換效果很差,影響用戶體驗。它每每用於多個應用之間,例如一個電視launcher裏的Activity,經過遙控器某個鍵在任何狀況能夠啓動,這個Activity就能夠設置爲singleInstance模式,當在某應用中按鍵啓動這個Activity,處理完後按返回鍵,就會回到以前啓動它的應用,不影響用戶體驗。

以上分析了Activity的4種啓動模式,將Activity設置爲哪一種啓動模式並無標準答案,有時候,你可能發現將某個Activity設置爲一種啓動模式或者另外一種啓動模式,並無明顯區別,而具體的評判標準就是看哪一種模式更知足應用功能,更有利於用戶體驗。

轉載請註明出處 卓行者博客http://www.cnblogs.com/thewalker3000/p/6546467.html

相關文章
相關標籤/搜索