Android–Activity的啟動模式(防止重覆執行)
Android–Activity的啟動模式(防止重覆執行)
Activity的啟動模式
根據Activity的不同的啟動模式,它在BackStack中的狀態是不一樣的。Activity可以通過AndroidManifest.xml清單檔配置,在<Activity />節點中的android:launchMode屬性設置。它有四個選項:
‧ standard
‧ singleTop
‧ singleTask
‧ singleInstance
standard
標準啟動模式,也是默認啟動模式,如果不設置android:launchMode屬性的話。standard模式下的Activity會依照啟動的順序壓入BackStack中。
singleTop
單頂模式,這種Activity啟動模式,啟動一個Activity的時候如果發現BackStack的棧頂已經存在這個Activity了,就不會去重新創建新的Activity,而是複用這個棧頂已經存在的Activity,避免同一個Activity被重複開啟。
singleTop的應用場景很多,一般適用於可以複用而又有多個開啟管道的Activity,避免當一個Activity已經開啟並獲得焦點後,再次重複開啟。比如說Android系統流覽器的書簽頁面,就是一個singleTop模式的Activity。Android的流覽器是基於WebKit內核編寫的,它是支援JavaScript腳本語言的,可以通過JavaScript腳本設置流覽器書簽,這樣如果存在多個頁面存在保存書簽的JavaScript腳本,就會導致書簽頁面被多次開啟,所以書簽頁面被設置為singleTop模式,這樣可以避免在保存多個書簽的時候重複開啟書簽頁面。
singleTask(我的[listensutra]目前用這個方式)
開啟一個Activity的時候,檢查BackStack裏面是否有這個Activity的實例存在,如果存在的話,情況BackStack裏這個Activity上所有的其他Activity。
singleTask的的適用場景為一般程式的主頁面,當回退到主頁面的時候,清除BackStack中,它之上的所有Activity,這樣避免程式導航邏輯的混亂。比如Android系統的流覽器的主頁面,就是singleTask模式的,上面提到,android下流覽器是Webkit內核的,它是由C語言編寫的,而每次打開新的網頁如果重新開啟一個Activity,是非常耗費系統資源的(需要解析HTML、Script腳本),所以被設置為singleTask模式,這樣在流覽器應用裏,無論打開多少個頁面,使用的都是同一個Activity。所以以後如果存在很耗費系統資源的Activity,可以考慮使用singleTask開啟模式。
singleInstance
被標記為singleInstance啟動模式的Activity,在啟動的時候,會開啟一個新的BackStack,這個BackStack裏只有一個Activity的實例存在,並且把這個BackStack獲得焦點。這是一種很極端的模式,它會導致整個設備的作業系統裏,只會存在一個這個Activity示例,無論是從何處被啟動的。
singleInstance一般適用於需要在系統中只存在一個實例的場景,比如Android系統的來電頁面,多次來電均使用的是一個Activity。
當然,在Android中,除了在AndroidManifest.xml清單檔中配置LauncherMode屬性外,還可以在代碼中設置啟動模式。在元件中,啟動一個Activity,需要用到startActivity()方法,其中傳遞一個Intent,可以使用Intent.setFlags(int flags)來設置新啟動的Activity的啟動模式,而通過代碼設置Activity的啟動模式的方式,優先順序要高於在AndroidManifest.xml清單檔中的配置。
Intent.setFlag(int flags)方法傳遞的一個整形的資料,被Android系統設置為了常量:
‧ FLAG_ACTIVITY_NEW_TASK:這個標識會使新啟動的Activity獨立創建一個Task。
‧ FLAG_ACTIVITY_CLEAR_TOP:這個標識會使新啟動的Activity檢查是否存在於Task中,如果存在則清除其之上的Activity,使它獲得焦點,並不重新實例化一個Activity,一般結合FLAG_ACTIVITY_NEW_TASK一起使用。
‧ FLAG_ACTIVITY_SINGLE_TOP:等同於在LauncherMode屬性設置為singleTop。
總結
這篇博客主要講的是理論上的內容,也沒什麼示例代碼,無非就是幾種啟動模式的特點需要注意一下,理解了Activity的啟動模式,可以很好的提升用戶的UI體驗,對應用程式的推廣是非常有好處的,畢竟一個用戶體驗很差的應用,是很難得到用戶的推廣的。