Activity android:launchMode

在 Manifest.xml 中每個 Activity 都有個 launchMode 能夠調整…
若是專案中每個 Activity 都很獨立,通常是不太須要注意到這個屬性…
但如果專案中的某個 Activity 有可能 startActivity 本身…
例如一個用來顯示資料列表的 Activity 可能在點了某項目後還是利用同一個類別顯示子項目…
那 launchMode 就須要注意嘍…使用了錯的 launchMode 可能形成操做流程不符合預期…

developers 的 launchMode 介紹

android:launchMode 共分為四種模式…簡單的說明以下…

standard每 startActivity 都是新的實體
singleTop若 startActivity 的對像在 Top 時,不產生新的實體
singleTask該 Activity 存在於主 Task 中可是惟一實體
singleInstance該 Activity 會存於在和主 Task 不一樣的 Task 中且惟一

standard 範例html

public class A extend Activity
{
    // A 的 launchMode 為 standard
    // 可 startActivity(A) 與 startActivity(B)
}

public class B extend Activity
{
    // B 的 launchMode 為 standard
    // 可 startActivity(A) 與 startActivity(B)
}

// A 為 LAUNCHER 並開始 B,目前 Activity Queue 中有 A、B
// 再由 B 再開啟 B,再開啟 B,再開啟 A,目前 Activity Queue 中有 A、B、B、B、A

singleTop 範例 java

public class A extend Activity
{
    // A 的 launchMode 為 standard
    // 可 startActivity(A) 與 startActivity(B)
}

public class B extend Activity
{
    // B 的 launchMode 為 singleTop
    // 可 startActivity(A) 與 startActivity(B)
}

// A 為 LAUNCHER 並開始 B,目前 Activity Queue 中有 A、B
// 再由 B 再開啟 B,再開啟 B,再開啟 A,目前 Activity Queue 中有 A、B、A
// 因為 B 為 TopActivity 因此由 B 再開啟的 B 不會再產生新的實體

singleTask 範例android

public class A extend Activity
{
    // A 的 launchMode 為 standard
    // 可 startActivity(A) 與 startActivity(B)
}

public class B extend Activity
{
    // B 的 launchMode 為 singleTask
    // 可 startActivity(A) 與 startActivity(B)
}

// A 為 LAUNCHER 並開始 A,目前 Activity Queue 中有 A、A 且兩者的 Task ID 相同
// 再由 A 再開啟 B,再開啟 B,再開啟 A,目前 Activity Queue 中有 A、A、B、A,且 getTaskId() 皆相同
// 因為 B 為 singleTask 因此在 Task 中是惟一的,這時若再由最後一個 A 開啟 B
// Activity Queue 會變成 A、A、B 即回到剛才已存在的 B
// 若在 B 按下 Back 即理所當然的變成 A、A

singleInstance 範例ide

public class A extend Activity
{
    // A 的 launchMode 為 standard
    // 可 startActivity(A) 與 startActivity(B)
}

public class B extend Activity
{
    // B 的 launchMode 為 singleInstance
    // 可 startActivity(A) 與 startActivity(B)
}

// A 為 LAUNCHER 並開始 A,目前 Activity Queue 中有 A、A 且兩者的 Task ID 相同
// 再由 A 再開啟 B,此時 Activity Queue 中有 A、A、B,且 A 與 B 的 getTaskId() 不會相同
// 因為 B 為 singleInstance 因此會產生一個新的 Task 且在本身的 Task 中是惟一的
// 這時若再由最後一個 B 開啟 A 即會變成 A、A、B、A,全部的 A 是同一個 Task ID
// 若此時再由 A 開啟 B 即會變成 A、A、B,且 Task ID 不相同
// 這時若在不一樣 Task ID 的 B 中按了 Back 鍵,Queue 會變成本來主 Task 的 A、A、A
// 因此使用 SingleInstance 時要特別當心
相關文章
相關標籤/搜索