編輯:關於Android編程
1、View和ViewRoot
ViewRoot從名稱上來理解似乎是“View樹的根”,這很容易讓人產生誤解。因為ViewRoot並不屬於View樹的一份子。從源碼實現上來看,ViewRoot和View對象並沒有任何“血緣”關系,它既非View的子類,也非View的父類。ViewRoot可以被理解為“View樹的管理者”——它有一個mView成員變量,指向的是它所管理的View樹的根。
咱們看下下面的布局代碼:上面的布局代碼只是一份任意的布局代碼,這裡主要看下其結構,該布局代碼的View結構可以描如下: 在該布局中,ViewRoot中的mView成員變量指向的就是它所管理的View樹的根,即上圖中的LinearLayout:test元素。ViewRoot的核心任務就是與WindowManagerService進行通信。 2、Activity和Window的關系 我們知道Activity是支持顯示UI的,那麼它是否直接管理view樹或者ViewRoot呢?答案時否定的,Activity並沒有與這兩者產生直接的聯系,因為這中間還有一個被稱為“Window”的對象。大家可以在Activity的源碼中找到如下代碼:private Window mWindow; Window的字面意思是窗口,這很好地解釋了它存在的意義。Window是基類,根據不同的產品可以衍生出不同的子類——具體則是由系統在Activity.attach中調用PolicyManager.makeNewWindow決定的,目前版本的Android系統默認生成的都是PhoneWindo。 3、Window和WindowManagerImpl的關系 在Android源碼中以“Window”開頭的類有不少,如Window,WindowManager,WindowManagerImpl等,為什麼需要這麼多相似的類呢? 先來看Window,它是面向Activity的,表示UI界面的外框;而“框裡面”具體的東西包括布局和內容等,是由具體的Window子類,如PhoneWindow來規劃的。 Window的另一層含義是要與WindowManagerService進行通信,但它並沒有直接在自身實現這一功能。原因是:一個應用程序中很可能存在多個Window。如果它們都單獨與WMS通信,那麼既浪費資源,又會造成管理的混亂。換句話說,它們需要統一的管理。於是就有了WindowManager,它作為Window的成員變量mWindowManager存在。這個WindowManager是一個接口類,其真正的實現是WindowManagerImpl,後者同時也是整個應用程序中所有Window的管理者。因而WindowManager與WindowManagerImpl的關系有點類似於“地方與中央”:地方為實施中央的“政策”提供了一個接口,然後匯總到中央進行管理。 在Window的源碼中與mWindowMager有關的代碼有如下幾句:private WindowManager mWindowManager; mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);
public WindowManager getWindowManager() {
return mWindowManager;
}
public WindowManagerImpl createLocalWidnowManager(Window parentWindow) {
return new WindowManagerImpl(mDisplay, parentWindow);
}從這幾處代碼,大家可以看到Window類中的mWindowManger引用的其實是WindowManagerImpl的實例。
4、ViewRoot和WindowManagerImpl的關系
在早期的系統版本中,WindowManagerImpl在每個進程中只有一個實例。調用它必須使用如下語句: WindowManagerImpl.getDefault();在WindowMangerImpl內部,存在3個全局變量:(下圖中的源碼是2.3.5中的)
它們分別用於表示View樹的根節點、ViewRoot以及Window的屬性。由此也可以看出,一個進程中不僅有一個ViewRoot;而Activity與ViewRoot則是一對一的關系。自Android4.3開始對此做了修改,WindowManagerImpl不再直接存儲上述三個數組變量,而是由一個稱為“WindowMangerGlobal”的類統一管理。 5、ViewRoot和WindowManagerService的關系 每一個ViewRootImpl內部,都有一個全局變量 static IWindowSession sWindowSession; 這個變量用於ViewRoot到WMS的連接,它是ViewRoot利用WMS的openSession()接口來創建得到的。在此基礎上,ViewRoot也會通過IWindowSession.add()方法提供一個IWindow對象——從而讓WMS也可以通過這個IBinder對象來與ViewRoot進行雙向通信。 這裡突然間冒出一個ViewRootImpl類,其實ViewRoot與ViewRootImpl的功能是一樣的,只不過是Android不同版本的不同稱呼。不信看下圖:
今天寫這篇文章的緣由是前一段時間一個網友在我的博客上面留言,想要實現在GridLayout(相當於九宮格)中點擊每項可左右滑動顯示該宮格的圖片,當該宮格的圖
接觸Android久的朋友,就會在面試或者實際開發中遇到AIDL,那麼今天我們就來看看AIDL。一、官方描述1.1 文檔說明AIDL-Android Interface
同時適配Android和IOS代碼注釋比較詳細/** * Sample React Native App * https://github.com/facebook/re
在購買商品時,大家可以自定義數字加減控件,來確定購買商品的實際數量,如何實現此控件,請參考下文:1.自定義數字加減控件的要求創建Module -NumberAddSubV