【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 一 )
文章目錄
- 前言
- 一、ClientTransactionHandler.scheduleTransaction
- 二、ActivityThread.H 處理 EXECUTE_TRANSACTION 消息
- 三、TransactionExecutor execute -> executeCallbacks 方法
- 四、LaunchActivityItem.execute
- 總結
前言
上一篇博客 【Android 啟動過程】Activity 啟動源碼分析 ( AMS -> ActivityThread、AMS 線程階段 二 ) 分析到 , 在 AMS 進程通過 Binder 機制調用 ActivityThread 中的 ApplicationThread 內部類中 scheduleTransaction 方法 ;
在該方法中 , 發送了 ActivityThread.H.EXECUTE_TRANSACTION 159159159 消息 , 由 ActivityThread 中的內部類 H 處理該消息 ;
從 Binder 調用 ActivityThread 開始 , 就進入了主線程階段開始執行 , 這里開始在主線程中創建 Activity , 并啟動該 Activity ;
一、ClientTransactionHandler.scheduleTransaction
在 ClientTransactionHandler.scheduleTransaction 方法中 , 發送了 159159159 消息 , 并且將參數 ClientTransaction transaction 傳遞給了 ActivityThread.H ;
/*** 定義{@link android.app.servertransaction.ClientTransaction}或其項可以在客戶端上執行的操作。* @hide*/ public abstract class ClientTransactionHandler {// 安排與階段相關的邏輯和處理程序。/** 準備并安排事物執行。 */void scheduleTransaction(ClientTransaction transaction) {transaction.preExecute(this);sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);}}完整代碼參考 /frameworks/base/core/java/android/app/ClientTransactionHandler.java ;
二、ActivityThread.H 處理 EXECUTE_TRANSACTION 消息
在 ActivityThread 的 H 內部類中 , 處理 int EXECUTE_TRANSACTION = 159 消息時 , 獲取傳入的 ClientTransaction transaction 對象 , 并執行該事務 mTransactionExecutor.execute(transaction) ;
mTransactionExecutor 是 ActivityThread 成員變量 , 是執行多步驟事務的執行者 ;
/*** 它管理應用程序進程中主線程的執行、調度和執行活動、廣播以及活動管理器請求的其他操作。** {@hide}*/ public final class ActivityThread extends ClientTransactionHandler {// 執行多步驟事務的執行者。private final TransactionExecutor mTransactionExecutor = new TransactionExecutor(this);class H extends Handler {public static final int EXECUTE_TRANSACTION = 159;public void handleMessage(Message msg) {if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));switch (msg.what) {case EXECUTE_TRANSACTION:// ActivityThread 調用 scheduleTransaction 方法發送 159 消息時// 將 transaction 傳遞到了 H 中// 此處獲取該 transaction final ClientTransaction transaction = (ClientTransaction) msg.obj;// 執行 transaction 相關信息 mTransactionExecutor.execute(transaction);if (isSystem()) {// 系統進程內的客戶端事務在客戶端而不是ClientLifecycleManager上循環,// 以避免在處理此消息之前被清除。transaction.recycle();}// TODO(lifecycler): 回收本地計劃的事務。break;}Object obj = msg.obj;if (obj instanceof SomeArgs) {((SomeArgs) obj).recycle();}if (DEBUG_MESSAGES) Slog.v(TAG, "<<< done: " + codeToString(msg.what));}} }完整代碼參考 /frameworks/base/core/java/android/app/ActivityThread.java
三、TransactionExecutor execute -> executeCallbacks 方法
分析 ActivityThread 的 TransactionExecutor mTransactionExecutor = new TransactionExecutor(this) 成員的 mTransactionExecutor.execute(transaction) 方法 , 執行事務的過程 ;
傳入的參數 ClientTransaction transaction 實際上就是 ActivityThread ;
在 execute 方法中 , 調用了 executeCallbacks 方法 , 在該方法中從 ClientTransaction 獲取 ClientTransactionItem 集合 , 最終調用 了 ClientTransactionItem 的 execute 方法 , item.execute(mTransactionHandler, token, mPendingActions) ;
/*** 類以正確的順序管理事務執行。* @hide*/ public class TransactionExecutor {/*** 解決事務。* 首先,所有回調將按照它們在列表中出現的順序執行。* 如果回調需要特定的執行前或執行后狀態,則客戶端將相應地進行轉換。* 然后,客戶端將循環到最終生命周期狀態(如果提供)。* 否則,它將保持初始狀態或回調所需的最后狀態。*/public void execute(ClientTransaction transaction) {final IBinder token = transaction.getActivityToken();log("Start resolving transaction for client: " + mTransactionHandler + ", token: " + token);executeCallbacks(transaction);executeLifecycleState(transaction);mPendingActions.clear();log("End resolving transaction");}/** 循環檢查回調請求的所有狀態,并在適當的時間執行它們。 */@VisibleForTestingpublic void executeCallbacks(ClientTransaction transaction) {// 從 ClientTransaction 獲取 ClientTransactionItem 集合final List<ClientTransactionItem> callbacks = transaction.getCallbacks();// 遍歷 ClientTransactionItem 集合 , 并執行 ClientTransactionItem 的 execute 方法final int size = callbacks.size();for (int i = 0; i < size; ++i) {final ClientTransactionItem item = callbacks.get(i);item.execute(mTransactionHandler, token, mPendingActions);item.postExecute(mTransactionHandler, token, mPendingActions);}} }完整代碼參考 /frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java ;
上面 TransactionExecutor 中的 executeCallbacks 中遍歷的 ClientTransactionItem 集合元素是在 ActivityStackSupervisor 的 realStartActivityLocked 方法的 LaunchActivityItem.obtain(new Intent(r.intent) 碼中設置的 ;
public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener,RecentTasks.Callbacks {final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,boolean andResume, boolean checkConfig) throws RemoteException {// Create activity launch transaction.final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,r.appToken);clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),System.identityHashCode(r), r.info,// TODO: Have this take the merged configuration instead of separate global// and override configs.mergedConfiguration.getGlobalConfiguration(),mergedConfiguration.getOverrideConfiguration(), r.compat,r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,r.persistentState, results, newIntents, mService.isNextTransitionForward(),profilerInfo));} }完整代碼參考 /frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java ;
四、LaunchActivityItem.execute
在 TransactionExecutor.executeCallbacks 中調用了 item.execute(mTransactionHandler, token, mPendingActions) 代碼 , 下面繼續分析 ClientTransactionItem 的 execute 方法 ,
這里的 ClientTransactionItem 實際上是 LaunchActivityItem , LaunchActivityItem 的 execute 創建 ActivityClientRecord 封裝了啟動 Activity 的所有必要信息 ,
client.handleLaunchActivity(r, pendingActions, null /* customIntent */) 代碼 , client 就是 ActivityThread , 最終調用的是 ActivityThread 的 handleLaunchActivity 方法 ;
/*** 請求啟動 Activity 。* @hide*/ public class LaunchActivityItem extends ClientTransactionItem {@Overridepublic void preExecute(ClientTransactionHandler client, IBinder token) {client.updateProcessState(mProcState, false);client.updatePendingConfiguration(mCurConfig);}@Overridepublic void execute(ClientTransactionHandler client, IBinder token,PendingTransactionActions pendingActions) {Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState,mPendingResults, mPendingNewIntents, mIsForward,mProfilerInfo, client);client.handleLaunchActivity(r, pendingActions, null /* customIntent */);Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); }完整代碼參考 /frameworks/base/core/java/android/app/servertransaction/LaunchActivityItem.java ;
總結
發送消息給 ActivityThread.H , 然后經過上述一系列調用 , 獲取到了啟動 Activity 的所有數據 , 又回到 ActivityThread 中執行 handleLaunchActivity 方法 ;
總結
以上是生活随笔為你收集整理的【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 一 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 启动过程】Activi
- 下一篇: 【Android 启动过程】Activi