Android 启动过程:Activity 启动源码分析 (ActivityThread -> Activity、主线程阶段)

时光隧道喵 2024-08-27 ⋅ 7 阅读

在Android开发中,Activity是应用程序的一个重要组成部分。了解Android启动过程以及Activity的启动源码对于理解Android应用程序的启动流程是非常重要的。在本文中,我们将深入了解Android中Activity的启动过程,并从源码级别进行分析。

1. Android启动过程概述

当我们启动一个Android应用程序时,系统会自动创建一个新的进程,并在该进程中启动一个名为"ActivityThread"的线程。ActivityThread负责协调整个应用程序的启动过程,并负责管理所有的Activity实例。

Android的启动过程可以分为主线程阶段和Activity启动阶段。在主线程阶段中,ActivityThread会执行一系列的初始化操作,然后创建一个Application实例。接下来,ActivityThread会将应用程序的主Activity添加到Activity栈中,并将其启动起来。

2. Activity启动源码分析

2.1 主线程阶段

在主线程阶段中,ActivityThread主要负责执行一些初始化操作,并启动应用程序的主Activity。下面是主线程阶段的关键源码分析:

public class ActivityThread extends ClientTransactionHandler {
    public static void main(String[] args) {
        ActivityThread thread = new ActivityThread();
        thread.attach(false);

        if (sMainThreadHandler == null) {
            sMainThreadHandler = thread.getHandler();
        }

        // 执行初始化操作
        Looper.loop();
    }

    private void attach(boolean system) {
        if (!system) {
            Looper.prepareMainLooper();

            // 创建Application实例
            mInitialApplication = AppGlobals.getInitialApplication();
            ...
        }
    }
}

从上述源码中可以看到,在主线程阶段,ActivityThread首先会执行一些初始化操作。然后,通过调用Looper.loop()来开启主线程的消息循环。

2.2 Activity启动阶段

在Activity启动阶段,ActivityThread会创建并启动应用程序的主Activity。下面是Activity启动阶段的关键源码分析:

public class ActivityThread extends ClientTransactionHandler {
    public static void main(String[] args) {
        ...
        // 创建并启动应用程序的主Activity
        activity.performLaunchActivity();
    }

    private void performLaunchActivity() {
        ActivityClientRecord r = new ActivityClientRecord();
        ...
        // 创建Activity对象
        Activity a = performCreateActivity(r);

        // 加入Activity栈,并将其置为前台
        r.setActivity(a);
        mActivities.put(r.token, r);
        ...

        try {
            // 调用Activity的生命周期方法
            a.onCreate(r.state);
        } catch (Exception e) {
            ...
        }
    }

    private Activity performCreateActivity(ActivityClientRecord r) {
        ...
        ClassLoader cl = r.packageInfo.getClassLoader();

        // 创建Activity实例
        Activity activity = null;
        try {
            activity = Instrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
            ...
        } catch (Exception e) {
            ...
        }

        // 设置Activity的Application和Context
        activity.setApplication(r.packageInfo.getApplication());
        activity.setBaseContext(r.packageInfo.getApplication().getBaseContext());

        return activity;
    }
}

从上述源码中可以看到,在Activity启动阶段,ActivityThread首先会调用performLaunchActivity()方法创建并启动应用程序的主Activity。然后,通过调用performCreateActivity()方法来创建Activity对象。接下来,ActivityThread会将Activity加入Activity栈,并将其置为前台。最后,ActivityThread会依次调用Activity的生命周期方法(如onCreate())。

总结

本文从源码级别分析了Android的启动过程以及Activity的启动过程。了解Android的启动过程对于开发者来说非常重要,可以帮助我们更深入地理解Android应用程序的运行机制。希望本文能给正在学习Android开发的同学们带来一些帮助。


全部评论: 0

    我有话说: