Android相关

android应用程序启动过程

2018-01-17  本文已影响31人  LeonXtp

activity启动过程的调用链那么长,很多源码分析文章都是一个方法一个类地写这个链,容易忘记,那么这个启动过程中主要做了哪些重要的事?这才是重点

Android M 6.0,关于ActivityThread和ApplicationThread的解析

问题:
1.ApplicationThread在用户进程和在AMS进程分别是以什么形式出现?
2.它是如何作为用户进程的服务端的?
3.Activity的context对象是在何时被赋值的?

老罗关于Activity启动过程的简要介绍:

image.png

在这个图中,ActivityManagerService和ActivityStack位于同一个进程中,而ApplicationThread和ActivityThread位于另一个进程中。其中,ActivityManagerService是负责管理Activity的生命周期的,ActivityManagerService还借助ActivityStack是来把所有的Activity按照后进先出的顺序放在一个堆栈中;对于每一个应用程序来说,都有一个ActivityThread来表示应用程序的主进程,而每一个ActivityThread都包含有一个ApplicationThread实例,它是一个Binder对象,负责和其它进程进行通信

简要介绍一下启动的过程:

这样,系统就完成了Activity的启动。


根Activity的启动过程
当点击手机桌面App图标时,应用程序的启动流程开启

从Launcher进程进入到AMS所在进程:

image.png image.png
创建App进程

上图中,到ActivityStack调用ActivityStackSupervisor. startSpecificActivityLocked()方法时,系统已为我们点击的应用创建了一个进程。

image.png

图片来自刘望舒的CSDN博客

activity的Context赋值:

frameworks/base/core/java/android/app/ActivityThread.java

 private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
  ...
            if (activity != null) {
                Context appContext = createBaseContextForActivity(r, activity);//1
         ...
                }
                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);
                ...
        }
        return activity;
}

而这整个过程中所涉及到的进程通信:


image

图片来自大神gityuan

上一篇 下一篇

猜你喜欢

热点阅读