天天看點

Activity基礎 - 任務棧

什麼是任務棧?

前面的文章我們多次提到過一個叫任務棧的東西,那什麼是任務棧呢?首先我們先搞清什麼是任務,任務的定義:

任務是在執行特定任務的時候與使用者互動的一些activity

那什麼是任務棧呢?

android任務棧簡單了解

  1. android任務棧又稱為Task,它是一個棧結構,具有後進先出的特性,用于存放我們的Activity元件。
  2. 我們每次打開一個新的Activity或者退出目前Activity都會在一個稱為任務棧的結構中添加或者減少一個Activity元件,是以一個任務棧包含了一個activity的集合, android系統可以通過Task有序地管理每個activity,并決定哪個Activity與使用者進行互動:隻有在任務棧棧頂的activity才可以跟使用者進行互動。
  3. 在我們退出應用程式時,必須把所有的任務棧中所有的activity清除出棧時,任務棧才會被銷毀。當然任務棧也可以移動到背景, 并且保留了每一個activity的狀态. 可以有序的給使用者列出它們的任務, 同時也不會丢失Activity的狀态資訊。
  4. 需要注意的是,一個App中可能不止一個任務棧,某些特殊情況下,單獨一個Actvity可以獨享一個任務棧。還有一點就是一個Task中的Actvity可以來自不同的App,同一個App的Activity也可能不在一個Task中。

實際使用

我們來認識一個參數:TaskAffinity 。這個蠶食可以翻譯為任務相關性。這個參數辨別了一個activity所需的任務棧的名字。在預設情況下,所有activity所需的任務棧的名稱為應用的包名(PackgeName)。這個參數是可以自定義的,但是有一定的規則:例如:不能和包名 相同;要符合命名規範等。TaskAffinity 屬性要和singleTask啟動模式或者allowTaskReparenting屬性配對使用,在其他情況下使用沒有意義。

示例

我們通過幾個場景來認識一下這個任務棧。并且了解一下TaskAffinity 的使用。

  • 示例1:
<activity android:name=".ThirdActivity">
        </activity>
        <activity
                android:name=".MainActivity"
                android:launchMode="singleInstance">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
           
Activity基礎 - 任務棧

從日志可以看出,此時隻有一個id為64 的任務棧,棧内有兩個activity:MainActivity 和 ThirdActivity,我們前面文章已經分析過,預設的啟動模式是standard模式,此模式啟動的activity會重複建立,并且放在啟動他的任務棧中,遵循先進後出的原則。然後

  • 示例2:

    我們改變一下啟動模式:

<activity android:name=".ThirdActivity"
        android:taskAffinity="com.xyd.task1">
        </activity>
        <activity
                android:name=".MainActivity"
        android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
           
Activity基礎 - 任務棧

我們可以看到,現在有兩個任務棧,id分别是66 和 65 ,看一下任務棧的名字:

Activity基礎 - 任務棧
紅框标注的位置就是task任務棧的資訊。
以上就是我自己做的demo,驗證任務棧的使用及特征,說的比較淺,以後如果能深入學習的話,再寫點深入的東西。
歡迎批評指正。