巨佬Jake Wharton曾说过:一个App只需要一个Activity

640?wx_fmt=png


今日科技快讯


近日,京东物流回应将取消快递员的底薪问题,称原来的薪酬结构已经不适应新的模式,无法对绩效优异的员工体现出足够的激励;同时京东物流员工公积金缴存比例仍处于行业中位水准之上。另有网友爆料,京东还将降低快递员的公积金系数,从12%降到7%,下调了5%。


作者简介


大家周一好,新的一周继续加油哦!

本篇文章来自曦瞳的投稿,和大家分享了Android中fragment的相关知识,希望对大家有所帮助!

曦瞳的博客地址:

https://juejin.im/user/5bbee0e86fb9a05d0e2e8617


首先什么是Fragment?


Fragment是Android的视图生命周期控制器(带生命周期的自定义View),是Activity上的View层级中的一部分,一般可以把它看做一个轻量级的Activity。与传统的Activity相比,它只占用更少的资源,并且提供更大的编码灵活性、在超低版本上的兼容性等。

使用Fragment,即使是在肥肠差劲的平台(例如API 19以下连ART都没有的的老系统)上也能得到较好的运行效果,并且能将过渡动画兼容到更低的版本(通过FragmentTransition指定)。

早期的Fragment出现过很多问题,比如没有onBackPressed(),没有启动模式,重复创建,辣鸡的回退栈,迷之生命周期等等,导致很多开源作者自己独立开发了用于Fragment管理的框架,其中比较出名的有YoKeyword大佬的Fragmentation。

不过事物总是曲折发展的,经过Google多年的调教,现在的Fragment的功能已经很完善了,在很多场合,足以在很多场合替代Activity的存在,上面的一些问题也得到了比较妥善的解决,如果看完这篇文章,相信你会找到答案。

640?wx_fmt=other

巨佬JakeWharton曾经建议:一个App只需要一个Activity。

这说的就是单Activity多Fragment模式,使用这种模式有许多好处:

首先第一个好处就是流畅,要知道Activity属于系统组件,受AMS管理并且自身是一个God Object(上帝对象,Activity的功能太过强大以至于耦合了View层和Model层),它的开销是很大的,单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不容易做到的。


要使用Fragment你必须知道的一些事情


首先要提一点如果你要学习Fragment那么你至少得是掌握了Activity的如果你还不了解Activity笔者建议你先去看一些Activity相关的文章再来进阶Fragment.从下面的文章开始默认读者已经了解了Activity的生命周期等相关知识。

Fragment有两种方式生成一是硬编码到xml文件中二是在Java代码中new然后通过FragmentManager#beginTransaction开启FragmentTransaction提交来添加Fragment(下文会介绍)。两种方式存在着一定区别.硬编码到xml的Fragment无法被FragmentTransition#remove移除,与Activity同生共死,所以你要是这么用了,就不用试了,移除不了的,但是在代码中new出来的是可以被移除的。

直接硬编码到xml中:

<fragment
    android:id="@+id/map_view"
    android:name="org.kexie.android.dng.navi.widget.AMapCompatFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

添加Fragment的第二种方式就是使用FragmentManager#beginTransaction(代码如下)动态添加,你需要先new一个Fragment,然后通过下面Fragment#requireFragmentManager获取FragmentManager来使用beginTransaction添加Fragment,注意add方法的第一个参数,你需要给它指定一个id,也就是Fragment容器的id,通常容器是一个没有子View的FrameLayout,它决定了这个Fragment要在什么位置显示。


  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值