android分析windowManager、window、viewGroup之間關系(一)


 

   本文將主要介紹addview方法,在windowManager、window、viewGroup中的實現原理。首先將介紹這些類結構關系,然后分析其內在聯系,介紹實現原理,最后介紹重要的一個參數windowManager.layoutParams。

文章預計分為三個部分。

 

  一、首先介紹一下上述接口、類的結構

  接口:windowManager

    用來在應用與window之間的管理接口,管理窗口順序,消息等

public interface WindowManager extends android.view.ViewManager

     抽象類:window

    定義窗口樣式和行為的抽象基類,用於作為頂層的view加到windowManager中。

    唯一實現了這個抽象類的是PhoneWindow,實例化PhoneWindow需要一個窗口

    public abstract class Window

    其中有一個很重要的內部類

    private class LocalWindowManager extends WindowManagerImpl.CompatModeWrapper{...};

  

  抽象類:viewGroup

    包含其他view的容器,layouts和view 容器的基類。

    public abstract class ViewGroup extends View implements ViewParent, ViewManager

  

  相關接口:ViewParent

        定義了一個view parent 的要負責的功能以及view和parent view之間的關聯

    public interface ViewParent {

         public void requestLayout();

        public void createContextMenu(ContextMenu menu);

        public void bringChildToFront(View child);

        .....

    }

    viewManager

      用來添加和移除activity中的view的接口

public interface ViewManager
{
    public void addView(View view, ViewGroup.LayoutParams params);
    public void updateViewLayout(View view, ViewGroup.LayoutParams params);
    public void removeView(View view);
}

 

二.他們之間的內在關系。

  1. 對於view來說,添加到viewGroup中是通過addView();方式來實現的,在addView中實際上使用的是:

            addViewInner(child, index, params, false);

           流程是: 1.首先是對子View是否已經包含到一個父容器中

                2.對子View布局參數的處理

                3.調用addInArray來添加View

                4.設置父View為當前的ViewGroup

                5.焦點的處理

                6.當前View的AttachInfo信息

                7.View樹改變的監聽

                8.子View中的mViewFlags的設置

                             主要是通過    addInArray添加view,添加的實現為system.arrayCopy(....);

  

  2. 對於viewGroup來說,都會顯示在在一個窗口中,每個都有一個父節點mParent,,最頂上的節點也是一個viewGroup,也就是decorView。

  對於每個activity只有一個decorView也就是ViewRoot,只有一個window,window的獲取是通過下面方法獲取的。

 Window mWindow = PolicyManager.makeNewWindow(this);

  在activity中使用setContentView(),其實是使用了 window.setContentView()完成的,window.setcontentView,

  還是通過LocalWindowManager.addView(view, params)來實現的。這里LocalWindowManager是實現了WindowManagerImpl.CompatModeWrapper

  ,本質上就是WindowManager、viewManager接口中的addvidew方法。

  

  3.  對於windowManager來說一個系統只有一個,它是由系統底層實現的,用於負責調度當前顯示那個窗口,消息處理我們獲得一個windowManager的方式如下:

  

WindowManager windowManager = (WindowManager)context().getSystemService(
									Context.WINDOW_SERVICE);
 

  這里windowManager其實是一個接口,而通過getSystemService的方式。通過這個方式可以獲取很多的系統服務,比如電話、鬧鍾、電源管理等等。

  同時windowManager和幾個類之間的內在聯系如下:

 

本節結束,下節講述windowManager中WindowManager.layoutParams相關。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM