2011年7月2日 星期六

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 範例


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 範例

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 範例

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 範例

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 時要特別小心

沒有留言:

張貼留言