1. 程式人生 > >同一程序activity中啟動另一個activity的流程

同一程序activity中啟動另一個activity的流程

在上一篇文章launcher介面點選應用圖示啟動Activity流程分析 中我們分析了在新程序中啟動activity的流程,這裡我們也順便介紹下在同一個程序的activity中啟動另一個activity,這種場景在實際應用中應該更為常見。都是啟動activity,這兩種場景有什麼區別呢?其實也沒什麼大的差別,主要是在新程序中啟動activity時AMS要先建立一個新程序然後才在新程序中完成activity的啟動,而在同一程序中啟動activity就無需這一步–新的activity直接在原有程序中啟動。

這裡啟動activity的主要流程分為三步:

第一步:launcher程序通知AMS自己想要啟動一個應用的主activity,其中Launcher和AMS的通訊使用了跨程序技術,流程圖如下,其中ActivityManagerProxy是AMS的遠端介面;

這裡寫圖片描述

第二步:AMS收到啟動activity的請求後會調整一下自身的狀態(為後面啟動新的activity做準備)並要求Launcher當前棧頂的activity進入pause狀態,流程圖如下,其中ApplicationThreadProxy是ApplicationThread的遠端介面;

這裡寫圖片描述

第三步:Launcher pause完當前棧頂activity後通知AMS可以開始啟動新activity了,準備就緒後AMS會通過ApplicationThread的遠端介面ApplicationThreadProxy來呼叫scheduleLaunchActivity通知新程序開始真正啟動activity的工作了,activity的onCreate和onResume函式都是在ActivityThread的handleLaunchActivity中完成的;

這裡寫圖片描述

至此,同一程序的activity中啟動另一個activity的流程走完了。

詳細的程式碼流程與launcher介面點選應用圖示啟動Activity流程分析 文中的大致一樣,主要是在14步:ActivityStackSupervisor.startSpecificActivityLocked 中走的不一樣,在同一個程序中啟動activity時判斷條件if (app != null && app.thread != null)將為true,從而直接走realStartActivityLocked函式而後會直接呼叫ApplicationThreadProxy.scheduleLaunchActivity通知應用程序完成activity的啟動。