一.框架
1.服务端:
WindowManagerService(wms)和ActivityManagerService(ams);
2.客户端:
ActivityThread:每个App都会有且仅有一个主线程(UI线程)
Activity:最小单位
PhoneWindow:继承与Window,内部包含DecorView(继承FrameLayout),提供窗口操作API
Window:抽象类
DecorView:FrameLayout子类,响应操作
ViewRoot:继承与Handler,wms管理窗口,需要通知客户端进行操作,客户端接收到IPC调用后,会通过ViewRoot把这个调用转换为本地的一个异步调用,内部有W类
W:继承Binder类,wms通过IPC通知客户端,ViewRoot通过W类与wms进行沟通,然后W类给ViewRoot发送一个Handler消息,进行异步处理
WindowManager:客户端和wms的沟通桥梁
3.驱动:
SurfaceFlingger:图像的显示
Binder:跨进程消息传递
二.APK程序运行过程
1.ActivityThread从main()函数执行,调用prepareMainLooper()为UI线程创建一个消息队列(MessageQueue),然后创建一个ActivityThread对象,顺带会创建一个Handler和Binder(ApplicationThread)对象,Binder用于接收远程ams的IPC调用,和ViewRoot中的W类 一样
2.ActivityThread调用Looper.loop()方法,然后ActivityThread接收到ams的指令以后,创建Activity对象,创建PhoneWindow,创建DecorView,创建Activity中相应的View或ViewGroup,在后台创建好了以后,展示在前台就需要wms了,调用WindowManager,创建ViewRoot,以及ViewRoot中的Handler和W,一系列操作以后吧Activity投放到屏幕上了
三.客户端中的线程
会有三种线程,ActivityThread,ApplicationThread,W,第一个是UI线程(主线程),后面两个是Binder,Binder的产生也会同时启动一个新的线程,ActivityThread在创建的时候使用了prepareLooper()方法,所以可以直接创建Handler,因为创建Handler的一个要素就是有么有MessageQueue,prepareLooper()方法就创建了MessageQueue了,所以可以直接通过Handler给ActivityThread发送消息,但是自定义Thread就不行了,因为没有prepareLooper()方法
网友评论