Launcher进程请求AMS
点击图标是发生在Launcher
应用进程,实际上执行的Launcher
的onClick
方法,在onClick
里面会执行到Activity
的startActivity
方法。startActivity
会调用mInstrumentation.execStartActivity(),
execStartActivity
通过ActivityManager
的getService
方法来得到AMS
的代理对象。
Launcher
进程作为客户端与服务端AMS
不在同一个进程,ActivityManager.getService
返回的是IActivityManager.Stub
代理对象,此时如果要实现客户端与服务端进程间的通信, 需要AMS
继承IActivityManager.Stub
类并实现相应的方法,这样Launcher进程作为客户端就拥有了服务端AMS的代理对象,然后就可以调用AMS的方法来实现具体功能了。
AMS发送创建应用进程请求,Zygote进程接受请求并fork应用进程
①AMS
通过socket
通信告知Zygote
进程fork
子进程。
②应用进程启动ActivityThread,
执行ActivityThread
的main
方法。
③main
方法创建ApplicationThread
,Looper
,Handler
对象,并开启主线程消息循环Looper.loop()
。
App进程通过Binder向AMS(sytem_server)发起attachApplication请求,AMS绑定ApplicationThread
在ActivityThread
的main
中,通过ApplicationThread.attach(false, startSeq),
将AMS
绑定ApplicationThread
对象,这样AMS
就可以通过这个代理对象来控制应用进程。
AMS发送启动Activity的请求
system_server
进程在收到请求后,进行一系列准备工作后,再通过binder
向App进程发送scheduleLaunchActivity
请求,AMS
将启动Activity
的请求发送给ActivityThread
的Handler
。
ActivityThread的Handler处理启动Activity的请求
App
进程的binder
线程(ApplicationThread
)在收到请求后,通过handler
向主线程发送LAUNCH_ACTIVITY
消息,主线程在收到Message
后,通过反射机制创建目标Activity
,并回调Activity.onCreate()
等方法。 到此,App
便正式启动,开始进入Activity
生命周期,执行完onCreate/onStart/onResume
方法,UI
渲染结束后便可以看到App
的主界面。