Activity的launchMode和任務棧小結

對Activity的launchMode的理解一直沒有好好總結下,這兩天系統總結下launchMode的用法:

Activity的launchMode屬性決定了Activity和應用程序當前任務棧之間的關係。一個應用程序當前任務棧管理着應用程序的activity集合的Activity歸屬和Activity間的交互。開發人員想要開發的App擁有良好的交互,因此,深入對Activity的launchMode的理解能幫助我們開發性能良好和交互合理的App。

Activity的launchMode主要有四種類型:

  • standard
  • singleTop
  • singleTask
  • singleInstance

我們知道Activity的四種啓動模式都是在配置文件manifest裏配置,除此之外我們還可以通過制定Intent的flag參數來改變Activity的默認行爲。也就是說,我們的Activity的默認四種類型的表現形式,在我們啓動該Activity前,我們指定Intent的flag參數,我們可以覆蓋Activity的默認表現。Intent的改變默認啓動模式的常見參數有如下:

  • FLAG_ACTIVITY_NEW_TASK
  • FLAG_ACTIVITY_CLEAR_TOP
  • FLAG_ACTIVITY_SINGLE_TOP

下面從Activity的launchMode表現的四種啓動方式說起:
1.standard
standard模式是默認的啓動模式,不用爲Activity配置android:launchMode屬性即可,也可以顯示指定爲standard。啓動standard模式的Activity時候,會在任務棧的棧頂添加一個新的實例化的Activity。點擊返回鍵,Activity的退棧順序就按照任務棧先進先出的結構退棧。

2.singleTop
啓動singleTop模式的Activity時候,系統會查找當前任務棧棧頂元素是不是當前要啓動的Activity實例的類,如果不是,會實例化一個新的類添加到棧頂;如果是,當前棧頂Activity會被複用。點擊返回鍵,Activity的退棧順序就按照任務棧先進先出的結構退棧。

3.singleTop
啓動singleTask模式的Activity時候,Activity會默認開啓一個新的任務棧,該Activity作爲根元素。如果該Activity的實例已經存在單獨的任務棧,系統會調用該Activity的onNewIntent()方法,保證該Activity只會存在一個實例。關於singleTask的元素退棧分兩種情況:
-啓動的Activity屬於本應用程序Activity集合
首先定義Activity啓動規則如下圖所示。當啓動順序爲A->C->A->C,返回棧退棧操作爲C->A->home界面,通過實際的例子可以說明,當一個任務棧裏存在singleTask類型的實例,再啓動該singleTask類型的Activity時候,在任務棧裏該Activity實例上面的Activity都會清出任務棧,該Activity變成任務棧頂元素。
這裏寫圖片描述

-啓動的Activity不屬於本應用程序應用程序集合
當啓動的singleTask爲另外的應用程序的Activity,如果當前後臺沒有任務棧存在該Activity的情況,就新建一個任務棧,該Activity爲該任務棧的棧頂元素。一種特殊的情況,當後臺剛好有一個任務棧存在改Activity的時候,此處該任務棧會被調到前臺。如果此時按返回鍵的時候,回退的過程會是如下:
這裏寫圖片描述

4.singleInstance
啓動singleInstance與singleTask相似,只是系統不會向聲明爲singleInstance的任務棧添加其他的activity,通過該聲明爲singleInstance的Activity實例啓動其他的Activity,其他Activity必須添加到其他的任務棧,也就是說聲明額外singleInstance的Activity所在任務棧只有它一個元素。

下面說下關於Intent的常用flags系統常量:
FLAG_ACTIVITY_NEW_TASK
該常量的實際效果跟上面提到的singleTask的啓動的Activity不屬於本應用程序的Activity集合效果一樣。
FLAG_ACTIVITY_SINGLE_TOP
該常量實際效果跟singleTop效果一樣。
FLAG_ACTIVITY_CLEAR_TOP
該常量相當於上面提到的singleTask的啓動的Activity屬於本應用程序的Activity集合效果一樣。

本文個人週末動手實踐小結,可能會有理解偏差錯誤的地方,歡迎大家指正,一起共同進步。

轉載請註明出處:http://blog.csdn.net/johnnyz1234/article/details/47209957

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章