文章目录
前言
一、ActivityManagerService.attachApplicationLocked
二、ActivityStackSupervisor.attachApplicationLocked
三、ActivityStackSupervisor.realStartActivityLocked
前言
在上一篇博客 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 一 ) 分析了从 ActivityThread 的 main() 函数启动 , ApplicationThread 绑定 , Application 创建 , 下面继续分析后续内容 ;
一、ActivityManagerService.attachApplicationLocked
回到 AMS 中的 ActivityManagerService 方法 , 在调用 ActivityThread 绑定 ApplicationThread 后 ,
有调用了 mStackSupervisor.attachApplicationLocked 方法 , 查看顶部可见 Activity 是否正等待在此进程中运行 ;
public class ActivityManagerService extends IActivityManager.Stub implements 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 , 此时又回到 ActivityThread if (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 是否正在等待在此进程中运行 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 方法中 , 调用了 ActivityStackSupervisor 的 attachApplicationLocked 方法 ,
在 ActivityStackSupervisor.attachApplicationLocked 方法中 , 调用了 ActivityStackSupervisor.realStartActivityLocked 方法 ;
public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener, RecentTasks.Callbacks { boolean attachApplicationLocked(ProcessRecord app) throws RemoteException { // 省略其它代码 , 在此处调用了 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 进程中执行的相关操作 章节进行过讲解 , 不管是冷启动 , 还是热启动 , 都要调用 ActivityStackSupervisor.realStartActivityLocked 方法开启 Activity ;
后续逻辑基本就与该博客后续的分析对应上了 ;
public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener, RecentTasks.Callbacks { final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app, boolean andResume, boolean checkConfig) throws RemoteException { if (!allPausedActivitiesComplete()) { // 当有活动暂停时,我们将跳过开始任何新活动,直到暂停完成。 // 注意:对于在暂停状态下启动的活动,我们也会这样做,因为它们将首先恢复,然后在客户端暂停。 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); // 安排启动时间以收集有关慢速应用程序的信息。 r.startLaunchTickingLocked(); r.setProcess(app); if (getKeyguardController().isKeyguardLocked()) { r.notifyUnknownVisibilityLaunched(); } // 让窗口管理器根据新的活动顺序重新评估屏幕方向。 // 注意,这样做的结果是,它可以使用新的方向调用activity manager。 // 我们不关心这一点,因为活动当前未运行,所以我们只是重新启动它。 if (checkConfig) { // 推迟恢复,因为我们将很快启动新活动。 // 我们不希望在确保配置和尝试恢复重点堆栈的顶级活动的同时,重复启动同一记录。 ensureVisibilityAndConfig(r, r.getDisplayId(), false /* markFrozenIfConfigChanged */, true /* deferResume */); } if (r.getStack().checkKeyguardVisibility(r, true /* shouldBeVisible */, true /* isTop */)) { // 仅当基于keyguard状态允许活动可见时,我们才将可见性设置为true。 // 这样可以避免在窗口管理器中将此设置为运动状态, // 而由于以后的调用而取消该设置,以确保将可见性设置回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)); // 设置所需的最终状态。配置生命周期 final ActivityLifecycleItem lifecycleItem; if (andResume) { // 开启新的 Activity lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward()); } else { // 终止 Activity lifecycleItem = PauseActivityItem.obtain(); } clientTransaction.setLifecycleStateRequest(lifecycleItem); // 安排事务。 mService.getLifecycleManager().scheduleTransaction(clientTransaction); // 上面的代码是启动 Activity 的核心代码 } catch (RemoteException e) { } } finally { endDeferResume(); } return true; } }
完整代码参考 /frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java ;