onWindowFocusChanged() 方法


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() 方法。


任重而道远

你可能感兴趣的:(onWindowFocusChanged() 方法)