前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 二 )

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

作者头像
韩曙亮
发布2023-03-29 17:18:12
3070
发布2023-03-29 17:18:12
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

前言

在上一篇博客 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 一 ) 分析了从 ActivityThreadmain() 函数启动 , ApplicationThread 绑定 , Application 创建 , 下面继续分析后续内容 ;

一、ActivityManagerService.attachApplicationLocked


回到 AMS 中的 ActivityManagerService 方法 , 在调用 ActivityThread 绑定 ApplicationThread 后 ,

有调用了 mStackSupervisor.attachApplicationLocked 方法 , 查看顶部可见 Activity 是否正等待在此进程中运行 ;

代码语言:javascript
复制
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 方法中 , 调用了 ActivityStackSupervisorattachApplicationLocked 方法 ,

ActivityStackSupervisor.attachApplicationLocked 方法中 , 调用了 ActivityStackSupervisor.realStartActivityLocked 方法 ;

代码语言:javascript
复制
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 ;

后续逻辑基本就与该博客后续的分析对应上了 ;

代码语言:javascript
复制
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 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
  • 一、ActivityManagerService.attachApplicationLocked
  • 二、ActivityStackSupervisor.attachApplicationLocked
  • 三、ActivityStackSupervisor.realStartActivityLocked
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档