日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 一 )

發(fā)布時間:2025/6/17 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 一 ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、ClientTransactionHandler.scheduleTransaction
  • 二、ActivityThread.H 處理 EXECUTE_TRANSACTION 消息
  • 三、TransactionExecutor execute -> executeCallbacks 方法
  • 四、LaunchActivityItem.execute
  • 總結(jié)

前言

上一篇博客 【Android 啟動過程】Activity 啟動源碼分析 ( AMS -> ActivityThread、AMS 線程階段 二 ) 分析到 , 在 AMS 進程通過 Binder 機制調(diào)用 ActivityThread 中的 ApplicationThread 內(nèi)部類中 scheduleTransaction 方法 ;

在該方法中 , 發(fā)送了 ActivityThread.H.EXECUTE_TRANSACTION 159159159 消息 , 由 ActivityThread 中的內(nèi)部類 H 處理該消息 ;

從 Binder 調(diào)用 ActivityThread 開始 , 就進入了主線程階段開始執(zhí)行 , 這里開始在主線程中創(chuàng)建 Activity , 并啟動該 Activity ;





一、ClientTransactionHandler.scheduleTransaction



在 ClientTransactionHandler.scheduleTransaction 方法中 , 發(fā)送了 159159159 消息 , 并且將參數(shù) ClientTransaction transaction 傳遞給了 ActivityThread.H ;

/*** 定義{@link android.app.servertransaction.ClientTransaction}或其項可以在客戶端上執(zhí)行的操作。* @hide*/ public abstract class ClientTransactionHandler {// 安排與階段相關(guān)的邏輯和處理程序。/** 準(zhǔn)備并安排事物執(zhí)行。 */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 內(nèi)部類中 , 處理 int EXECUTE_TRANSACTION = 159 消息時 , 獲取傳入的 ClientTransaction transaction 對象 , 并執(zhí)行該事務(wù) mTransactionExecutor.execute(transaction) ;

mTransactionExecutor 是 ActivityThread 成員變量 , 是執(zhí)行多步驟事務(wù)的執(zhí)行者 ;

/*** 它管理應(yīng)用程序進程中主線程的執(zhí)行、調(diào)度和執(zhí)行活動、廣播以及活動管理器請求的其他操作。** {@hide}*/ public final class ActivityThread extends ClientTransactionHandler {// 執(zhí)行多步驟事務(wù)的執(zhí)行者。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 調(diào)用 scheduleTransaction 方法發(fā)送 159 消息時// 將 transaction 傳遞到了 H 中// 此處獲取該 transaction final ClientTransaction transaction = (ClientTransaction) msg.obj;// 執(zhí)行 transaction 相關(guān)信息 mTransactionExecutor.execute(transaction);if (isSystem()) {// 系統(tǒng)進程內(nèi)的客戶端事務(wù)在客戶端而不是ClientLifecycleManager上循環(huán),// 以避免在處理此消息之前被清除。transaction.recycle();}// TODO(lifecycler): 回收本地計劃的事務(wù)。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) 方法 , 執(zhí)行事務(wù)的過程 ;

傳入的參數(shù) ClientTransaction transaction 實際上就是 ActivityThread ;

在 execute 方法中 , 調(diào)用了 executeCallbacks 方法 , 在該方法中從 ClientTransaction 獲取 ClientTransactionItem 集合 , 最終調(diào)用 了 ClientTransactionItem 的 execute 方法 , item.execute(mTransactionHandler, token, mPendingActions) ;

/*** 類以正確的順序管理事務(wù)執(zhí)行。* @hide*/ public class TransactionExecutor {/*** 解決事務(wù)。* 首先,所有回調(diào)將按照它們在列表中出現(xiàn)的順序執(zhí)行。* 如果回調(diào)需要特定的執(zhí)行前或執(zhí)行后狀態(tài),則客戶端將相應(yīng)地進行轉(zhuǎn)換。* 然后,客戶端將循環(huán)到最終生命周期狀態(tài)(如果提供)。* 否則,它將保持初始狀態(tài)或回調(diào)所需的最后狀態(tài)。*/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");}/** 循環(huán)檢查回調(diào)請求的所有狀態(tài),并在適當(dāng)?shù)臅r間執(zhí)行它們。 */@VisibleForTestingpublic void executeCallbacks(ClientTransaction transaction) {// 從 ClientTransaction 獲取 ClientTransactionItem 集合final List<ClientTransactionItem> callbacks = transaction.getCallbacks();// 遍歷 ClientTransactionItem 集合 , 并執(zhí)行 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) 碼中設(shè)置的 ;

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 中調(diào)用了 item.execute(mTransactionHandler, token, mPendingActions) 代碼 , 下面繼續(xù)分析 ClientTransactionItem 的 execute 方法 ,

這里的 ClientTransactionItem 實際上是 LaunchActivityItem , LaunchActivityItem 的 execute 創(chuàng)建 ActivityClientRecord 封裝了啟動 Activity 的所有必要信息 ,

client.handleLaunchActivity(r, pendingActions, null /* customIntent */) 代碼 , client 就是 ActivityThread , 最終調(diào)用的是 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 ;


總結(jié)

發(fā)送消息給 ActivityThread.H , 然后經(jīng)過上述一系列調(diào)用 , 獲取到了啟動 Activity 的所有數(shù)據(jù) , 又回到 ActivityThread 中執(zhí)行 handleLaunchActivity 方法 ;

總結(jié)

以上是生活随笔為你收集整理的【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 一 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。