ViewRootImpl 類色乾,內(nèi)部靜態(tài)類汁讼,Wms 服務通知 App 進程 W浓若,
static class W extends IWindow.Stub {
..
@Override
public void windowFocusChanged(boolean hasFocus, boolean inTouchMode) {
final ViewRootImpl viewAncestor = mViewAncestor.get();
if (viewAncestor != null) {
viewAncestor.windowFocusChanged(hasFocus, inTouchMode);
}
}
}
windowFocusChanged() 方法考榨,MSG_WINDOW_FOCUS_CHANGED,消息通知留储。
ViewRootImpl 類 內(nèi)部 Handler翼抠,ViewRootHandler,消息處理获讳。
case MSG_WINDOW_FOCUS_CHANGED: {
handleWindowFocusChanged();
} break;
handleWindowFocusChanged() 方法阴颖,在該方法中,觸發(fā) 頂層視圖 類派發(fā)方法丐膝。
mView.dispatchWindowFocusChanged(hasWindowFocus);
mView 是 DecorView 類量愧。dispatchWindowFocusChanged() 方法,屬于基類帅矗,ViewGroup 和 View偎肃。
ViewGroup 類
@Override
public void dispatchWindowFocusChanged(boolean hasFocus) {
//父類 dispatch
super.dispatchWindowFocusChanged(hasFocus);
//通知子視圖
final int count = mChildrenCount;
final View[] children = mChildren;
for (int i = 0; i < count; i++) {
children[i].dispatchWindowFocusChanged(hasFocus);
}
}
ViewGroup 類 方法,先 super View 類方法浑此,然后遍歷子視圖累颂,派發(fā)。
View 類
public void dispatchWindowFocusChanged(boolean hasFocus) {
onWindowFocusChanged(hasFocus);
}
DecorView 自己和每一個子視圖,都執(zhí)行一次 dispatchWindowFocusChanged() 方法紊馏,最終都會進入基類 View 的 dispatch 方法料饥。
View 類, onWindowFocusChanged() 方法朱监,內(nèi)容相對固定岸啡,如 InputMethodManager focusOut() 等,子類可繼承重寫赫编。
DecorView 類的重寫巡蘸。
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
..
final Window.Callback cb = mWindow.getCallback();
if (cb != null && !mWindow.isDestroyed() && mFeatureId < 0) {
cb.onWindowFocusChanged(hasWindowFocus);
}
..
}
從 Window 獲取 Callback,接口在 Activity 類實現(xiàn)擂送,空方法悦荒,自定義。
public void onWindowFocusChanged(boolean hasFocus) {
}
FocusChange 狀態(tài)团甲,由 Wms 通過 W 類逾冬,通過 ViewRootImpl 通知 頂層視圖黍聂,在 DecorView 類中躺苦, 優(yōu)先向 Activity 組件 派發(fā),再通知子視圖产还,每一層級子視圖都會執(zhí)行重寫或基類的 onWindowFocusChanged() 方法匹厘。
任重而道遠