看看AMS、WMS和应用程序的关系,如图所示
1.Session是WMS的一个Binder类,在ViewRootImpl的构造方法中会得到这个类型的对象mWindowSession,而W类则是ViewRootImpl的Binder类,ViewRootImpl会把这个类型的mWindow对象通过WMS的addToDisplay()方法传到WMS中。这样,WMS就能够通过mWindow对象调用ViewRootImpl中的方法,ViewRootImpl通过mWindowSession对象调用WMS中的方法。
2.WMS和AMS通过得到对应的Binder对象来调用,因为WMS和AMS本身就是Binder对象,WMS通过得到AMS对象来调用AMS中的方法,而AMS通过得到WMS对象来调用WMS中的方法。
3.在应用程序端,如前所述,ActivityThread类中直接通过AMS对象来调用AMS中的方法,而ActivityThread中的ApplicationThread类是一个Binder类型的类,在应用程序启动之后,会把这个类型的对象传到AMS中,所以AMS通过该对象来完成调用ActivityThread中的方法。
至此,ViewRootImpl对象的创建过程和添加根视图DecorView对象的过程分析完毕。ViewRootImpl在WindowManagerGlobal的addView()方法中被创建,当它创建好之后,调用setView()方法就把根视图DecorView对象和描述窗口属性的WindowManager.LayoutParams对象传递到它里面。
通过前面一系列对象的创建后,Activity中View的大小和位置怎么来确定呢?这就是后面要讲的View的measure、layout和draw过程。measure过程用于确定View的大小;layout过程用于确定View的位置;draw过程用于绘制View并显示到界面上。