Framework框架,同样包含三个部分:服务端、客户端和Linux驱动。
服务端包含两个重要的类
ActivityManagerService.java 管理应用程序中的Activity
WindowManagerService.java 管理窗口
客户端中重要的类
ActivityThread类,所在线程即为UI线程
DecorView类是FrameLayout的子类,并且是PhoneWindow的内部类,可添加ActionBar,响应特定的按键消息。
Window类提供了一组通用的窗口操作API
PhoneWindow类继承于Window类,内部包含一个DecorView对象
ViewRoot类继承于Handler,其作用是把WMS的IPC调用转换为本地的一个异步调用,每创建一个窗口,都会相应的生成一个ViewRoot对象,用以和WmS进行交互
W类也是继承于Binder,并且是ViewRoot的一个内部类,WmS通知客户端窗口,是通过调用W类把消息发送个ViewRoot,以便进行异步处理
View类是WMS认为的窗口,本身不能接收WmS传递过来的消息,真正接收用户消息是ViewRoot.W类,每个W类都包含了一个View变量
WindowManager类是客户端和WmS交互的中介
APK运行过程
ActivityThread从main()函数开始, 调用prepareMainLooper()为UI线程创建一个消息队列,然后创建一个ActivityThread对象,负责接收AmS的IPC调用。
public static final void main(String[] args) {
SamplingProfilerIntegration.start();
Process.setArgV0("<pre-initialized>");
Looper.prepareMainLooper();
if (sMainThreadHandler == null) {
sMainThreadHandler = new Handler();
}
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
Looper.loop();
if (Process.supportsProcesses()) {
throw new RuntimeException("Main thread loop unexpectedly exited");
}
thread.detach();
String name = (thread.mInitialApplication != null)
? thread.mInitialApplication.getPackageName()
: "<unknown>";
Slog.i(TAG, "Main thread of " + name + " is now exiting");
}
当ActivityThread接收到启动某个Activity的IPC命令后,则会创建一个activity对象,接着Activity创建PhoneWindow类->DecorView类->View类,最后显示到屏幕上。
W类负责接收WmS的IPC调用,再把消息传递给ViewRoot,ViewRoot再把消息传递给ActivityThread,ActivityThread做解析后,转给DecorView处理,如果DecorView不处理,再转给其内部的View处理,如果还没处理,则传给PhoneWindow,最后再传递给Activity。
ViewRoot类和W类是何时创建的,待更新。