是在onResume之后,开始绘制View的方法performTraversals()中调起的。
// View.java
private void performTraversals() {
// 省略其他代码
host.dispatchAttachedToWindow(mAttachInfo, 0);
// 省略其他代码
performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
// 省略其他代码
performLayout(lp, mWidth, mHeight);
// 省略其他代码
performDraw();
}
- host 赋值是 mView,mView是在ViewRootImpl的setView()方法中赋值,而setView是在给将DecorView添加到Window时调用,所以可知:mView就是DecorView。
// WindowManagerGlobal.java
public void addView(View view, ViewGroup.LayoutParams params,
Display display, Window parentWindow) {
// 无关省略
root = new ViewRootImpl(view.getContext(), display);
// 无关省略
root.setView(view, wparams, panelParentView); // view就是DecorView
// 无关省略
}
- DecorView中没有重写dispatchAttachedToWindow()方法,找父类最终找到View.java
// View.java
void dispatchAttachedToWindow(AttachInfo info, int visibility) {
// 无关省略
onAttachedToWindow();
}
- DecorView中重写了onAttachedToWindow()
// DecorView.java
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
final Window.Callback cb = mWindow.getCallback();
if (cb != null && !mWindow.isDestroyed() && mFeatureId < 0) {
cb.onAttachedToWindow();
}
}
- 拿到Window的接口Callback,并调用onAttachedToWindow,具体的实现就在Activity中。
所以Activity的onAttachedToWindow方法执行在onResume之后,View开始绘制之前。
网友评论