以下从FragmentActivity.onCreate开始分析Fragment的实例化,以及生命周期。
- android.support.v4.app.FragmentActivity#onCreate
这里主要是对LayoutInflater设置了Factory(注意:在同一个Activity中使用getBaseContext和使用Activity.this通过LayoutInflater.from获得的LayoutInflater是同一个,但是不同的Activity获得的不是同一个),这个Factory的作用主要是用来作为hook,便于FragmentActivity通过“fragment”Tag来创建Fragment实例。
然后设置android.app.Activity#setContentView(int) 会触发android.view.LayoutInflater#inflate(int, android.view.ViewGroup)->android.view.LayoutInflater#createViewFromTag。
- android.view.LayoutInflater#createViewFromTag
这里会调用mFactory的onCreateView方法,这里的mFactory也就是FragmentActivity。
- android.support.v4.app.FragmentActivity#onCreateView
先判断是否是“fragment”Tag,如果不是,返回super.onCreateView,父类是直接返回null,这样会丢给LayoutInflater中自己处理。如果是“fragment”Tag,那么会调用FragmentManagerImpl的onCreateView去处理。
- android.support.v4.app.FragmentManagerImpl#onCreateView
这里会直接调用Fragment.instantiate方法去构造Fragment实例。
- android.support.v4.app.Fragment#instantiate(android.content.Context, java.lang.String, android.os.Bundle)
直接通过class.newInstance反射调用了Fragment的无参构造来获得新的Fragment实例。同时在第4步最后会调用addFragment来把新的Fragment添加到FragmentManagerImpl中。
- android.support.v4.app.FragmentManagerImpl#addFragment
这个方法核心点会去进行Fragment的状态变换。
- android.support.v4.app.FragmentManagerImpl#moveToState(android.support.v4.app.Fragment, int, int, int, boolean)
这个方法依次调用了onAttach,onCreate,onCreateView,onViewCreated方法,这也就是Fragment的生命周期中比较重要的几个方法,同时,因为这些方法都是在Activity.onCreate中进行的,所以这些方法都会在onActivityCreated之前调用。
- android.support.v4.app.FragmentActivity#onStart
这里会调用onActivityCreated和onStart方法。
以上就是Fragment创建的过程和一些生命周期的方法的调用顺序。
结论:
- Fragment必须有无参构造,否则无法被实例化。
- Fragment生命周期:Activity.onCreate->Fragment.onAttach->Fragment.onCreate->Fragment.onCreateView->Fragment.onViewCreated->Activity.onStart->Fragment.onActivityCreated->Fragment.onStart