天天看點

Activity LauchMode啟動模式(轉載)

轉載于:http://www.cnblogs.com/plokmju/p/android_ActivityLauncherMode.html

在一個Android應用中,不可避免的會包含多個Activity,當開啟多個Activity之後,當按後退鍵時,一般會回退到上一個 Activity,這一點和浏覽器有點類似,但是需要注意的是Android系統隻能回退到上一個Activity,沒辦法前進到下一個 Activity,維護這個功能就需要了解到一個回退棧(Back Stack)的概念。

  這篇部落格就着重講

<a href="http://www.cnblogs.com/plokmju/p/android_ActivityLauncherMode.html#whatIsTaskStack">什麼是回退棧</a>

<a href="http://www.cnblogs.com/plokmju/p/android_ActivityLauncherMode.html#TaskStackStatic">回退棧的狀态</a>

<a href="http://www.cnblogs.com/plokmju/p/android_ActivityLauncherMode.html#ActivityLauncherMode">Activity的幾種啟動模式</a>

  首先先來了解一下應用程式與程序的關系,衆所周知,Android下有四大元件:Activity、Service、Receiver、 ContentProvider。一般開發一個應用程式,會包含多個Android元件,是以應用程式是一組元件的集合,而程序則是運作這些元件的載體。

  而回退棧(Back Stack)隻是針對Activity而言的,它是用來維護用的界面體驗的,使一個Task讓使用者感覺就是一個應用,而無論其中的Activity是否來 自同一個應用程式,是以不要把回退棧和程序弄混了。裝置的Home頁面是大多數Task的起始位置,當使用者點選一個應用程式圖示的時候,應用的Task就 會來到前台,并把應用的主Activity壓入BackStack的棧頂,并獲得焦點,這個Activity稱為根Activity,而在 BackStack中的Activity可以通過點選回退鍵彈出棧并銷毀,這時就會使上一個Activity獲得焦點,直到使用者傳回到Home頁,而當 BackStack中的Activity都被彈出銷毀之後,這個Task就不複存在了,但是這個程式的程序還存在(不在此時銷毀)。

  就像上面介紹的,每個Task都存在一個BackStack,而系統中可以存在多個Task,但是每次隻有一個Task獲得前台焦點,一般而 言,系統允許使用者在多個Task中切換,而被至于背景的Task中的Activity,将被置于Stopped狀态。實際上,同一個Task中的 Activity,隻要不存在于棧頂并且獲得前台焦點的Activity,那麼它就是一個Stopped的狀态。下圖為官方文檔中關于Task前背景的示 例圖:

Activity LauchMode啟動模式(轉載)

  根據Activity的不同的啟動模式,它在BackStack中的狀态是不一樣的。Activity可以通過 AndroidManifest.xml清單檔案配置,在&lt;Activity /&gt;節點中的android:launchMode屬性設定。它有四個選項:

<a href="http://www.cnblogs.com/plokmju/p/android_ActivityLauncherMode.html#tandard">standard</a>

<a href="http://www.cnblogs.com/plokmju/p/android_ActivityLauncherMode.html#singleTo">singleTop</a>

<a href="http://www.cnblogs.com/plokmju/p/android_ActivityLauncherMode.html#singleTask">singleTask</a>

<a href="http://www.cnblogs.com/plokmju/p/android_ActivityLauncherMode.html#singleInstance">singleInstance</a>

  标準啟動模式,也是預設啟動模式,如果不設定android:launchMode屬性的話。standard模式下的Activity會依照啟動的順序壓入BackStack中。

  下圖是standard模式下,Activity的壓棧和回退操作示意圖:

Activity LauchMode啟動模式(轉載)

   單頂模式,這種Activity啟動模式,啟動一個Activity的時候如果發現BackStack的棧頂已經存在這個Activity 了,就不會去重新建立新的Activity,而是複用這個棧頂已經存在的Activity,避免同一個Activity被重複開啟。

  下圖是singleTop模式下,Activity的壓棧和回退操作示意圖:

Activity LauchMode啟動模式(轉載)

  singleTop的應用場景很多,一般适用于可以複用而又有多個開啟管道的Activity,避免當一個Activity已經開啟并獲得焦點 後,再次重複開啟。比如說Android系統浏覽器的書簽頁面,就是一個singleTop模式的Activity。Android的浏覽器是基于 WebKit核心編寫的,它是支援JavaScript腳本語言的,可以通過JavaScript腳本設定浏覽器書簽,這樣如果存在多個頁面存在儲存書簽 的JavaScript腳本,就會導緻書簽頁面被多次開啟,是以書簽頁面被設定為singleTop模式,這樣可以避免在儲存多個書簽的時候重複開啟書簽 頁面。

  開啟一個Activity的時候,檢查BackStack裡面是否有這個Activity的執行個體存在,如果存在的話,情況BackStack裡這個Activity上所有的其他Activity。

  下圖是singleTask模式下,Activity的壓棧和回退操作示意圖:

Activity LauchMode啟動模式(轉載)

  singleTask的的适用場景為一般程式的首頁面,當回退到首頁面的時候,清除BackStack中,它之上的所有Activity,這樣 避免程式導航邏輯的混亂。比如Android系統的浏覽器的首頁面,就是singleTask模式的,上面提到,android下浏覽器是Webkit内 核的,它是由C語言編寫的,而每次打開新的網頁如果重新開啟一個Activity,是非常耗費系統資源的(需要解析HTML、Script腳本),是以被 設定為singleTask模式,這樣在浏覽器應用裡,無論打開多少個頁面,使用的都是同一個Activity。是以以後如果存在很耗費系統資源的 Activity,可以考慮使用singleTask開啟模式。

  被标記為singleInstance啟動模式的Activity,在啟動的時候,會開啟一個新的BackStack,這個BackStack 裡隻有一個Activity的執行個體存在,并且把這個BackStack獲得焦點。這是一種很極端的模式,它會導緻整個裝置的作業系統裡,隻會存在一個這個 Activity示例,無論是從何處被啟動的。

  下圖是singleInstance模式下,Activity的壓棧和回退操作示意圖: 

Activity LauchMode啟動模式(轉載)

   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。

繼續閱讀