Fragment 源码笔记

说来惭愧,用了 Fragment 这么久却没怎么看过它的源码。原因么,一个字懒。每次碰到疑难杂症,Copy and Paste from StackOverflow。前几天看了通过源码解析 Fragment 启动过程,跟着流程走了遍,颇有体会,下面就简单记录下几个要点。

Transaction commit 是异步操作

1
getSupportFragmentManager().beginTransaction().add(R.id.container, fragment).commit();

上面是常常使用的一段代码。beginTransacton() 返回的是 BackStackRecord。BackStackRecord 的 commit() 最终调用的是 mHandler.post()post() 中的操作不是同步执行的,而是在 UI 线程的 Handler 队列的尾部被提交。

Fragment 的状态同步

依旧是上面那句代码,beginTransaction.add(R.id.container, fragment) 最终会调用 mManager.addFragment(f, false)。第二个参数含义为 moveToStateNow,表示是否立即变更 fragment 的状态。由于该参数为 false,因此在 addFragment 时,fragment 不会立即更变其状态,也就意味着 fragment 的回调函数,如 onAttach、onCreate 不会被调用。但 addFragment 会将 fragment 添加到 FragmentManagerImpl 的 mAdded、mActive 队列中。
当下一次 FragmentManagerImpl 的 moveToState(int, boolean) 被调用时,一般发生在 Activity 调用 FragmentManagerImpl 相关的方法时,如 Activity onCreate 时会调用 FragmentManagerImpl 的 dispatchCreate 方法,FragmentManagerImpl 会遍历 mActive 队列并调用 moveToState(f, newState, transit, transitStyle, false),使 fragment 的状态和最新的状态同步。

参考