android signal 源码分析,Android-Fragment的生命周期处理源码分析

从FragmentActivity开始分析:

在FragmentActivity中有一个FragmentController对象mFragments,该对象的创建和初始化如下:

final FragmentController mFragments = FragmentController.createController(new HostCallbacks());

1.HostCallbacks的初始化

new HostCallbacks()的操作其实很简单,HostCallbacks是FragmentActivity的内部类,是继承自FragmentHostCallback的,而new HostCallbacks最终是调用到了FragmentHostCallback的构造器。FragmentHostCallback的构造器其实就是保存了相应的上下文对象,创建了Handler,该Handler是用来进行异步提交处理Runnable任务的。

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其实是等于0

mWindowAnimations = windowAnimations;

}

在创建HostCallbacks对象的时候,其父类FragmentHostCallback又会创建一个FragmentManager对象mFragmentManager,其实现类是FragmentManagerImpl。

2.FragmentController#createController

FragmentController的对象创建其实很简单,其构造器是私有的,所有通过静态方法创建。

public static FragmentController createController(@NonNull FragmentHostCallback> callbacks) {

return new FragmentController(checkNotNull(callbacks, "callbacks == null"));

}

3.FragmentActivity#onCreate

FragmentActivity作为Activity的生命周期开始位置,则也会通过mFragments这个FragmentController对象进行生命周期的分发,然后执行Fragment的生命周期

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

mFragments.attachHost(null /*parent*/);

// 这里是状态恢复的情况下才会执行

if (savedInstanceState != null) {

// 从内存中取出状态保存是保存的数据

Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);

mFragments.restoreSaveState(p);

// Check if there are any pending onActivityResult calls to descendent Fragments.

if (savedInstanceState.containsKey(NEXT_CANDIDATE_REQUEST_INDEX_TAG)) {

mNextCandidateRequestIndex =

savedInstanceState.getInt(NEXT_CANDIDATE_REQUEST_INDEX_TAG);

int[] requestCodes = savedInstanceState.getIntArray(ALLOCATED_REQUEST_INDICIES_TAG);

String[] fragmentWhos = savedInstanceState.getStringArray(REQUEST_FRAGMENT_WHO_TAG);

if (requestCodes == null || fragmentWhos == null ||

requestCodes.length != fragmentWhos.length) {

Log.w(TAG, "Invalid requestCode mapping in savedInstanceState.");

} else {

mPendingFragmentActivityResults = new SparseArrayCompat<>(requestCodes.length);

for (int i = 0; i < requestCodes.length; i++) {

mPendingFragmentActivityResults.put(requestCodes[i], fragmentWhos[i]);

}

}

}

}

if (mPendingFragmentActivityResults == null) {

mPendingFragmentActivityResults = new SparseArrayCompat<>();

mNextCandidateRequestIndex = 0;

}

super.onCreate(savedInstanceState);

mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);

// 向FragmentController分发生命周期事件

mFragments.dispatchCreate();

}

4.FragmentController#attachHost

public void attachHost(@Nullable Fragment parent) {

// 这里的mHost是FragmentHostCallback的子类对象,mFragmentManager

// 是FragmentManager对象,其实现类是FragmentManagerImpl

// 这里会初始化FragmentManager中的mContainer容器对象,该勇气是在Fragment创建

// ContentView的时候使用的,因为该

mHost.mFragmentManager.attachController(

mHost, mHost /*container*/, parent);

}

5.FragmentManager#attachController

这里其实就是做一定的数据绑定,把对应的Fragment、还有HostCallbacks等于FragmentManager做绑定,不过这里的mParent是为null的。因为在FragmentActivity传入的时候就是传的null

void attachController(@NonNull FragmentHostCallback> host,

@NonNull FragmentContainer container, @Nullable final Fragment parent) {

if (mHost != null) throw new IllegalStateException("Already attached");

mHost = host;

mContainer = container;

mParent = parent;

if (mParent != null) {

// 这里取决于是否依赖有导航的Fragment

updateOnBackPressedCallbackEnabled();

}

// 设置点击backPressed的回调

if (host instanceof OnBackPressedDispatcherOwner) {

OnBackPressedDispatcherOwner dispatcherOwner = ((OnBackPressedDispatcherOwner) host);

mOnBackPressedDispatcher = dispatcherOwner.getOnBackPressedDispatcher();

LifecycleOwner owner = parent != null ? parent : dispatcherOwner;

mOnBackPressedDispatcher.addCallback(owner, mOnBackPressedCallback);

}

// 获取对应的FragmentManager的视图模型

if (parent != null) {

mNonConfig = parent.mFragmentManager.getChildNonConfig(parent);

} else if (host instanceof ViewModelStoreOwner) {

ViewModelStore viewModelStore = ((ViewModelStoreOwner) host).getViewModelStore();

mNonConfig = FragmentManagerViewModel.getInstance(viewModelStore);

} else {

mNonConfig = new FragmentManagerViewModel(false);

}

}

6.FragmentController#dispatchCreate

FragmentController中的很多操作,其实都是通过HostCallbacks中的mFragmentManager对象,调用到FragmentManager或者FragmentManagerImpl中对应的方法。

publ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值