不过事物总是曲折发展的,经过Google
多年的调教,现在的Fragment
的功能已经很完善了,在很多场合,足以在很多场合替代Activity
的存在,上面的一些问题也得到了比较妥善的解决,如果看完这篇文章,相信你会找到答案。
巨佬JakeWharton
曾经建议:一个App
只需要一个Activity
.
这说的就是单Activity
多Fragment
模式.使用这种模式有许多好处:
- 首先第一个好处就是流畅,要知道
Activity
属于系统组件,受AMS
管理并且自身是一个God Object
,它的开销是很大的,单Activity
模式可以为我们节省很多资源,还可以避免资源不足时,被前台Activity
覆盖的Activity
被杀掉导致页面数据丢失的情况(因为只有一个Activity
,除非JAVA
堆内存到达系统要杀掉一个程序的临界点,否则系统最不倾向于杀死前台正在运行的Activity
); - 其次就是可以将业务逻辑拆分成更小的模块,并将其组合复用,这在这在大型软件系统中尤为重要(新版
知乎
就使用了单Activity
多Fragment
这种模式),因为我们都知道Activity
的是无法在多个页面中复用的,而此时Fragment
就有了它的勇武之地,它作为轻量级的Activity
,基本可以代理Activity
的工作,并且他是可复用 - 再者,使用
Fragment
可以为程序带来更大的灵活性,我们都知道在Activity
之间传递对象,对象需要序列化,这是因为Activity
作为系统组件,是受AMS
管理的,而AMS
属于系统进程,不在当前程序运行的进程中,启动Activity
时需要暂时离开当前进程去到AMS
的进程中,而AMS
则会将你准备好的数据(也就是Intent
之类的)用来启动Activity
,这也是Fragment
和Activity
之间的区别之一,Activity
属于系统组件,可以在别的进程运行(组件化/多进程方案),而Fragment
只是框架提供给我们的的一个组件,它必须依附于Activity
生存,并且只能在当前进程使用,但这同时也意味这它可以获得更大的灵活性,我们可以给Fragment
传递对象而无需序列化,甚至可以给Fragment
传递View
之类的对象,这都是Activity
不容易做到的.
2.要使用Fragment你必须知道的一些事情
首先要提一点,如果你要学习Fragment
那么你至少得是掌握了Activity
的,如果你还不了解Activity
,笔者建议你先去看一些Activity
相关的文章,再来进阶Fragment
.从下面的文章开始,默认读者已经了解了Activity
的生命周期等相关知识。
Fragment
拥有Activity
所有的生命周期回调函数并且由于自身特点还扩展了一些回调函数,但是这些与