Android Activity:四種啟動模式,Intent Flags和任務棧(轉自他人部落格)

來源:互聯網
上載者:User

標籤:

在Android中每個介面都是一個Activity,切換介面操作其實是多個不同Activity之間的執行個體化操作。那各個頁面跳轉關係如何決定呢?如果啟動了順序啟動了ABCD的Activiy,如何從D調回到B呢?下面講述一下Acitivity的四種啟動模式。講解啟動模式之前,有必要先講解一下“任務棧”的概念;
  任務棧
  每個應用都有至少一個任務棧,是用來存放Activity的,功能類似於函數調用的棧,先後順序代表了Activity的出現順序;比如Activity1-->Activity2-->Activity3,則任務棧為:

啟動模式:啟動模式簡單地說就是Activity啟動時的策略,在AndroidManifest.xml中的標籤的android:launchMode屬性設定;
四種啟動模式:
(1)standard:每次啟用Activity時(startActivity),都建立Activity執行個體,並放入任務棧;這個是系統預設的啟動模式;



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


(3)singleTask:如果要啟用的那個Activity在任務棧中存在該執行個體,則不需要建立,只需要把此Activity放入棧頂,並把該Activity以上的Activity執行個體都pop(彈出銷毀);這個模式可以用來退出整個應用。將主Activity設為SingTask模式,然後在要退出的Activity中轉到主Activity,然後重寫主Activity的onNewIntent函數,並在函數中加上一句finish。(因為Activity不建立,所以不會進入onCreate函數,只會進入onNewIntent函數)。

(4)singleInstance:如果應用1的任務棧中建立了MainActivity執行個體,如果應用2也要啟用MainActivity,則不需要建立,兩應用共用該Activity執行個體;
此啟動模式和我們使用的瀏覽器工作原理類似,我們都知道在多個程式中訪問瀏覽器時,如果當前瀏覽器沒有開啟,則開啟瀏覽器,否則會在當前開啟的瀏覽器中訪問。此模式會節省大量的系統資源,因為他能保證要請求的Activity對象在當前的棧中只存在一個。


以上就是Activity的四種啟動模式,那標題的Intent Flags又是什麼鬼?
Flags: 表示Intent的標誌位,常用於Activity的情境中,它和Activity的啟動模式有著密切的聯絡。
下面列舉的是和本文主題相關的Flags屬性:

Intent.FLAG_ACTIVITY_NEW_TASK (預設)
預設的跳轉類型,它會重新建立一個新的Activity

FLAG_ACTIVITY_SINGLE_TOP
這個FLAG就相當於啟動模式中的singletop,例如:原來棧中結構是A B C D,在D中啟動D,棧中的情況還是A,B,C,D。singleTask不一樣的

FLAG_ACTIVITY_CLEAR_TOP
這個FLAG有點像啟動模式中的SingleTask,這種FLAG啟動的Activity會把要啟動的Activity之上的Activity全部彈出棧空間。例如:原來棧中的結構是A B C D ,從D中跳轉到B,棧中的結構就變為了A B了。但是和SingleTask不一樣的是,FLAG_ACTIVITY_CLEAR_TOP會把他上面的彈出,但是自身也銷毀,然後重新建立個新對象。而SingleTask不會重新建立新對象,就是不會觸發onCreate,只會觸發onNewIntent。

FLAG_ACTIVITY_NO_USER_ACTION
onUserLeaveHint()作為activity周期的一部分,它在activity因為使用者要跳轉到別的activity而要退到background時使用。比如,在使用者按下Home鍵,它將被調用。比如有電話進來(不屬於使用者的選擇),它就不會被調用。
那麼系統如何區分讓當前activity退到background時使用是使用者的選擇?
它是根據促使當前activity退到background的那個新啟動的Activity的Intent裡是否有FLAG_ACTIVITY_NO_USER_ACTION來確定的。
注意:調用finish()使該activity銷毀時不會調用該函數

FLAG_ACTIVITY_NO_HISTORY
意思就是說用這個FLAG啟動的Activity,一旦退出,它不會存在於棧中,比方說!原來是A,B,C這個時候再C中以這個FLAG啟動D的,D再啟動E,這個時候棧中情況為A,B,C,E。 

 注意:當調用到onNewIntent(intent)的時候,需要在onNewIntent() 中使用setIntent(intent)賦值給Activity的Intent.否則,後續的getIntent()都是得到老的Intent。

Android Activity:四種啟動模式,Intent Flags和任務棧(轉自他人部落格)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.