Activity和Fragment各自理论上的生命周期

  • Activity的生命周期是较为经典也最清晰的,在此不表;
  • Fragment从出现到广泛运用也有一段时间了,其标准生命周期也仅比Activity多出一些流程,如onCreateView();

  • Activity和Fragment在实际编码中必定是结合出现的,表现为Activity作为容器,装载有一个或若干个Fragment;
  • 装载多个Fragment时,经常使用TabHost和Viewpager作为载体;
  • 在实际编码中发现,Activity和Fragment的混合情况里,其生命周期的交叉可能与预想中有差别;

  • 使用如下方式加载Fragment时:

    [java] view plaincopy print?
    1. getSupportFragmentManager()
    2. .beginTransaction()
    3. .add(R.id.fragment_container, mFragment, SHARE_PUBLIC_LIST_FRAGMENT_TAG)
    4. .commitAllowingStateLoss();

    其onResume和onPause执行过程为:

    • Activity - onResume
    • Fragment - onResume
    • Activity - onPause
    • Fragment - onPause

友盟-页面统计要求

  • Activity和Fragment共同体页面统计中,需要保证线性不交叉,每个onPageStart都有一个onPageEnd配对,
  • 如:onPageStart ->onPageEnd-> onPageStart -> onPageEnd -> onPageStart ->onPageEnd
  • 这样才能保证每个页面统计的正确。

Viewpager中Fragment的生命周期

  • ViewPager装载Fragment一般使用FragmentPagerAdapter或FragmentStatePagerAdapter,同样借助FragmentManager,在adapter的getItem方法中根据position制定显示的fragment
  • 由于Viewpager的缓存特点,Viewpager启动时其第一个Fragment页面及待缓存的页面都将按顺序呢开始他们的正常生命周期,走向onResume,即:
    • Viewpager所在Activity - onResume
    • Fragment1 - onResume
    • Fragment2 - onResume
    • Fragment3 - onResume
  • 由于这若干个页面的生命周期被同时催化了,影响了我们的单一判断,即无法判断“真正”显示和消失在使用者眼前的页面。

解决方案

  • 方案1:设置Viewpager的缓存机制,不缓存除当前页以外的页面数据,所见即所得,离开即销毁;
  • 此方案对需求改动较大,且较影响用户体验;

  • 方案2:重载Fragment.onHiddenChanged(boolean hidden)方法,其参数hidden代表当前fragment显隐状态改变时,是否为隐藏状态,可通过check此参数作处理;
  • 此方案局限在于本方法的系统调用时间发生在显隐状态改变时,但第一次显示时此方法并不调用;

  • 方案3:重载Fragment.setUserVisibleHint(boolean isVisibleToUser)方法,其参数isVisibleToUser顾名思义最接近我们的需求,代表页面是否“真正”对使用者显示;
  • 此方案局限在于此方法的第一次系统调用甚至早于Fragment的onCreate方法,故其第一次调用时isVisibleToUser值总为false,影响我们对生命周期顺序的判定;
    • Fragment1 - isVisibleToUser - false (多余)
    • Fragment1 - isVisibleToUser - true
    • Fragment1 - isVisibleToUser - false
    • Fragment2 - isVisibleToUser - false (多余)
    • Fragment2 - isVisibleToUser - true
    • Fragment2 - isVisibleToUser - false

实际采用的解决方案

  • 根据对产品需求的理解和用户体验的统一,选择在方案3基础上加以改进;
  • setUserVisibleHint()方法本身很接近我们的需求,它的局限点我采取了一个侵入式的解决方式:

    [java] view plaincopy print?
    1. protected boolean isCreated = false;
    2. @Override
    3. public void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. // ...
    6. isCreated = true;
    7. }
    8. /**
    9. * 此方法目前仅适用于标示ViewPager中的Fragment是否真实可见
    10. * For 友盟统计的页面线性不交叉统计需求
    11. */
    12. @Override
    13. public void setUserVisibleHint(boolean isVisibleToUser) {
    14. super.setUserVisibleHint(isVisibleToUser);
    15. if (!isCreated) {
    16. return;
    17. }
    18. if (isVisibleToUser) {
    19. umengPageStart();
    20. }else {
    21. umengPageEnd();
    22. }
    23. }
  • 对onCreate方法结束的一个标记即可解决问题;

  • 切记:此标记的改变请勿放在Fragment的onActivtyCreate方法中,此方法调用滞后于setUserVisibleHint的判断

One more thing

  • Viewpager装载Fragment时还有另一个坑,Viewpager的父容器(Activity或Fragment)在显隐状态改变时,如在Activity的onResume和onPause调用时,并不会主动通知Viewpager内的Fragment执行其应用的生命周期,故我们需要再增加手动强制调用两次
  • 在Activity中查询到当前的Fragment,并执行其内方法,需要借助Viewpager,并改写其PagerAdapter;
  • 我采用了此文提到的Second Solution:如何获得ViewPager当前显示的Fragment?

