ViewRootImpl 类,内部静态类,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 类 内部 Handler,ViewRootHandler,消息处理。
case MSG_WINDOW_FOCUS_CHANGED: {
handleWindowFocusChanged();
} break;
handleWindowFocusChanged() 方法,在该方法中,触发 顶层视图 类派发方法。
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 类方法,然后遍历子视图,派发。
View 类
public void dispatchWindowFocusChanged(boolean hasFocus) {
onWindowFocusChanged(hasFocus);
}
DecorView 自己和每一个子视图,都执行一次 dispatchWindowFocusChanged() 方法,最终都会进入基类 View 的 dispatch 方法。
View 类, onWindowFocusChanged() 方法,内容相对固定,如 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 类实现,空方法,自定义。
public void onWindowFocusChanged(boolean hasFocus) {
}
FocusChange 状态,由 Wms 通过 W 类,通过 ViewRootImpl 通知 顶层视图,在 DecorView 类中, 优先向 Activity 组件 派发,再通知子视图,每一层级子视图都会执行重写或基类的 onWindowFocusChanged() 方法。
任重而道远