Activity Window View的关系

http://blog.csdn.net/chiuan/article/details/7062215

 

http://blog.163.com/fenglang_2006/blog/static/133662318201022104256580/

 

 

Activity Window View的关系

问题:

Activity是Android得显示视图么?

题目中它们之间的关系?

LayoutInlater()是做什么的?

layoutInflater.inflater()是做什么的?

 

1、PhoneWindow才是View真正的实例化方法

2、一个Activity构造时候会构造一个只有一个Phonewindow(窗)

3、这个窗口有一个ViewRoot(view, viewgroup),窗口可以贴很多装饰,用layout\layoutInflater

其实可以这么理解ViewRoot就像C盘,每个Activity创建的只有一个viewRoot哦!,然后下面的结构就是view啦

4、然后这个viewroot根会addView(viewgroup),可以直接setContentView()时候传入一个R.layout.ID,也可以用layoutInflater动态地生成这个view装饰体。

5、windowManagerService接受的消息,并且回调Activity函数

 

 


 

 

 

对于屏幕显示而言,整个是window,这个window里显示的东西是view(activity是逻辑上的东西,增加了生命周期管理等. 里面具体的东西也是view。而且启动activity的实现也是往window里加view),往window里加view,是通过调用WindowManager(WindowManagerImpl).addView()来实现的。

在addView里,会为每个view创建一个viewRoot(这是逻辑上的东西,用来负责view的事件处理和逻辑处理,并和WindowsManagerService建立联系),而在WindowManagerImpl里,会维护viewRoot的数组。

最终会调用ViewRoot.setView(),在setView里会显示该view等。在setView的实现里,会调用Session.add()来addWindow,通过这个方法,会将ViewRoot和WindowManagerService联系起来(比如说分发事件等),并且这个方法里会调用PhoneWindowManager.prepareAddWindowLw()。

调用过程如下:

ViewRoot.setView()->WindowManagerService.relayout()->WindowManagerService.relayoutWindow()->WindowManagerService.performLayoutAndPlaceSurfacesLocked()->WindowManagerService.performLayoutAndPlaceSurfacesLockedInner()->WindowManagerService.performLayoutLockedInner()->PhoneWindowManager.beginLayoutLw()

然后ViewRoot.setView()->WindowManagerService.finishDrawing()陆续又会调用到一些PhoneWindowManager里的layout方法。

对于WindowManager而言,只要调用了AddView,上述的流程都会走一遍。

对于一个Window而言,目前大概可以分为几个部分:statusbarview(0,0,320,25),应用的activity(0, 25,320,480)

 

http://blog.163.com/fenglang_2006/blog/static/133662318201022104256580/

posted @ 2014-04-21 17:47  daishuguang  阅读(719)  评论(0编辑  收藏  举报