zoukankan      html  css  js  c++  java
  • 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;
        }
        ...
    }
    
  • 相关阅读:
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    算法の序列
  • 原文地址:https://www.cnblogs.com/sishuiliuyun/p/14714996.html
Copyright © 2011-2022 走看看