日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产又黄又粗又猛又爽视频 | 日韩一区二区三免费高清在线观看 | 国产欧美日韩精品区一区二污污污 | 真人一毛片 | 日日夜夜超碰 | 黄色免费在线观看网站 | 一级黄色大片网站 | www天堂网 | 亚洲成人av一区二区 | 一级激情视频 | 在线观看高清视频 | 深夜福利免费在线观看 | 麻豆一区产品精品蜜桃的特点 | 欧美三级电影在线观看 | 欧美一区二区三区四区视频 | 艳母日本动漫在线观看 | 一级α片免费看刺激高潮视频 | av日韩一区二区三区 | 久久久久人妻一道无码AV | 一区二区三区在线观看 | 国产精品熟妇人妻g奶一区 a少妇 | 天天狠天天透 | 一区二区免费在线观看视频 | 婷婷色av| 91成人观看 | 两个人看的www视频免费完整版 | 东京热一本视频一区 | 九九视频这里只有精品 | 国产精品久久久久久免费观看 | 欧美三级网站 | 国产拍拍视频 | 亚洲天堂欧美在线 | 四虎影像 | 免费看黄色网址 | 国产嫩草在线 | 日韩高清一区 | 日本不卡网 | 手机看片福利在线 | 日韩av中文字幕在线免费观看 | 人人人爽 | 欧美色综合网站 | 国产亚洲一区二区在线 | 欧美第一页浮力影院 | 欧美国产高潮xxxx1819 | 国产freexxxx性播放麻豆 | 日韩黄网站 | 欧美黄色a视频 | 婷婷色中文 | 超碰免费在 | 97久久人澡人人添人人爽 | 日本一区二区三区成人 | 精品国产成人av在线免 | 极品女神无套呻吟啪啪 | 日韩av看片| 欧美在线视频一区二区三区 | 日韩一区二区三区视频在线观看 | 国产精品91久久 | 国产主播啪啪 | 无码人妻aⅴ一区二区三区有奶水 | 欧美日韩高清一区二区 国产亚洲免费看 | 在线se | 色妇av| 国产一区二区三区免费看 | 激情伊人网 | 亚洲 欧美 自拍偷拍 | 亚洲av无码成人精品区 | 动漫av一区二区 | jzjzz成人免费视频 | 日本大胆欧美人术艺术 | 999成人网 | 欧美日韩国产不卡 | 激情av | 欧美激情18 | 久久午夜鲁丝片 | www性 | 国产精品有限公司 | 双性人hdsexvideos| 99福利网| 秋霞福利 | 99色影院| 777理伦三级做爰 | 日本少妇与黑人 | 国产三级a | www.av色| 日韩欧美亚洲一区 | 国产精品一区二区自拍 | 97福利影院 | 蜜桃色av| 日本熟女一区二区 | 天天爽| 国产成人精品a视频一区 | 美国毛片基地 | 亚洲一级片网站 | 国产一级黄色片子 | 欧美一区二区三区视频在线 | 成人av男人的天堂 | 二区三区偷拍浴室洗澡视频 | 免费午夜网站 | 成人小视频免费看 |