【Android】 01. APP 进程启动和 ActivityThread 的关系

984 阅读2分钟

要用 Java 创建 main 函数的思维去理解一个 Android app 被创建和启动的过程;Android 是 Linux 系统,我们就当在 Linux 系统中写了一个 Java 程序; 然后这个 Java 程序的进程就启动了,然后就创建了第一个线程,接着在这些线程中创建了自己需要的类;

首先我们应该知道2个概念;

  1. 我们应该知道在Android中一个app就是一个进程;
  2. 我们在普通的Java程序中一个程序的入口是main方法,其实就是启动一个Java进程,然后这个Java进程就会启动一个主线程。
  3. Android 系统间有很多进程, AMS, PMS 等都是在系统进程里面,app 都要和这些进程进行通信;

同理在 Android 中也是启动一个进程,然后执行 main 方法,这个启动类就是 ActivityThread.java; 所以首先执行的应该是 ActivityThread 的 main 方法;

public static void main(String[] args) {
        SamplingProfilerIntegration.start();
        ........
        // 初始化一个 Loop
        Looper.prepareMainLooper();

        // 创建 当前进程中最主要的对象
        ActivityThread thread = new ActivityThread();

        // 初始化 application, Instrumentation
        thread.attach(false);
        ......
        if (sMainThreadHandler == null) {
            sMainThreadHandler = thread.getHandler();
        }
        // 主线程 循环; 应用第一个线程就不会停止了
        Looper.loop();
}

应用的进程启动的时候,首先调用的是 ActivityThread 的 main 方法, 在 main 方法中初始化一个 ActivityThread; 然后执行 ActivityThread 实例的 attach 方法, attach 中把 ApplicationThread 和 IActivityManager 关联起来(可以进行通信了), 并且和 ViewRootImpl 做了一些关联(以后再研究);

ActivityThread 有个内部 ApplicationThread 类;这个主要用于和 Android 系统的 AMS 进行系统进程通信;

Activity 被 ActivityThread 启动的过程

查看方法名
android.app.ActivityThread#performLaunchActivity

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
        // System.out.println("##### [" + System.currentTimeMillis() + "] ActivityThread.performLaunchActivity(" + r + ")");

        // 创建 activity
        activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);

        try {
            // 获得 Application
            Application app = r.packageInfo.makeApplication(false, mInstrumentation);

                // 创建 context
                Context appContext = createBaseContextForActivity(r, activity);
                CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
                Configuration config = new Configuration(mCompatConfiguration);
                if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "
                        + r.activityInfo.name + " with config " + config);
                // activity 中把 context 放进去,把 appliaction也放进去, 且在 attach 的时候,把activity 的windown 创建好了
                activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config);
                // 把一些样式放进去

                activity.mCalled = false;
                // 调用 activity 的 onCreate方法
                mInstrumentation.callActivityOnCreate(activity, r.state);


            mActivities.put(r.token, r);

        //....................
        return activity;
    }

从上面的代码中可以看出来,activity 的创建和 context, application 的赋值过程都是在 ActivityThread 中进行的。
且流程是

new Activity --> 设置 application ---> 设置 ContextImpl --> attach() --> attachBaseContext() --> onCreate()

为什么我要把这个过程列出来,主要是为了了解 applicationContext 和 Activity 的 context 的创建过程;

以上所有的都是正常使用 Java 创建类的思路去理解,对应 activity 的一些生命周期的管理也是从这个类开始的;