Android面试一天一题(Day 24: 悲催的Fragment)

我发现很多Android程序员写代码时,都喜欢把业务逻辑和UI的更新展示这两块代码都交集在Activity类上,最终往往会产出非常复杂或者上千行代码的类。但如果在开始做一个功能时,就把各种扩展和优化都考虑尽了,也不切实际,而且也有点过度设计的意味。也许因为这个原因,很多人在写代码时就干脆不考虑设计了,直接混在一起要哪块写哪块。

Google也许也看到了这个问题,在Android 3.0版本引进了Fragment,使用官方的support包(android-support-v4)也可以支持在3.0以前的版本使用。之前有一次老外的电话面试,也问到了Fragment方面的问题,那时Fragment刚面世不久,我发现老外都比较潮,喜欢尝试新的东西。

面试题:两个Fragment之间如何进行通信?

先说一下Fragment,中文可以叫片段,其实我们也可以把它理解成一个组件,它有自己的生命周期(回调函数),可以组织UI和业务逻辑。但它不像Android的四大组件(Activity, Service, BroadcastReceiver和ContentProvider)那样可以独立存在,它必须要依附于Activity,由Activity中的FragmentManager实例来管理它的生命周期。

Google最初引入Fragment主要是为了给大屏幕(如平板电脑)上更加动态和灵活的 UI 设计提供支持,看一下下图你就明白了:

我们可以在多个Activity中重复使用某个片段,并且可以按我们的需求把不同的片段组合在一个界面中,好处显而易见,减少工作量提高了代码的可重用性。

也就是说每个片段是相互独立的,如上图所示,Fragment A并不知道这个Activity中是否存在Fragment B。这样一来就会产生Fragment之间通信的问题(比如Fragment A点击了列表的一项,Fragment B的内容要进行更新),当然这个问题的答案并不是唯一的,有很多种做法。不过,最基础的做法你应该了解一下,就是通过Activity进行通信。

尽管Fragment是作为独立于Activity的对象实现,并且可在多个Activity内使用,但片段的给定实例会直接绑定到包含它的 Activity。具体地说,片段可以通过getActivity()访问Activity实例。
同样地,Activity也可以使用findFragmentById()或findFragmentByTag(),通过从FragmentManager获取对Fragment的引用来调用片段中的方法。

知道这些基础,你应该很清楚怎么进行通信了。不过我们建议的方式是面向接口编程,在Fragment中getActivity获取到的Activity实例应该是实现了我们某个接口的实例,即在Fragment的代码中不应该出现某个具体的Activity类。

Fragment的生命周期

如果你喜欢使用Fragment,一定要清楚这些生命周期的方法,哪个方法会创建视图(View),哪个会销毁视图,这样才能更好的使用它们。

先来看看官方的Fragmenet生命周期和Activity生命周期的对应关系图:

Activity 生命周期对片段生命周期的影响

是不是觉得,好像也没有多复杂,只是在一些对应的Activity生命周期方法上进行了细分。

我们再看看反对使用Fragment的人是如何看待Fragment的生命周期的:

是不是头都大了?简单地说Fragment的生命周期并不像官方描述的那样简单,感兴趣的朋友可以看看这篇文章:我为什么主张反对使用Android Fragment

Fragment虽然在某种程度上实现了代码复用,但并没有将UI和逻辑分离,而且引入了复杂的生命周期,在一定程度上也限制了它的使用。如Fragment嵌套Fragment可能会遇到嵌套的Fragment接收不到onActivityResult事件之类的问题。

不过,我也看到有人是这样使用Fragment的,创建一个没有UI的Fragment仅将它做为保存状态的工具使用。因为Fragment也有onSaveInstanceState方法,可以在里面对状态进行处理,而且系统回收Activity后再使用Activity时会帮我们恢复Fragment的状态。

关于Fragment还有很多细节,如果面试者经常使用的话,还可以问问“如何管理Fragment回退栈”或者“FragmentTransaction中remove和detach的区别”等问题。

小结

其实我也不喜欢用Fragment,因为我发现写Fragment和写Activity的感觉是一样的,UI加逻辑,也许是在为我面对的很多项目都不需要考虑平板的原因。不过即使考虑平板,我们一样可以通过自定义的View去实现。有时候我们使用Fragment,是因为考虑到使用它进行界面切换比Activity切换的代价要小很多。

面试时,面试者不一定能记起所有的细节,但我认为一些基础机制(或原理或者默认习俗)都是应该了解的,不然我会认为面试者不是经历的项目太少,就是没有进行系统性的学习,简单说就是,你可以没有使用过Fragment(这并不丢人),但你一定要了解一下Fragment是什么东西吧?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,544评论 25 707
  • 开盘后,不再需要出去要资源要定金,从一个一场忙碌的状态到比较轻松的状态,还真的有点不大适应。明天要计划计划每天的工...
    念美美阅读 224评论 0 0
  • 世间有无数的路,你为什么要走这条最难走的路 我叫张文艺,来自江南水乡,父母是做生意的,只是买卖不大,地点总换,见到...
    小火火君阅读 156评论 0 6
  • 以前有个问题一直困扰着我,你用new操作符在某个函数中分配的空间不会因为这个函数执行结束自动随之消亡,而必须在某个...
    Stroman阅读 127评论 0 0
  • 刚才去健身房的动感单车碰到我班里的同学是在那里教单车,我觉得尴尬,尤其是我觉得那个人很不喜欢我。不喜欢一个人的眼神...
    桥山小野姬阅读 552评论 0 1