activity標籤中task的相關屬性(接上篇Activity啓動模式)

昨天更新了Activity的啓動模式,不知道大家是不是看的頭皮發麻-。+。。。昨天說到還有一點點東西,今天給大家補上一點,篇幅不會很多。

今天這篇主要是針對AndroidManifest中,Activity標籤下的一些關於Task屬性,至於Task是什麼就不多說了,在上一篇中比較詳細的講過,如果沒看過的朋友可以關注一下筆者上一篇的文章:細談Activity四種啓動模式不多扯皮了,直接進入正題:

我們在上節課中講解Activity的啓動模式,其實現在回想一下,主要Task棧內的元素改變。所以歸根到底,還是圍繞着Task棧。

那其實除了給Activity設置啓動模式之外,Activity還有一些相關的屬性,也是關於Task的。

allowTaskReparenting

標記此屬性的Activity實例所在的當前應用  在退居後臺後,決定是否將標記的Activity從啓動的Task移動到相同affinity的Task(需要和taskaffinity屬性配合使用):

  • true:可以移動。
  • false(默認):不能移動。

這個話筆者已經儘量的精簡的來說了-。+,再簡單解釋下就是:我們給一個Activity實例標記了此屬性並設置爲true。當他所在的Application退到後臺之後,就會將Activity實例移動到具有相同的affinity。

由此我們也能知道,對於此種情況,我們不能默認Activity的affinity,必須手動設置(taskAffinity)。

還不清楚的話,還是上一張圖吧:


這張圖可以說良心之作了,相信大家看的也比較明白吧:

首先我們給TwoApp的TwoActivity設置了allowTaskReparenting屬性。

在OneApp中的MainActivity點開了TwoApp的TwoActivity,在默認情況下它還是在OneApp顯示的,然後我們點擊Home鍵,TwoApp的TwoActivity就會移動到TwoApp的Task(因爲TwoActivity默認的affinity就是TwoApp的包名。。。)

好了,現在我們用代碼來實現一下看一下效果:

爲了讓大家看的明確,我還是老規矩,把所有任務全都清空

然後我們點開OneApp:

接着啓動TwoApp的TwoActivity:

我們發現現在還是一個任務。

現在我們點擊Home鍵,再點開OneApp:

我們發現再次點開之後,TwoApp的TwoActivity消失了。

那我們點開TwoApp看一下:

我們看到剛剛創建的TwoActivity現在在TwoApp中(因爲我們剛剛創建TwoApp並沒有啓動TwoActivity)。

所以關於這個屬性,我想我們可以過了。

alwaysRestainTaskState

首先這個屬性,只針對根Activity起作用。

標記應用的Task師傅保持原來的狀態:

  • true:總保持
  • false(默認):不保證維持原來狀態

這個我們這麼解釋:我們的App如果長期在後臺帶着不使用,我們的系統會對應用的Task進行清理,而清理過程中,如果我們對根Activity標記了這個屬性,那麼他會保留我們根Activity的狀態。

這個沒把飯舉例子,相信大家是可以理解的。

clearTaskOnLaunch

這個屬性也只是針對根Activity起作用的。

每次喚醒應用是,是否清楚除跟Activity的所有Activity:

  • true:清楚
  • false(默認):不清除

這個我們很簡單,我們聚一下例子就好。

我們的OneApp進行1->2,2->3,然後點Home鍵,然後在重新喚醒應用到前臺來,我們就知道了。

這個比較簡單,一步帶過了:

根據日誌我們也看出來,2和3確實是被銷燬了:

這個屬性過。

finishOnTaskLaunch

這個屬性跟clearTaskLaunch很像,只不過他只是銷燬標記的Activity,而clearTaskOnLaunch是除了根Activity全部銷燬。

noHistory

標記的Activity(包括根Activity)跳轉到其他Activity時,Task不將其壓入棧。

這個我來解釋一下,比如說我們從MainActivity跳轉到TwoActivity,那麼Task應該講MainActivity壓入棧,但是如果給MainActivity標記了noHistory屬性,那麼他就不會被壓入棧。

代碼實例:我們給MainActivity標記爲onHistory,然後讓其從1->2,點擊back,看看發生了什麼:


點擊back後並沒有退回到MainActivity,而是直接回到了Home界面,這說明此時Task已經被銷燬。


根據以上日誌我們也可以看出來,並沒有調用MainActivity的onDestroy相關方法,可見他根本就沒有入Task棧。


好了,以上便是我們今天補充的所有內容,喜歡的朋友希望點贊關注一波,有不同意見的可以在下方留言。

發佈了85 篇原創文章 · 獲贊 98 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章