android activity的四種啟動模式

來源:互聯網
上載者:User

標籤:android   activity   

在AndroidManifest.xml中設定Activity啟動模式:

<activty android:name=".MainActivity" android:launchMode="standard" />
1.standard

每次啟用activity,都會建立activity,並放入任務棧中。這是系統預設的啟動模式。
Standard模式是每次都會建立新的Activity對象,當點擊返回按鈕時,他會將棧頂(當前Activity)消滅,然後跳到下一層,不過此時在這個Activity中再次點擊按鈕建立對象時,它會另外建立新的Activity對象,這種模式可能大多數情況下不是我們需要的,因為對系統效能的消耗過大。

2.singleTop

如果在任務的棧頂正好存在該Activity的執行個體, 就重用該執行個體,否者就會建立新的執行個體並放入棧頂(即使棧中已經存在該Activity執行個體,只要不在棧頂,都會建立執行個體)。
在每次使用新的Activity時會自動檢測棧頂的當前Activity是否是需要引用的Activity,如果是則直接引用此Activity,而不會建立新的Activity;當它不需要建立新的Activity對象時,它會調用onNewIntent()方法。

避免一個糟糕的使用者體驗,如果這個介面已經被開啟且在任務棧的棧頂,就不會重複開啟了

應用情境 :

singleTop的應用情境很多,一般適用於可以複用而又有多個開啟渠道的Activity,避免當一個Activity已經開啟並獲得焦點後,再次重複開啟。比如說Android系統瀏覽器的書籤頁面,就是一個singleTop模式的Activity。Android的瀏覽器是基於WebKit核心編寫的,它是支援JavaScript指令碼語言的,可以通過JavaScript指令碼設定瀏覽器書籤,這樣如果存在多個頁面存在儲存書籤的JavaScript指令碼,就會導致書籤頁面被多次開啟,所以書籤頁面被設定為singleTop模式,這樣可以避免在儲存多個書籤的時候重複開啟書籤頁面。

3.singleTask

如果在棧中已經有該Activity的執行個體,就重用該執行個體(會調用執行個體的onNewIntent())。重用時,會讓該執行個體回到棧頂,因此在它上面的執行個體將會被移除棧。如果棧中不存在該執行個體,將會建立新的執行個體放入棧中。
此啟動模式和singleTop在名字上即可看出區別,即singleTop每次只檢測當前棧頂的Activity是否是我們需要請求建立的,而singleTask則會檢測棧中全部的Activity對象,從上向下,如果檢測到是我們所請求的則會消滅此Activity對象上面的對象,直接把檢測到的我們需要的Activity置為棧頂。

設定了”singleTask”啟動模式的Activity,它在啟動的時候,會先在系統中尋找屬性值affinity等於它的屬性值taskAffinity的任務存在;如果存在這樣的任務,它就會在這個任務中啟動,否則就會在新任務中啟動。因此,如果我們想要設定了”singleTask”啟動模式的Activity在新的任務中啟動,就要為它設定一個獨立的taskAffinity屬性值。

應用情境:
瀏覽器:底層使用的是webkit c 核心,初始化一次需要申請很多的記憶體資源,佔用cpu時間,所以使用singletask,保證在任務棧裡只會有一個執行個體存在

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

4.singleInstance(相當於執行個體)

在一個新棧中建立該Activity執行個體,並讓多個應用共用該棧中的該Activity執行個體。一旦該模式的Activity的執行個體存在於某個棧中,任何應用再啟用該Activity時都會重用該棧中的執行個體,其效果相當於多個應用程式共用一個應用,不管誰啟用該Activity都會進入同一個應用中。
此啟動模式和我們使用的瀏覽器工作原理類似,我們都知道在多個程式中訪問瀏覽器時,如果當前瀏覽器沒有開啟,則開啟瀏覽器,否則會在當前開啟的瀏覽器中訪問。此模式會節省大量的系統資源,因為他能保證要請求的Activity對象在當前的棧中只存在一個。
Android系統的來電頁面,多次來電均使用的是一個Activity。

注意:Android的啟動模式跟進程沒有關係,進程是進程, 任務棧是管理Activity的

android activity的四種啟動模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.