花了一个星期研究GUI架构,这里把研究报告的PPT文档整理了一下,我的PPT文档向来只是个提纲,以后有时间再慢慢补上具体内容。
源码位置:frameworks/base/services/java/com/android/server/WindowManagerService.java
功能:1. (Ask SurfaceManager to) create/layout surfaces on behalf of the clients (SurfaceSession),(SurfaceManager是图形系统的底层服务,我图形系统架构的报告,下次发出来,不过也是提纲性质的)
2. Dispatch input events to clients(想了解消息分发流程,就可以从这里入手)
3. Transition animation (窗口切换动画)
实现层次:WindowManagerPolicy(负责所有跟窗口外观和行为相关的事情,目前只有PhoneWindow一个实现)
外部接口:IWindowManager(窗口管理接口)
IWindowSession
IWindow(回调函数,用于窗口管理和消息分发)
ViewGroup是View的子类,各种layout的父类。
View通过ViewParent接口访问父节点。
ViewRoot实现ViewParent接口,成为一个空的树根。
WindowManagerImpl维护一个View、ViewRoot和WindowManager.LayoutParams组成的三元组,它的addView方法生成ViewRoot对象,ViewRoot实现了IWindow接口,并从windowManagerService服务打开一个Session,通过IWindowSession接口获取windowManagerService的服务。
ViewRoot的setView函数调用IWindowSession的add函数建立View和底层窗口之间的联系,消息循环中的performTraversals函数在窗口变化时调用relayoutWindow函数,此函数通过IWindowSession的relayout方法获得新的Surface用来显示。
应用程序通过ActivityThread的main函数启动消息循环,在LAUNCH_ACTIVITY消息处理中调用performLaunchActivity,此方法中创建Activity对象并调用其attach方法,attach方法中通过PolicyManager创建Window对象,Activity实现了Window.Callback接口,在此建立联系,并设置WindowManager对象。
attach返回后依次是设置theme、onCreate、onStart、onRestoreInstanceState、onPostCreate。
Activity的setContentView调用转交给Window对象,目前只有PhoneWindow,它在第一次调用时通过installDecor方法生成包含标题栏等窗口附件在内的View树,并将参数指定的View附加到内容节点。
performLaunchActivity返回后开始handleResumeActivity,如果窗口可见,它将建立Window对象和底层窗口之间的联系,否则将在设置活动可见时建立。
底层Window指系统服务中提供的窗口管理功能对应的窗口,它在WindowManagerService.java中实现,通过IWindowManager接口使用。
上层Window指窗口策略中的Window对象,它负责顶层View的外观和行为控制。如标题栏、回退键等。
Window.LocalWindowManager实现了WindowManager接口,它调用WindowManagerImpl来建立上层Window和下层Window之间的联系。
An activity is a single, focused thing that the user can do.
A task is a stack of activities.
回退键在同一个任务内部导航,它并不代表取消。
再谈生命周期。活动间的协作。
The current activity's onPause() method is called.
Next, the starting activity's onCreate(), onStart(), and onResume() methods are called in sequence.
Then, if the starting activity is no longer visible on screen, its onStop() method is called.
OnPause