activity启动流程

启动Activity这一工作不管是相同应用的2个不同Activity的启动,或者是不同进程不同应用的Activity启动,都是由Activity大管家ActivityManagerService(简称AMS)全权管理,而他们之间的通讯就要用到Binder,通过Binder与AMS多次通讯,才能启动淘宝App。

ActivityThread,就是主线程,也就是UI线程,它是在App启动时创建的,它代表了App应用程序。
啥?ActivityThread代表了App应用程序,那Application类岂不是被架空了?其实,Application对我们App开发人员来说也许很重要,但是在Android系统中还真的没那么重要,他就是个上下文。Activity不是有个Context上下文吗?Application就是整个ActivityThread的上下文。

整体流程:
1、Launcher通知AMS启动淘宝APP的MainActivity,也就是清单文件设置启动的Activity。
2、AMS记录要启动的Activity信息,并且通知Launcher进入pause状态。
3、Launcher进入pause状态后,通知AMS已经paused了,可以启动淘宝了。
4、淘宝app未开启过,所以AMS启动新的进程,并且在新进程中创建ActivityThread对象,执行其中的main函数方法。

main方法是个静态方法,这里面会创建主线程的looper,并调用Looper.loop()方法转起来。并实例化一个ActivityThread对象,调用其attach方法,该方法里面会通过attachApplication方法吧ApplicationThread对象传递给AMS

例如从Launcher冷启动淘宝,则需要创建新进程,通过AMS调用Zygote(孕育天地)孵化应用进程。
如果淘宝App已经启动,例如从MainActivity跳转到LoginActivity,则通过realStartActivityLocked启动。

5、淘宝app主线程启动完毕后通知AMS,并传入applicationThread以便通讯。

因为主线程main入口通过attach方法将 ApplicationThread 发送给 AMS ,所以通过applicationThread这个桥梁来通知ActivityThread创建/关联和启动Activity

6、AMS通知淘宝绑定Application并启动MainActivity。

ActivityThread通过ApplicationThread与AMS进行通讯,所以上面的thread.bindApplication(...)方法,就应该是通过ApplicationThread进行传达。
在ActivityThread的内部类ApplicationThread中,我们找到bindApplication方法,会跳转到handleBindApplication
其中的工作包括:
按照Android的要求,完成对进程基本参数的设置置,包括设置进程名、时区、资源及兼容性配置;
同时也添加了一些限制,例如主线程不能访问网络等。
创建进程对应的ContextImpl、LoadedApk、Application等对象,同时加载Application中的ContentProvider,并初始化Application。
使用Instrumentation监控Activity的生命周期。(一个进程对应一个Instrumentation实例)
其中LoadedApk创建Application,并且创建完毕后,通过Instrumentation的callApplicationOnCreate来调用Application的onCreate方法

7、淘宝启动MainActivitiy,并且创建和关联Context,最后调用onCreate方法。

启动Activity真正的实现是由ActivityManagerNative.getDefault()的startActivity方法开始.
Activity是由AMN.getDefault()来启动的,而AMN.getDefault()实际上是AMS,因此Activity的启动过程又转移到了AMS中,为了继续分析这个过程,需要从头查看AMS的startActivity方法。
在上述代码AMS的attachApplicationLocked方法中,里面会调用realStartActivityLocked方法,进而app.thread.scheduleLaunchActivity。
总的来说,AMS最后通过ApplicationThread通知ActivityThread启动Activity,这个就是架构惹。
最终架构为:ApplicationThread—> H—> ActivityThread—> 最终启动Activity的方法。
比如在ApplicationThread中,sendMessage(H.LAUNCH_ACTIVITY, r); 通过class H(我日这起名),handleLaunchActivity,最后处理是在ActivityThread的performLaunchActivity中进行。

performLaunchActivity方法中主要进行了如下action:
从ActivityClientRecord中获取启动的Activity组件信息;
通过Instrumentation的newActivity方法创建Activity;
通过LoadedApk的makeApplication方法创建Application对象(如果之前Application对象已经被创建过了,就不会再创建)
创建ContextImpl对象,并通过Activity的attach方法来完成一些重要数据的初始化。
ContextImpl是一个很重要的数据结构,它是Context的具体实现,Context中的大部分逻辑都是由ContextImpl来完成的。ContextImpl来完成的。ContextImpl是通过Activity的attach方法来和Activity建立关联的,除此之外,在attach方法中Activity还会完成Window的创建并建立自己和Window的关联,这样当Window接收到外部输入事件后就可以将事件传递给Activity。

接下来就是调用activity的onCreate等生命周期函数,都是通过AMS传消息给ApplicationThread 然后在activityThread中进行处理。

启动activity流程
整体流程

感谢作者:
Android Launcher 启动 Activity 的工作过程

你可能感兴趣的:(activity启动流程)