Android Window 理解

Window概念

Window是一個抽象類,它的唯一實現類是PhoneWindow,Android中的所有視圖都是通過Window來呈現的。WindowManager則爲Window的管理者,負責添加,刪除,更新window中的View。
Window可以理解爲畫板,View是具體的畫,WindowManager是畫筆或橡皮檫。View必須依附於畫板,並可以通過WindowManager進行添加,插除和更新具體的畫。

Window 的三種類型

  • 應用 Window
    應用Window需要對應一個Activity
  • 子 Window
    子Window不能單獨存在,需要依附在父Window上,比如Dialog就是一個子Window
  • 系統 Window
    系統Window需要聲明權限才能創建,比如Toast和系統狀態欄都是系統Window

WindowManager

我們對 Window 的操作是通過 WindowManager 來完成的,WindowManager 是一個接口,它繼承自只有三個方法的 ViewManager 接口:

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

Activity通過WindowManager提供的三個方法間接對View進行管理, 即添加 View、更新 View 和刪除 View。

Window創建過程

window的創建是在LaunchActivity第四步attach方法中調用PolicyManager.makeNewWindow進行的。

mWindow = PolicyManager.makeNewWindow(this);
public Window makeNewWindow(Context context){
    return new PhoneWindow(context);
}

Activity視圖是通過setContentView依附到Window上的。

public void setContentView(int layoutResID) {
    getWindow().setContentView(layoutResID);
    initWindowDecorActionBar();
}

phoneWindow的setContentView代碼步驟:
1.如果沒有DecorView則創建它,DecorView是Activity的頂級View,是一個FrameLayout
2.將View添加到DecorView的content區域
3.回調Activity的onContentChanged方法通知視圖已改變
4.handleResumeActivity中調用makeVisible()方法將decorView加入到WindowManager中並設置爲可見

Activity Window View 關係

Activity是畫架,畫架上掛着畫板
Window是畫板,畫板上有具體的畫(View)
View是具體的畫。View必須畫在畫板上,並可以通過畫筆或橡皮檫(WindowManager)進行添加,插除和更新的圖畫。

Window是連接Activity和view的橋樑。Activity裏有一個phoneWindow對象,phoneWindow裏面實現了DectorView,Activity調用setcontentView把view放置在DectorView的Content區域,這樣view就關聯到activity上了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章