转载于:https://www.cnblogs.com/wangfeng520/p/5805926.html

友盟页面统计 - 关于Viewpager中的Fragment的生命周期相关推荐

  1. android viewpager fragment 生命周期,ViewPager中Fragment的生命周期

    网上有很多Fragment生命周期的帖子,但是看了一下,没有找到自己想了解的东西,于是决定自己动手体验一下这个生命周期.主要想了解以下几个问题: Activity中的Fragment的生命周期 Vie ...

  2. 应用瘦身,加固,友盟数据统计

    1. apk瘦身 假设模块为app 减肥 apk瘦身:apk减小.  在功能不变. 作用:节省用户下载消耗流量,下载apk可能性. 投资价值: 用户安装  用户活跃 实现步骤: 一.正常开发项目. 二 ...

  3. 友盟页面访问路径全量统计功能上线啦!

    友盟友都知道,页面访问路径,不仅能够帮助开发者了解 App 各个页面的访问和跳转数据情况,也能对用户的行为做一个好的数据追踪. 友盟页面访问路径针对用户在具体操作过程中的行为,将已有的页面访问路径改版 ...

  4. 友盟iOS统计中破解和越狱是什么?

    友盟iOS统计中破解和越狱是什么? 1.什么是越狱及破解呢? 所谓越狱,是用于获取苹果公司移动设备操作系统iOS最高权限(ROOT)的一种技术手段.越狱完成后设备依然运行iOS操作系统,一款名为Cyd ...

  5. iOS 友盟App统计

    创建账号-->阅读开发文档-->创建应用获取key 在官网上开发文档很简单直接照做就可以进行基础的统计, 比如想统计某一个按钮被点击次数应该怎么办呢?这里就用到了自定义统计事件 首先要注册 ...

  6. ViewPager中Fragment的生命周期和FragmentPageAdapter与FragmentStatePageAdapter对其的影响

    首先,我们创建一个Activity和一个Fragment,并在Fragment的各个生命周期打好日志,并把Fragments丢进Viewpager,这里我们往Viewpager里丢了3个Fragmen ...

  7. Android应用开发—ViewPager FragmentPagerAdapter和FragmentStatePagerAdapter下Fragment的生命周期

    ViewPager配合不同的PagerAdapter,对应Fragment的生命周期有着不同的表现,了解这个生命周期机制对于开发者选择合适的PagerAdapter实现不同的效果,有着很大的帮助. F ...

  8. ViewPager与Fragment结合使用,以及切换的时候Fragment 的生命周期

    下面要做的效果图下图 首先我们创建一个适配器如下 public class FraPagerAdapter extends FragmentPagerAdapter {private List< ...

  9. vue生命周期图示中英文版Vue实例生命周期钩子

    vue生命周期图示中英文版Vue实例生命周期钩子 知乎上近日有人发起了一个 "react 是不是比 vue 牛皮,为什么?" 的问题,Vue.js 作者尤雨溪12月4日正面回应了该 ...

最新文章

  1. POJ2762 Going from u to v or from v to u? 强连通+缩点
  2. 工业机器人调运角度_站在全球角度,看待中国工业机器人
  3. 面试整理(1):原生ajax
  4. 互联网公司各种“花式”裁员,套路特别深,作为程序员你知道吗?
  5. Asp.net Ajax Control Toolkit设计编程备忘录(色眼窥观版)——第5回(错不了专辑)
  6. 172篇文献:NUS颜水成等发布首篇《深度长尾学习》综述
  7. 哈理工OJ 1029 Function Run Fun(记忆思想)
  8. 二叉树(Java实现)
  9. 【智能制造】智能制造50大产业链全景图
  10. 傅里叶变换时域和频域之间的对应关系
  11. 完整版第四方Oreo易支付源码+28K易支付源码
  12. python日期运算_Python:日期计算器
  13. 大数据-玩转数据-阿里DataWorks开发治理平台
  14. 中国第21批援赞比亚军医组凯旋
  15. 设置WinSCP实时更新目录
  16. [分享]深思--求索人的心智 就是求索长青基业
  17. 2019 前端年终总结(干货满满)
  18. gem 安装oxidized-web报错:checking for -licui18n... no处理
  19. 前端使用谷歌打开钉钉的H5页面开发地址
  20. 意欧斯自主研发WMS、WCS系统,科技创新仓储物流管理

热门文章

  1. 作为一个java程序员,常用的linux命令(越攒越多)
  2. 2022-2028年中国金属薄膜行业市场深度监测及投资潜力研究报告
  3. linux watch命令
  4. ionic4中使用Swiper触屏滑动---心酸路
  5. 【牛腩新闻发布系统】开发前的准备01
  6. 程序员应该吃透的集合List
  7. 基于Android和SpringBoot的购物App
  8. 特斯拉超级计算机Dojo
  9. Nucleus SE RTOS初始化和启动
  10. 构建深度学习框架运行平台