android Fragment 源码分析

类图

角色

  • ViewGroup,视图容器, 核心方法addView, removeView
  • Fragment,用于定义生命周期接口,供开发侧使用(生命周期类同activity)
  • FragmentActivity, 持有FragmentManager并用它来管理Fragment的生命周期
  • FragmentManager,抽象类,仅用来定义操作Fragment的接口
    • FragmentManagerImpl,FragmentManager接口的实现类,核心方法enqueueAction,moveToState
  • FragmentTransaction,抽象类,用来定义批处理操作接口
    • BackStackRecord是FragmentTransaction的实现类,持有一个Op(操作)的双向链表,该链表代表这次批处理的内容,核心方法commit,run

交互

  1. 用户开发好了相关Fragment
  2. FragmentActivity说,FragmentManager你来处理下(getSupportFragmentManager())
  3. FragmentManagerImpl说,先给我填个事务操作的请求我好一块儿处理了(beginTransaction())
  4. 那就填写事务,要干嘛要干嘛(eg. transaction.add(x).remove(xx).replace(xxx))
  5. 填写后记得提交事务transaction.commit()
  6. 提交之后事务就进入FragmentManagerImpl的待处理队列了(manager.enqueueAction())
  7. …排队时间…
  8. FragmentManagerImpl处理到刚提交的事务了(transaction.run())
    1. FragmentManagerImpl逐个处理事务里的请求内容,这个请求要这么处理,那个请求要那么处理……(case OP_ADD:mManager.addFragment; case OP_REMOVE::mManager.removeFragment; )
    2. 举个具体处理的例子,case OP_ADD:mManager.addFragment:先激活makeActive(fragment);再维护更新好fragment的生命周期moveToState(fragment);完成各种生命周期函数的回调并将fragment的view从ViewGroup里add/remove
  9. DONE

So what

  1. 将Fragment理解为视图层, 并且其生命周期和activity的保持一致
  2. 一个activity的逻辑就可以封装在多个图层中了
  3. 一种封装手段,降低了耦合,增强了复用

你可能感兴趣的:(android,Fragment)