-
桌面Launcher进程为应用生成桌面图标入口,通过Binder与AMS通信,开启应用进程时:
- 分别调用Launcher、Activity、Instrumentation(管理系统与应用交互,每个进程存在一个instrumentation对象,用于创建application、activity、service及其生命周期管理)、ActivityManagerNative、activityManagerProxy(AMS的本地代理)的相关startActivity函数
- AMS进行完与Launcher的交互后,通过zygote创建新进程启动ActivityThread实例
- 调用activityThread程序入口main函数
-
activityThread中程序入口psvm(app真正入口)工作:
-
looper初始化
-
activityThread初始化
-
applicationThread初始化
应用提供的与AMS等服务通讯等Binder接口
-
H类(Handler)初始化
-
创建application中所有activity、service、application的map集合mActivities
-
-
applicationThread与ams相关联 activityThread.attach
-
创建applicationThread,并传递给AMS,使AMS可以通过其远程代理ApplicationThreadProxy调用applicationThread方法,即:
activityThread activityManagerProxy---> AMS applicationThread <---applicationThreadProxy
-
-
looper.loop()开始循环
-
-
创建application时:
- AMS通过applicationThreadProxy传递信息给applicationThread--->sendMessage将信息传递给H类handler--->
- H类(继承Handler)handler对事件进行处理--->
- mInstrumentation初始化(同一进程名内只有一个instrumentation对象)
- 创建application,若已存在则直接返回application对象,没有则:
- 创建application ContextImpl对象,得到application.context
- mInstrumentation通过ClassLoader反射创建application实例,并与application.context绑定
- mInstrumentation调用application对象onCreate方法
-
创建activity时:
- AMS通过applicationThreadProxy调用ApplicationThread.scheduleLaunchActivity--->sendMessage给H类Handler
--->- H.handleLaunchActivity--->
- activityThread.performLaunchActivity
- mInstrumentation创建ContextImpl对象,得到activity.context
- mInstrumentation通过ClassLoader反射创建activity实例,与context绑定
- mInstrumentation调用activity.onCreate方法
--->
* activityThread.performResumeActivity
- AMS通过applicationThreadProxy调用ApplicationThread.scheduleLaunchActivity--->sendMessage给H类Handler
-
activity onResume()后由AMS通过调用绘制View
-
ApplicationThread.scheduleResumeActivity()--->sendMessage给H类handler--->
-
H类(继承Handler)handler对resume事件进行处理--->
-
H.handleResumeActivity()
--->
- performResumeActivity()
- Activity.onResume()
- mInstrumentation.callActivityOnResume()
--->
- WindowManager.addView
-
参考:
网友评论