APP启动流程
- 用户点击Launch桌面APP应用图标,
- 转到 Instrumentation 类的 startActivity 方法,Instrumentation通过跨进程通信告诉 AMS 要启动应用的需求。
- AMS反馈 Launcher,让 Launcher 进入 Paused 状态,Launcher进入 Paused 状态,AMS 转到 ZygoteProcess 类,并通过 socket 与 Zygote 通信,告知 Zygote 需要新建进程。此时调用SystemServer进程的ActivityManagerService.startActivity();
- 通知ActivityManagerService通知Zygote进程fork孵化出应用进程,然后分配内存空间;
- 在这个dilvik应用程序里执行ActivityThread的main()方法,这个方法会返回Context;
- 应用程序通知AMS已启动,AMS会保存该应用进程的一个代理对象(ApplicationThreadProxy),并通过代理对象控制应用进程,AMS通过这个代理对象可以控制应用;
- AMS通知应用进程创建入口Activity实例并执行生命周期。
ActivityThread.main()方法中主要做了哪些事
- 反射创建Application;
- 调用Application.attachBaseContext(),MultiDex的初始化就是在这个回调里完成的(MultiDex.install(),主要是把dex添加到应用的类加载器PathClassLoader中的DexPathList的Emlement数组中);
- 调用Application.onCreate()反射创建Activity;
- 调用Activity.onCreate();
- 调用Activity.onResume();
- 调用Activity.onAttachToWindow();
- 调用Activity.onWindowFocusChanged();