Fragment 使用 hide/show 时的生命周期

当你第一眼看到这个标题的时候,肯定很惊讶。没错,我也觉得标题可能不规范,不过真的解决我在使用Fragment时遇到的坑,这里分享出来,供大家参考,一起交流。

先来描述一下我的APP中使用到Fragment的功能和遇到的问题,第一个Fragment里是一个视频播放控件,希望在切换到其他Fragment的时候,暂停视频;再次回到这个Fragment时恢复播放。由于我使用的是hide和show的方式进行的Fragment之间的切换,每个Fragment只被初始化一次。那么问题来了,我尝试按照网上说的Fragment的生命周期,在onPause或onStop方法中暂停,在onResume中恢复播放,可是发现压根没走这些方法,onPause等方法不会调用,onResume只在刚进入是调用了一次,也没法做到让视频暂停。

话说回来,Fragment的使用越来越普遍了,掌握它的生命周期以及注意事项是非常有必要的,首先

All subclasses of Fragment must include a public empty constructor. The framework will often re-instantiate a fragment class when needed, in particular during state restore, and needs to be able to find this constructor to instantiate it.

也就是说每个继承Fragment的类都必须要有公开的构造方法,以便fragment能在需要的时候还原原来的状态。感觉很难理解?通俗的说就是:SDK还原fragment数据的时候,肯定先通过调用XXX.newInstance()方法,获取到fragment的实例对象。这就是为什么要提供一个公开的构造方法的原因了!

其次,生命周期是必须了解的,这个就没必要废话了,网上搜下到处都是。

重点来了,跟我使用Fragment遇到的问题一样,这里再举一个Fragment使用时常遇到的情况,在一个Activity中通过菜单选项的点击来切换不同的Fragment,通常是需要保存Fragment的状态的,比如编辑个人信息模块时点击其他菜单,返回时你编辑的信息应该要保存的,而不是再次初始化。这时就该使用Fragment的hide/show方法了。
很快你就会发现Fragment的生命周期怎么不走了?

这时此方法 onHiddenChanged派上用场了,当Fragment隐藏时,该方法会调用传入参数为true表示该Fragment被隐藏了,当Fragment调用了show方法后,该方法传入的参数为false,表示该Fragment正在显示!

所以总结起来,如果使用hide/show方法来控制Fragment的使用时,原本需要在onResume以及onPause方法做的事情就可以迁移到 onHiddenChanged时进行管理,如:

    if (hidden) {// 不在最前端界面显示
    
    } else {// 重新显示到最前端
    
    }

这样就能完美实现当前Fragment在隐藏和显示时分别需要做的事了,我的APP视频暂停与播放的问题就解决了。
附上我的APP中使用的代码,这样就能理解了:

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    if (hidden) {  //不在最前端界面显示
        mVideoView.pause();
    } else {  //重新显示到最前端
        mVideoView.start();
    }
}

关于add(), show(), hide(), replace()方法的正确使用,网上还有更多介绍,我这里简单做一个我遇到的问题以及解决方案的总结,分享给大家。

下面贴出完整的生命周期:

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

推荐阅读更多精彩内容

  • Fragment概述 Fragment是Activity中用户界面的一个行为或者说是一部分。主要是支持大屏幕上动态...
    wangling90阅读 11,514评论 5 76
  • 死磕 Fragment 的生命周期 本文原创,转载请注明出处。欢迎关注我的 简书 ,关注我的专题 Android ...
    MeloDev阅读 6,982评论 43 105
  • 有一段时间没有写博客了,作为2017年的第一篇,初衷起始于前段时间一个接触安卓开发还不算太长时间的朋友聊到的一个问...
    Machivellia阅读 4,043评论 0 44
  • 我想说, 这是一份永远的情谊。 可是有谁能理解。 这是什么生存条件下的存活。 海南,你可知道? 十万知青用青春开拓...
    梁汝阅读 417评论 1 1
  • 在生活中,朋友因为需要更好的发展,要去别的城市,约着吃饭。饭桌上我得知她要离开的消息,眼泪瞬间落下。我跑到洗手间,...
    晴天云海阅读 529评论 0 0