先引一篇比较能引发人思考的知乎帖子
https://www.zhihu.com/question/39662488/answer/82469372
因Fragment的基础知识网上较多,现在就不想花时间去写了,看下面链接的两篇文章
http://www.mamicode.com/info-detail-612467.html
http://www.cnblogs.com/shaweng/p/3918985.html
以下是我个人的一些观点,由于对于Fragment实践不算多,对AMS,Activity和Fragment的源码理解有限,下面所述不一定正确,仅供备忘和讨论。
首先,Activity确实是比Fragment要重,这是因为Activity比Fragment要更加强大,承担更多的任务,有些事情是Fragment无法办到的。
比如:
1.使用隐式启动某个Activity及其界面(让第三方启动比然是隐式调用),
2.Activity中有许多属性,例如启动模式,meta-data定义,theme定义主题风格,让一个Activity在另外一个进程运行
3.启动时设置标志位(FLAG_ACTIVITY_NEW_TASK等);intentFilter的功能,可以让自己应用或者第三方应用去
根据不同的多媒体数据类型去启动不同的Activity
4.Fragment的切换是Activity在管理,协调被隐藏的Fragment和启动Fragment的生命周期的管理,它们是在同一个
进程中。而Activity的切换可能会涉及到跨进程的情况,涉及到跨进程通信,需要依赖AMS作为切换调度者。
综上所述
* fragment不是万能的,Activity不是一无是处的。职责不一样,fragment的职责相对于Activity是单一的,简单很多,
因为fragment的初衷就是如其名将ui和UI上的交互处理模块化,便于各种分辨率和各种大小不一Android设备
可以更好的使用同一套代码。
* Activity作为触摸/按键的顶级分配者(对用应用开发者),需要处理contentView不处理的事件。
* Activity作为rootView的持有者,如果不是为了重用性,即与Activity解耦,即把UI和事件处理独立出来,
解耦是为了维护方便,便于升级和拓展,若没有太大的拓展的可能(在可预见的未来),还是直接使用
rootView更加高效,体现在代码运行效率,开发时间和维护看代码更直接,不用花很多事件去设计
和看绕来绕去的层层调用,就像设计模式,不是非得用,有优势,有缺点,看情况而定。
哪些时候是比较适合适用fragment的呢
比如:
1.
如上图这种情况,用两个fragment封装两个界面模块,可以使一套让两种设备重用这两个界面的代码。
2.使用一个Fragment代替一个Activity的情况,就是单任务栈的(如果需要单独在一个task的,则需要
Activity的singleInstance或者FLAG_ACTIVITY_NEW TASK,或者指定一个askAffinity),不需要
隐式启动的,不能使用强大的intentFilter去选择启动的页面。
3.确实没有使用到上述只有Activity能办到的功能(当然Fragment没有的,只有Activity有的强大功能
不仅限于上述那些),那么可以考虑使用fragment来代替Activity,毕竟Fragment的创建和切换都
是比Activity更加轻量级。
4.考虑到之后的拓展或者重用,需要将Activity和Activity中的某块view及该view的交互处理解耦的。