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

歡迎訪問 生活随笔!

生活随笔

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

Android

【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 二 )

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

文章目錄

  • 前言
  • 一、ActivityManagerService.attachApplicationLocked
  • 二、ActivityStackSupervisor.attachApplicationLocked
  • 三、ActivityStackSupervisor.realStartActivityLocked

前言

在上一篇博客 【Android 啟動過程】Activity 啟動源碼分析 ( ActivityThread 流程分析 一 ) 分析了從 ActivityThread 的 main() 函數(shù)啟動 , ApplicationThread 綁定 , Application 創(chuàng)建 , 下面繼續(xù)分析后續(xù)內(nèi)容 ;





一、ActivityManagerService.attachApplicationLocked



回到 AMS 中的 ActivityManagerService 方法 , 在調(diào)用 ActivityThread 綁定 ApplicationThread 后 ,

有調(diào)用了 mStackSupervisor.attachApplicationLocked 方法 , 查看頂部可見 Activity 是否正等待在此進(jìn)程中運(yùn)行 ;

public class ActivityManagerService extends IActivityManager.Stubimplements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {// 為 ActivityThread 綁定 ApplicationThread 主方法private final boolean attachApplicationLocked(IApplicationThread thread,int pid) {try {checkTime(startTime, "attachApplicationLocked: immediately before bindApplication");mStackSupervisor.mActivityMetricsLogger.notifyBindApplication(app);// 在此處為 ActivityThread 綁定 ApplicationThread , 此時(shí)又回到 ActivityThreadif (app.instr != null) {thread.bindApplication(processName, appInfo, providers,app.instr.mClass,profilerInfo, app.instr.mArguments,app.instr.mWatcher,app.instr.mUiAutomationConnection, testMode,mBinderTransactionTrackingEnabled, enableTrackAllocation,isRestrictedBackupMode || !normalMode, app.persistent,new Configuration(getGlobalConfiguration()), app.compat,getCommonServicesLocked(app.isolated),mCoreSettingsObserver.getCoreSettingsLocked(),buildSerial);} else {thread.bindApplication(processName, appInfo, providers, null, profilerInfo,null, null, null, testMode,mBinderTransactionTrackingEnabled, enableTrackAllocation,isRestrictedBackupMode || !normalMode, app.persistent,new Configuration(getGlobalConfiguration()), app.compat,getCommonServicesLocked(app.isolated),mCoreSettingsObserver.getCoreSettingsLocked(),buildSerial);}} catch (Exception e) {}// 查看頂部可見 Activity 是否正在等待在此進(jìn)程中運(yùn)行if (normalMode) {try {if (mStackSupervisor.attachApplicationLocked(app)) {didSomething = true;}} catch (Exception e) {Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);badApp = true;}}return true;}}

ActivityManagerService 完整源碼參考 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java





二、ActivityStackSupervisor.attachApplicationLocked



在上述 AMS 中的 attachApplicationLocked 方法中 , 調(diào)用了 ActivityStackSupervisor 的 attachApplicationLocked 方法 ,

在 ActivityStackSupervisor.attachApplicationLocked 方法中 , 調(diào)用了 ActivityStackSupervisor.realStartActivityLocked 方法 ;

public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener,RecentTasks.Callbacks {boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {// 省略其它代碼 , 在此處調(diào)用了 realStartActivityLocked 方法 if (realStartActivityLocked(activity, app,top == activity /* andResume */, true /* checkConfig */)) {didSomething = true;}return didSomething;} }

完整代碼參考 /frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java ;





三、ActivityStackSupervisor.realStartActivityLocked



該方法步驟在 【Android 啟動過程】Activity 啟動源碼分析 ( AMS -> ActivityThread、AMS 線程階段 二 ) 二、AMS 進(jìn)程中執(zhí)行的相關(guān)操作 章節(jié)進(jìn)行過講解 , 不管是冷啟動 , 還是熱啟動 , 都要調(diào)用 ActivityStackSupervisor.realStartActivityLocked 方法開啟 Activity ;

后續(xù)邏輯基本就與該博客后續(xù)的分析對應(yīng)上了 ;

public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener,RecentTasks.Callbacks {final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,boolean andResume, boolean checkConfig) throws RemoteException {if (!allPausedActivitiesComplete()) {// 當(dāng)有活動暫停時(shí),我們將跳過開始任何新活動,直到暫停完成。// 注意:對于在暫停狀態(tài)下啟動的活動,我們也會這樣做,因?yàn)樗鼈儗⑹紫然謴?fù),然后在客戶端暫停。if (DEBUG_SWITCH || DEBUG_PAUSE || DEBUG_STATES) Slog.v(TAG_PAUSE,"realStartActivityLocked: Skipping start of r=" + r+ " some activities pausing...");return false;}final TaskRecord task = r.getTask();final ActivityStack stack = task.getStack();beginDeferResume();try {r.startFreezingScreenLocked(app, 0);// 安排啟動時(shí)間以收集有關(guān)慢速應(yīng)用程序的信息。r.startLaunchTickingLocked();r.setProcess(app);if (getKeyguardController().isKeyguardLocked()) {r.notifyUnknownVisibilityLaunched();}// 讓窗口管理器根據(jù)新的活動順序重新評估屏幕方向。// 注意,這樣做的結(jié)果是,它可以使用新的方向調(diào)用activity manager。// 我們不關(guān)心這一點(diǎn),因?yàn)榛顒赢?dāng)前未運(yùn)行,所以我們只是重新啟動它。if (checkConfig) {// 推遲恢復(fù),因?yàn)槲覀儗⒑芸靻有禄顒印?/span>// 我們不希望在確保配置和嘗試恢復(fù)重點(diǎn)堆棧的頂級活動的同時(shí),重復(fù)啟動同一記錄。ensureVisibilityAndConfig(r, r.getDisplayId(),false /* markFrozenIfConfigChanged */, true /* deferResume */);}if (r.getStack().checkKeyguardVisibility(r, true /* shouldBeVisible */,true /* isTop */)) {// 僅當(dāng)基于keyguard狀態(tài)允許活動可見時(shí),我們才將可見性設(shè)置為true。// 這樣可以避免在窗口管理器中將此設(shè)置為運(yùn)動狀態(tài),// 而由于以后的調(diào)用而取消該設(shè)置,以確保將可見性設(shè)置回false的可見活動。r.setVisibility(true);}try {// 下面的代碼是啟動 Activity 的核心代碼// 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));// 設(shè)置所需的最終狀態(tài)。配置生命周期final ActivityLifecycleItem lifecycleItem;if (andResume) {// 開啟新的 ActivitylifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());} else {// 終止 ActivitylifecycleItem = PauseActivityItem.obtain();}clientTransaction.setLifecycleStateRequest(lifecycleItem);// 安排事務(wù)。mService.getLifecycleManager().scheduleTransaction(clientTransaction);// 上面的代碼是啟動 Activity 的核心代碼} catch (RemoteException e) {}} finally {endDeferResume();}return true;} }

完整代碼參考 /frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java ;

總結(jié)

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

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