本文將主要介紹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相關。