Fragment中getContext得到的context从哪来?(基于androidx.fragment:1.2.5源码)

Q:Fragment中getContext得到的context从哪来?

我们都知道Fragment获取Context时调用getContext()
源码:

class Fragment{
    // Host this fragment is attached to.
    FragmentHostCallback<?> mHost;
	...
	@Nullable
    public Context getContext() {
        return mHost == null ? null : mHost.getContext();
    }
	...
}

Context来自于mHost.getContext(),疑问点转向FragmentHostCallback从什么地方赋值mContext:

class FragmentHostCallback{
    ...
	FragmentHostCallback(@NonNull FragmentActivity activity) {
        this(activity, activity /*context*/, new Handler(), 0 /*windowAnimations*/);
    }

    FragmentHostCallback(@Nullable Activity activity, @NonNull Context context,
            @NonNull Handler handler, int windowAnimations) {
        mActivity = activity;
        mContext = Preconditions.checkNotNull(context, "context == null");
        mHandler = Preconditions.checkNotNull(handler, "handler == null");
        mWindowAnimations = windowAnimations;
    }
	...
}

总结:Fragment中的mActivitymContext是在FragmentActivity赋值的

延伸思考

  1. Context来自于mHost.getContext(),转向mHost从什么地方赋值,发现来自于FragmentStateManager
class FragmentStateManager{
	private final Fragment mFragment;
	...
	FragmentStateManager(@NonNull FragmentLifecycleCallbacksDispatcher dispatcher,
            @NonNull Fragment fragment) {
        mDispatcher = dispatcher;
        mFragment = fragment;
    }
	...
	void attach(@NonNull FragmentHostCallback<?> host, @NonNull FragmentManager fragmentManager,
            @Nullable Fragment parentFragment) {
			...
			mFragment.mHost = host;
			...
	}
}
  1. attach(...)FragmentManager调用
public abstract class FragmentManager {
	...
	void moveToState(@NonNull Fragment f, int newState) {
		...
		switch (f.mState) {
                case Fragment.INITIALIZING:
					...
					fragmentStateManager.attach(mHost, this, mParent);
					...
				}
		...
	}
	
	
	void attachController(@NonNull FragmentHostCallback<?> host,
	@NonNull FragmentContainer container, @Nullable final Fragment parent) {
		mHost = host;
	}
}
  1. 跟踪到FragmentController中的attachHost(@Nullable Fragment parent)
class tesst{
	private final FragmentHostCallback<?> mHost;
	
    /**
     * Returns a {@link FragmentController}.
     */
    @NonNull
    public static FragmentController createController(@NonNull FragmentHostCallback<?> callbacks) {
        return new FragmentController(checkNotNull(callbacks, "callbacks == null"));
    }

    private FragmentController(FragmentHostCallback<?> callbacks) {
        mHost = callbacks;
    }
...
	public void attachHost(@Nullable Fragment parent) {
        mHost.mFragmentManager.attachController(
                mHost, mHost /*container*/, parent);
    }
...
}
  1. 跟踪到引用类FragmentActivity
class FragmentActivity {
    final FragmentController mFragments = FragmentController.createController(new HostCallbacks());
}
  1. 终于看到mHost初始化的类new HostCallbacks()
class HostCallbacks extends FragmentHostCallback<FragmentActivity>{
    public HostCallbacks() {
            super(FragmentActivity.this /*fragmentActivity*/);
        }
}
  1. 最终来到FragmentHostCallback,看到mActivitymContext的初始化
class FragmentHostCallback{
...
    FragmentHostCallback(@NonNull FragmentActivity activity) {
        this(activity, activity /*context*/, new Handler(), 0 /*windowAnimations*/);
    }

    FragmentHostCallback(@Nullable Activity activity, @NonNull Context context,
            @NonNull Handler handler, int windowAnimations) {
        mActivity = activity;
        mContext = Preconditions.checkNotNull(context, "context == null");
        mHandler = Preconditions.checkNotNull(handler, "handler == null");
        mWindowAnimations = windowAnimations;
    }
    ...
}
原文地址:https://www.cnblogs.com/sishuiliuyun/p/14714996.html