• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統(tǒng)計

            最新評論

            PhoneWindow,ViewRoot,Activity之間的大致關系

            android里,我們都知道activity.但是一個activity跟一個Window是一個什么關系呢?

            activity.java中,我們可以看到兩個變量,分別是:

            private Window mWindow;

            private WindowManager mWindowManager;

            這這個變量是在哪里賦值的呢?可以看到attach函數(shù),

            mWindow = PolicyManager.makeNewWindow(this);

            跟進去看一下,可以發(fā)現(xiàn)返回的時候一個PhoneWindow對象,PhoneWindowWindow類的派生類。

            mWindow.setWindowManager(null, mToken, mComponent.flattenToString());

            if (mParent != null) {

            mWindow.setContainer(mParent.getWindow());

            }

            mWindowManager = mWindow.getWindowManager();

            仔細跟蹤下這段代碼中我們可以得到WindowManager對象,并且這個對象是在系統(tǒng)唯一的,這個對象同樣被賦值給PhoneWindow的成員變量。

            我們在新建一個activity的時候,往往喜歡用如下的代碼來定義該activityUI界面,那么這個具體的實現(xiàn)是怎么來實現(xiàn)的呢?

            public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.main);

            我們跟蹤setContentView就知道了。可以發(fā)現(xiàn)activity其實把這個操作交給了自己的mWindow來完成,通過跟蹤PhoneWindow中的setContentView函數(shù)可以得出以下知識:

            1,每一個PhoneWiondow中都有一個叫DecorView的對象,該對象是該PhoneWiondow的框架view,可以找到這么一段代碼:

            View in = mLayoutInflater.inflate(layoutResource, null);

            decor.addView(in, new ViewGroup.LayoutParams(FILL_PARENT, FILL_PARENT));

            layoutResource則是資源ID,通過往上翻代碼就可以找得到。

            2,一個PhoneWiondow中都有一個叫FrameLayout的對象mContentParent,該對象是從上述layoutResource中的布局xml中獲得的,這也將是activity中所有用戶新增加view都會被包含在這個對象當中。

            總體可以這樣大致說明:一個activity包含有一個PhoneWiondow對象,而所有的UI部件都是放在PhoneWiondow中。

            ViewRoot這個類在androidUI結(jié)構(gòu)中扮演的是一個中間者的角色,連接的是PhoneWindowWindowManagerService.

            WindowManagerService中我們知道它讀取android系統(tǒng)里所有事件,鍵盤事件,軌跡球事件等等,它怎么分發(fā)到各個activity的呢?就是通過這個ViewRoot

            在每個PhoneWindow創(chuàng)建的時候,系統(tǒng)都會向WindowManger中的一個保存View數(shù)組增加PhoneWindowDecorView對象,WindowManger在保存好這個View對象的同時,也會新創(chuàng)建一個ViewRoot對象用來溝通WindowManagerService

            可以查看WindowManagerImplViewRoot中的代碼,同時ViewRoot中我們可以看到一個W類型,該類型派生自IWindow.stub可以知道這個可以被用來作遠程調(diào)用。

            res = sWindowSession.add(mWindow, mWindowAttributes,

            getHostVisibility(), mAttachInfo.mContentInsets);

            IwindowSession則是WindowManagerService中的遠程調(diào)用接口,上述代碼也表明了每創(chuàng)建了一個PhoneWindow,也就創(chuàng)建了一個ViewRoot,并將在WindowManagerService注冊。

            接下來簡單的看下KeyEvent的傳遞。在WindowManagerService

            focus.mClient.dispatchKey(event);

            這個段代碼的mClient則就是ViewRoot中的W類型,通過遠程調(diào)用,可以看看ViewRoot的處理:

            boolean handled = mView != null

            ? mView.dispatchKeyEventPreIme(event) : true;

            mView則是PhoneWindowDecorView對象,接下來怎么具體傳遞可以慢慢去跟了

            posted on 2013-01-13 12:30 大龍 閱讀(8937) 評論(0)  編輯 收藏 引用

            国产成人AV综合久久| 精品无码久久久久久午夜| 国产精品久久久久影院嫩草| 国产色综合久久无码有码| 国产精品美女久久福利网站| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久免费的精品国产V∧| 成人午夜精品无码区久久| 久久久久久久综合狠狠综合| 伊人久久国产免费观看视频| 日韩人妻无码一区二区三区久久99| 一本久久免费视频| 久久婷婷五月综合色奶水99啪| 欧美成a人片免费看久久| 日韩电影久久久被窝网| 麻豆精品久久久久久久99蜜桃| 亚洲中文字幕久久精品无码APP | 久久久久精品国产亚洲AV无码| 精品伊人久久大线蕉色首页| 久久久久AV综合网成人| 久久综合久久综合九色| 久久久久一本毛久久久| 无码AV波多野结衣久久| 66精品综合久久久久久久| 亚洲色欲久久久综合网| 97精品伊人久久大香线蕉app| 久久免费美女视频| 亚洲国产精品狼友中文久久久| 少妇内射兰兰久久| 国产一区二区精品久久岳| 国产A三级久久精品| 狠狠色丁香婷综合久久| 久久久久久国产a免费观看黄色大片| 人人狠狠综合久久88成人| 久久国产精品国语对白| 欧美va久久久噜噜噜久久| 精品久久久久久久久久中文字幕 | 伊人久久大香线蕉av不变影院| 久久福利青草精品资源站免费| 久久伊人精品一区二区三区 | 亚洲国产精久久久久久久|