Fragment与Activity的优缺点比较

时间:2021-09-09 17:41:23

项目中对Activity和Fragment使用都很多,它们都能用来写页面,那么什么时候用Activity,什么时候用Fragment?
关于 Android,用多个 activity,还是单 activity 配合 fragment? 中提到 单Activity多Fragment实现,已知的坑有,activity重建时,可能导致多重fragment出现,生命周期复杂;很多项目大量使用Fragment做视图,组装更灵活,开销比Activity小。
在Fragment中监听返回键事件,可以避开多重Fragment重复叠加页面的困扰。

视图重叠是因为fragment已经发生了内存泄漏。
activity的创建、销毁完全托管到systemserver(ams),而fragment一般是手动new一个对象再add到systemserver,所以这里就有问题了。
fragment生命周期开始于add,结束于remove。不管app中间怎么变化,崩溃、进程被回收,只要没有remove,android框架都会自动创建、恢复fragment的状态。

首先Fragment带来的便利以及足以让我们无视它可能会导致的麻烦了,而且很多麻烦都是自己使用方法不正确导致的。
毕竟相比于Activity来说,创建一个Fragment所需系统资源相比Activity来说更少,然而控制却更为灵活。
Fragment一般分为两类,一类是有UI的Fragment,可以作为页面,作为View来展示,另一类是用没有UI的Fragment,一般用作保存数据。重叠以及创建多个的问题,都是自己使用不当导致的。

封装BaseFragment基类

一般项目组会分别对Activity和Fragment进行封装,重写各个生命周期方法,把公用的部分放在BaseFragmentActivity和BaseFragment中。比如设置标题栏、设置广播监听、设置页面统计、添加&取消网络请求、设置显示&隐藏加载框等。

由于Fragment的onCreateView和onViewCreate要用来页面布局,则数据的初始化、网络请求,一般在onCreate方法中,防止页面太久都加载不出来。

public View onCreateView 这个方法中返回之前判断一下你的mRootView是null再inflate,这样会比较好,在ViewPager中随着页面滑动这个方法会调用多次,inflate过了之后就直接用就好了。

使用静态工厂方法newInstance(…)来获取Fragment实例

可以在Google的代码中发现这种写法,好处是接收确切的参数,返回一个Fragment实例,避免了在创建Fragment的时候无法在类外部知道所需参数的问题,在合作开发的时候特别有用。

还有就是Fragment推荐使用setArguments来传递参数,避免在横竖屏切换的时候Fragment自动调用自己的无参构造函数,导致数据丢失。

参考网址:
1、关于 Android,用多个 activity,还是单 activity 配合 fragment?