2014-08-31 17 views
7

當您點擊應用程序的啓動圖標時會發生什麼?單擊應用程序的啓動圖標時會發生什麼?

  1. 總是發送一個新的意圖,或者結果有時與從最近的任務中恢復任務相同嗎?

  2. 如果發送了意圖,它何時發送到新活動實例的onCreate()方法以及何時通過現有活動的onNewIntent()路由?

  3. 讓我們假設意圖通過任務中現有活動的onNewIntent()進行路由。它發送給哪個活動?最靠近頂部還是最靠近根部的那個?它會始終被髮送到應用程序啓動活動的實例,還是有時會被髮送到與根相同的活動?它能否被髮送到與根不相同的活動?

  4. 最後,這是如何影響任務中活動的各種啓動模式(標準,單頂,單實例,單任務)?

如果有人瞭解這一切,請幫助我!

+0

我想你可以深入探究ActivityManager的源代碼。 – suitianshi 2014-09-03 02:26:28

回答

7
What happens when you click on an app's launch icon? 

啓動的應用程序調用startActivity與意圖[動作= Intent.ACTION_MAIN,類別= Intent.CATEGORY_LAUNCHER和標誌= Intent.FLAG_ACTIVITY_NEW_TASK]。

關於Intent.FLAG_ACTIVITY_NEW_TASK,從docs

當使用這個標誌,如果一個任務已在運行的活動 你現在開始,然後一個新的活動將不會啓動; 相反,當前的任務只會被帶到 屏幕,上次在該州的前

onNewIntent基礎知識:當活動設立或者singleTask

onNewIntent只會傳遞,singleInstance啓動模式。如果活動設置了singleTop啓動模式,或者啓動活動的意圖設置了標誌FLAG_ACTIVITY_SINGLE_TOP並且活動實例已位於目標任務的頂部,那麼它也會交付。這意味着嘗試啓動一個新的活動實例,而現有的實例本身需要處理這個意圖。

這是您的查詢的響應:

是一個新的意圖總是被髮送,或者是結果有時 同樣從最近的任務恢復任務?

如果任務已經運行,它將被帶到前臺。如果FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET標誌用於啓動活動,後者將任務帶到前臺,則活動將被終止。從docs

這是,你必須在你的應用程序 邏輯斷裂的情況下非常有用。例如,電子郵件應用程序可能會有一條命令來查看附件,該附件會啓動圖像查看活動以顯示 它。此活動應該是電子郵件應用程序的任務 的一部分,因爲它是用戶參與的任務的一部分。但是,如果用戶離開該任務並稍後從家中選擇電子郵件應用程序 我們可能會讓他們回到他們正在查看的對話,而不是 圖片附件,因爲這是令人困惑的。通過在啓動圖像查看器時設置此標誌 ,下次用戶返回郵件時,將刪除該查看器及其啓動的任何活動。

-

如果意圖是送的,當它被髮送到一個新的活動實例的onCreate()方法 ,當它獲得通過現有的 onNewIntent()路由活動?

onCreate在創建活動的新實例時被調用。如果已經存在活動實例並且不需要創建新實例,則調用onNewIntent,如在singleInstance,singleTask和有條件地singleTop(如上所述)的情況下。

讓我們假設意圖通過任務中 現有活動的onNewIntent()進行路由。它發送給哪個活動? 離頂點最近的那個還是最靠近根的那個?它會始終將 發送到應用程序啓動活動的實例,還是有時會將它發送到與根相同的活動? 它可以被髮送到一個活動,它不與根具有相同的 親和力嗎?

如果是singleTasksingleInstance它必須是任務的根。在singleTop的情況下,它必須是該任務的最高活動。

最後,這是怎麼受的任務活動 的各種啓動模式 (標準,單頂,單實例,單任務)?

我希望直到現在解釋提供的答案。

更新1:

這裏是Launcher代碼添加標誌,以意圖:

void processShortcut(Intent intent) { 
    .... 
    Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
    .... 
} 

void startActivitySafely(Intent intent) { 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    ... 
    startActivity(intent); 
} 
+1

這是一個很好的答案。通過在onCreate()和onNewIntent()方法中記錄Integer.toHexString(intent.getFlags())的值,你會發現實際上有更多的標誌比你提到的更多。在onCreate()中獲得值0x10200000,在onNewIntent()中獲得0x10600000。這意味着總是有2個標誌FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,對於singleTask和singleInstance,還有標誌FLAG_ACTIVITY_BROUGHT_TO_FRONT。 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的出現非常好,因爲它確認了您對FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET的看法。 – 2014-09-03 07:59:21

+1

我希望我能找到它說哪些標誌設置的文檔中的位置。知道這一點非常重要,因爲它們中的一些具有絕對破壞性的效果! – 2014-09-03 08:06:04

+0

我還不能獎賞賞金,但是如果我在接下來的11個小時內沒有發現任何其他的標誌混淆了這個解釋,那麼100分就是你的! – 2014-09-03 08:27:23

0

最好的辦法是通過開發者文檔這裏閱讀:http://developer.android.com/training/basics/activity-lifecycle/index.html

有是第一課中的流程圖(http://developer.android.com/images/training/basics/basic-lifecycle.png),它提供了Android活動生命週期的優秀圖形表示。

+1

謝謝,但我的問題是關於任務比個人活動更多。可悲的是,這些文檔甚至沒有解釋這些工作是如何實現的。 – 2014-09-03 05:50:45

+0

您是否在提到任務時引用了一系列活動? http://developer.android.com/guide/components/tasks-and-back-stack.html#ManagingTasks – Karl 2014-09-03 19:27:40

+0

是的,我。任務就像一堆活動,但在文檔中很少解釋它們。這個答案,特別是幻燈片鏈接,包含大量真正有用的信息http://stackoverflow.com/a/17873524/403255 – 2014-09-03 23:37:23

相關問題