關於Activity啟動模式的文章已經很多,但有的文章寫得過於簡單,有的則過於注重細節,本文想取一個折中,只關注最重要和最常用的概念,原理和使用方法,便於讀者正確應用。
Activity的啟動模式有4種,分別是standard.singleTop. SingleTask. singleInstance,可以在AndroidMainifest.xml文件中指定每一個Activity的啟動模式。一個Android應用一般都會有多個Activity,系統會通過任務棧來管理這些Activity,棧是一種后進先出的集合,當前的Activity就在棧頂,按返回鍵,棧頂Activity就會退出。Activity啟動模式不同,系統通過任務棧管理Activity的方式也會不同,以下將分別介紹。
1 Standard模式
Standard模式是Android的默認啟動模式,你不在配置文件中做任何設置,那么這個Activity就是standard模式,這種模式下,Activity可以有多個實例,每次啟動Activity,無論任務棧中是否已經有這個Activity的實例,系統都會創建一個新的Activity實例,以下是實驗驗證。
新建一個FirstActivity,用一個Button去啟動它本身:
發現每次都會啟動一個新的FristActivity, Log信息如下
什么時候用standard模式呢?standartd模式是activity的默認模式,大部分情況下,都應該使用這種模式,也就是在配置文件中什么都不用做,當確實有特殊需求時,再考慮其他模式。
2 SingleTop模式
SingleTop模式和standard模式非常相似,主要區別就是當一個singleTop模式的Activity已經位於任務棧的棧頂,再去啟動它時,不會再創建新的實例,如果不位於棧頂,就會創建新的實例,現在把配置文件中FirstActivity的啟動模式改為SingleTop,我們的應用只有一個Activity,FirstActivity自然處於任務棧的棧頂。
當應用第一次啟動后,我們再按Button去啟動新的FirstActivity,發現Log信息中不再打印onCreate函數,說明不再創建新的FirstActivity實例。
這里有一個新的問題,對於每次啟動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