Activity 的启动流程源码剖析(三)

简介: 简单分析 Activity 的启动流程(三)这一篇主要看 ApplicationThread 相关的流程源码的版本Android 27V4 27.

简单分析 Activity 的启动流程(三)
这一篇主要看 ApplicationThread 相关的流程

源码的版本

Android 27
V4 27.1.1
我都是粘的里面比较关键的源码,还希望配合源码阅读

这是本篇的大概流程,先熟悉一下吧

img_39fbd30fdbf64c42d24687eede74cf78.png
流程

这一篇我们丛 ApplicationThread.scheduleLaunchActivity() 开始看起

 public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
                ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
                CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
                int procState, Bundle state, PersistableBundle persistentState,
                List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
                boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) {

            updateProcessState(procState, false);

            ActivityClientRecord r = new ActivityClientRecord();
            ...
            sendMessage(H.LAUNCH_ACTIVITY, r);
        }

接着看 sendMessage 方法

private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {
        if (DEBUG_MESSAGES) Slog.v(
            TAG, "SCHEDULE " + what + " " + mH.codeToString(what)
            + ": " + arg1 + " / " + obj);
        Message msg = Message.obtain();
        msg.what = what;
        msg.obj = obj;
        msg.arg1 = arg1;
        msg.arg2 = arg2;
        if (async) {
            msg.setAsynchronous(true);
        }
        mH.sendMessage(msg);
    }

在这里我们看到了它实际上是使用了 H 这个类,这个类了就是个 Handler
我们接下来找到 H 处理 LAUNCH_ACTIVITY 的代码

 case LAUNCH_ACTIVITY: {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
                    final ActivityClientRecord r = (ActivityClientRecord) msg.obj;

                    r.packageInfo = getPackageInfoNoCheck(
                            r.activityInfo.applicationInfo, r.compatInfo);
                    handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;

继续查看 handleLaunchActivity

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
        //初始化 Window
        WindowManagerGlobal.initialize();

        Activity a = performLaunchActivity(r, customIntent);

        if (a != null) {
            r.createdConfig = new Configuration(mConfiguration);
            reportSizeConfigurations(r);
            Bundle oldState = r.state;
            handleResumeActivity(r.token, false, r.isForward,
                    !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);

            if (!r.activity.mFinished && r.startsNotResumed) {
                performPauseActivityIfNeeded(r, reason);

                if (r.isPreHoneycomb()) {
                    r.state = oldState;
                }
            }
        } else {
            // If there was an error, for any reason, tell the activity manager to stop us.
            try {
                ActivityManager.getService()
                    .finishActivity(r.token, Activity.RESULT_CANCELED, null,
                            Activity.DONT_FINISH_TASK_WITH_ACTIVITY);
            } catch (RemoteException ex) {
                throw ex.rethrowFromSystemServer();
            }
        }
    }

上面的代码是 Activity 主要的初始化流程
我们先看 performLaunchActivity()、然后在看 handleResumeActivity()

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {

        ActivityInfo aInfo = r.activityInfo;
        if (r.packageInfo == null) {
            r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,
                    Context.CONTEXT_INCLUDE_CODE);
        }

        // 创建ContextImpl
        ContextImpl appContext = createBaseContextForActivity(r);
        Activity activity = null;
        try {
            java.lang.ClassLoader cl = appContext.getClassLoader();
            //通过反射实例化 Activity
            activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
            StrictMode.incrementExpectedActivityCount(activity.getClass());
            r.intent.setExtrasClassLoader(cl);
            r.intent.prepareToEnterProcess();
            if (r.state != null) {
                r.state.setClassLoader(cl);
            }
        } catch (Exception e) {
            if (!mInstrumentation.onException(activity, e)) {
                throw new RuntimeException(
                    "Unable to instantiate activity " + component
                    + ": " + e.toString(), e);
            }
        }

        try {
            //判断 Application 有没有创建如果没有就创建,里面代码可以自己简单看一下
            Application app = r.packageInfo.makeApplication(false, mInstrumentation);

            if (activity != null) {
                CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
                Configuration config = new Configuration(mCompatConfiguration);
                if (r.overrideConfig != null) {
                    config.updateFrom(r.overrideConfig);
                }
                if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "
                        + r.activityInfo.name + " with config " + config);
                Window window = null;
                if (r.mPendingRemoveWindow != null && r.mPreserveWindow) {
                    window = r.mPendingRemoveWindow;
                    r.mPendingRemoveWindow = null;
                    r.mPendingRemoveWindowManager = null;
                }
                appContext.setOuterContext(activity);
                //Activity attach 里面代码可以自己看一看,各种属性设置 PhoneWindow 的声明,各种事件的监听都在里面
                activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor, window, r.configCallback);

                if (customIntent != null) {
                    activity.mIntent = customIntent;
                }
                r.lastNonConfigurationInstances = null;
                checkAndBlockForNetworkAccess();
                activity.mStartedActivity = false;
                int theme = r.activityInfo.getThemeResource();
                if (theme != 0) {
                    activity.setTheme(theme);
                }

                activity.mCalled = false;
                //创建 Activity
                if (r.isPersistable()) {
                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                } else {
                    mInstrumentation.callActivityOnCreate(activity, r.state);
                }
                if (!activity.mCalled) {
                    throw new SuperNotCalledException(
                        "Activity " + r.intent.getComponent().toShortString() +
                        " did not call through to super.onCreate()");
                }
                r.activity = activity;
                r.stopped = true;
                if (!r.activity.mFinished) {
                    //准备 Start Activity
                    activity.performStart();
                    r.stopped = false;
                }
                //调用 Activity 的 onRestoreInstanceState
                if (!r.activity.mFinished) {
                    if (r.isPersistable()) {
                        if (r.state != null || r.persistentState != null) {
                            mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,
                                    r.persistentState);
                        }
                    } else if (r.state != null) {
                        mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
                    }
                }
                //调用 onPostCreate
                if (!r.activity.mFinished) {
                    activity.mCalled = false;
                    if (r.isPersistable()) {
                        mInstrumentation.callActivityOnPostCreate(activity, r.state,
                                r.persistentState);
                    } else {
                        mInstrumentation.callActivityOnPostCreate(activity, r.state);
                    }
                    if (!activity.mCalled) {
                        throw new SuperNotCalledException(
                            "Activity " + r.intent.getComponent().toShortString() +
                            " did not call through to super.onPostCreate()");
                    }
                }
            }
            r.paused = true;
            mActivities.put(r.token, r);
        } catch (SuperNotCalledException e) {
            throw e;
        } catch (Exception e) {
        }

        return activity;
    }

