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上了。