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()進行路由。它發送給哪個活動? 離頂點最近的那個還是最靠近根的那個?它會始終將 發送到應用程序啓動活動的實例,還是有時會將它發送到與根相同的活動? 它可以被髮送到一個活動,它不與根具有相同的 親和力嗎?
如果是singleTask
和singleInstance
它必須是任務的根。在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);
}
我想你可以深入探究ActivityManager的源代碼。 – suitianshi 2014-09-03 02:26:28