上述代码中有注释的相关代码,都可以跟进去查看一番,难度不是很大

我们再看一下 handleResumeActivity() 方法

final void handleResumeActivity(IBinder token,
            boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) {
        ActivityClientRecord r = mActivities.get(token);
        if (!checkAndUpdateLifecycleSeq(seq, r, "resumeActivity")) {
            return;
        }

        unscheduleGcIdler();
        mSomeActivitiesChanged = true;

        // 里面调用了 Activity 的 onResume()
        r = performResumeActivity(token, clearHide, reason);
    }

从上面得知大部分 Activity 生命周期的方法都是 Instrumentation 来实现的
这一篇章我没有把代码贴太全,粘太全的代码太乱了,我用中文注释的地方希望都点进去看看。

最后再放一张完整的图


img_ed8a68668aa7e835186ba4da63e0419c.png
Activity 启动流程.jpg
img_e89fe89627c41ab8492884c09cb90b5d.jpe
欢迎关注我的公众号
目录
相关文章
|
设计模式 Android开发
44. 【Android教程】广播接收器:Broadcast Receiver
44. 【Android教程】广播接收器:Broadcast Receiver
560 2
|
数据采集 人工智能 运维
智能运维:AI在IT基础设施管理中的应用与挑战
随着人工智能技术的飞速发展,其在IT基础设施管理领域的应用日益广泛。本文将探讨AI技术在智能运维中的作用,分析其带来的优势与面临的挑战,并展望未来的发展趋势。
|
机器学习/深度学习 传感器 算法
构建未来:基于机器学习的智能健康监测系统
【5月更文挑战第12天】 在数字医疗领域,智能健康监测系统的出现正在革新我们对健康管理和疾病预防的理解。本文将探讨一个基于机器学习技术的智能健康监测系统的设计与实现,它能够实时跟踪个体的健康指标并通过预测性分析提前警示潜在的健康问题。通过融合生物统计学、数据挖掘及模式识别等先进技术,该系统旨在为个人用户提供量身定制的健康建议,并为医疗专业人员提供决策支持。文章首先概述了系统框架和关键技术,随后详细讨论了机器学习模型的建立过程以及如何优化这些模型以提高预测的准确性。最后,我们通过实验结果验证了系统的有效性,并讨论了未来的发展方向。
|
缓存 网络协议 Linux
性能工具之网络 Benchmark iperf3 快速入门
Benchmark 评估服务器之前的网络带宽简单方法,大家做性能测试是否也是这样评估网络带宽?
681 2
性能工具之网络 Benchmark iperf3 快速入门
|
开发工具 iOS开发
升级Xcode 10后遇到的问题
升级Xcode 10后遇到的问题
422 0
|
Unix Linux 开发工具
Linux 常用命令汇总(三):查看文件 & 内容处理
Linux 常用命令汇总(三):查看文件 & 内容处理
|
存储 缓存 并行计算
【软件设计师备考 专题 】CPU和存储器的组成、性能和基本工作原理
【软件设计师备考 专题 】CPU和存储器的组成、性能和基本工作原理
421 0
|
安全 关系型数据库 MySQL
黑吃黑Getshell到提权实战案例
黑吃黑Getshell到提权实战案例
544 0
|
运维 安全 持续交付
亿氪虹云携手蝶宇云为金蝶云·星空用户带来「IaaS+运维+安全」的三位一体的整体解决方案
为了给用户带来更佳的运维服务,蝶宇云不断进行服务优化,在确定了要从传统的运维服务商向云的应用服务商转型的方向后,与亿氪虹云展开了深度合作。由亿氪虹云在阿里云云市场上来提供金蝶云·星空的计算巢SaaS服务,服务基于阿里云计算巢功能,在交付上实现了自动化部署;在数据安全方面提供了操作录屏功能,可以随时回放审计,为用户数据安全保驾护航;另外用户还可以根据业务实际情况进行非常灵活地扩容,及扩展和伸缩。给金蝶云·星空企业用户带来「IaaS+运维+安全」的三位一体的整体解决方案。
380 0
|
运维 安全 持续交付
阿里云联合埃森哲正式发布《跨国企业上云登陆区(Landing Zone)白皮书》
阿里云联合伙伴埃森哲共同编写发布,面向跨国企业如何基于Landing Zone搭建先进的云上IT治理框架给出指导,结合了云厂商与三方咨询公司视角,包含理论和可落地的最佳实践。
阿里云联合埃森哲正式发布《跨国企业上云登陆区(Landing Zone)白皮书》