【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 一 )
文章目錄
- 前言
- 一、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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 启动过程】Activi
- 下一篇: 【Android 启动过程】Activi