2021腾讯云限时秒杀,爆款1核2G云服务器298元/3年!(领取2860元代金券),
地址:https://cloud.tencent.com/act/cps/redirect?redirect=1062
2021阿里云最低价产品入口+领取代金券(老用户3折起),
入口地址:https://www.aliyun.com/minisite/goods
前言 Context在android中的作用不言而喻,当我们访问当前应用的资源,启动一个新的activity的时候都需要提供Context,而这个Context到底是什么呢,这个问题好像很好回答又好像难以说清楚。从字面意思,Context的意思是“上下文”,或者也可以叫做环境、场景等
类图
角色
- ViewGroup,视图容器, 核心方法addView, removeView
- Fragment,用于定义生命周期接口,供开发侧使用(生命周期类同activity)
- FragmentActivity, 持有FragmentManager并用它来管理Fragment的生命周期
- FragmentManager,抽象类,仅用来定义操作Fragment的接口
- FragmentManagerImpl,FragmentManager接口的实现类,核心方法enqueueAction,moveToState
- FragmentTransaction,抽象类,
用来定义批处理操作接口时间:2016.05.21 基于:oschinaV2.5.5 开源中国的android源码从性质上应该属于工业代码,相比一些个人开发者的作品更为规范一些,架构设计也颇为合理,有很多值得学习的地方。基本可以满足一些公司的需求。
- BackStackRecord是FragmentTransaction的实现类,持有一个Op(操作)的双向链表,该链表代表这次批处理的内容,核心方法commit,run
交互
- 用户开发好了相关Fragment
- FragmentActivity说,FragmentManager你来处理下(getSupportFragmentManager())
- FragmentManagerImpl说,先给我填个事务操作的请求我好一块儿处理了(beginTransaction())
- 那就填写事务,要干嘛要干嘛(eg. transaction.add(x).remove(xx).replace(xxx))
- 填写后记得提交事务transaction.commit()
- 提交之后事务就进入FragmentManagerImpl的待处理队列了(manager.enqueueAction())
- …排队时间…
- FragmentManagerImpl处理到刚提交的事务了(transaction.run())
- FragmentManagerImpl逐个处理事务里的请求内容,这个请求要这么处理,那个请求要那么处理……(case OP_ADD:mManager.addFragment; case OP_REMOVE::mManager.removeFragment; )
- 举个具体处理的例子,case OP_ADD:mManager.addFragment:先激活makeActive(fragment);再维护更新好fragment的生命周期moveToState(fragment);完成各种生命周期函数的回调并将fragment的view从ViewGroup里add/remove
- DONE
So what
- 将Fragment理解为视图层, 并且其生命周期和activity的保持一致
- 一个activity的逻辑就可以封装在多个图层中了
- 一种封装手段,降低了耦合,增强了复用