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

Android之数据统计TalkingData集成 Android之TalkingData集成 一、综述 1、适用范围 TalkingData Analytics为移动应用提供数据统计分析服务,通过在应用中加入数据SDK,来在www.talkingdata.com 网站中查阅应用的相关数据。 统计SDK适用于 Android 2.2(API Level 8)及以上的设备。 SDK2.0.X及以上版本支持灵动事件 - 免去在App中添加追踪 阅读详情

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

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

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

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

       
    getSupportFragmentManager()
          .beginTransaction()
          .add(R.id.fragment_container, mFragment, SHARE_PUBLIC_LIST_FRAGMENT_TAG)
          .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()方法本身很接近我们的需求,它的局限点我采取了一个侵入式的解决方式:

       
      protected boolean isCreated = false;
     
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
     
          // ...
          isCreated = true;
      }
     
      /**
       * 此方法目前仅适用于标示ViewPager中的Fragment是否真实可见
       * For 友盟统计的页面线性不交叉统计需求
       */
      @Override
      public void setUserVisibleHint(boolean isVisibleToUser) {
          super.setUserVisibleHint(isVisibleToUser);
     
          if (!isCreated) {
              return;
          }
     
          if (isVisibleToUser) {
              umengPageStart();
          }else {
              umengPageEnd();
          }
     
      }

  • 对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?
viewpager &&ragment 生命周期 1.一直以来的疑问 Fragment在ViewPager到底经历了哪些生命周期方法?到底发生了什么? 常会TabLayout和ViewPager配合起来使用,针对这套组合,就想也做一些学习了解。在一个ViewPager中经常会存在多个Fragment,Fragemnt在ViewPager中的生命周期一直没有闹明白。这周正好在测试Api的时候又用到了TabLayout和ViewPager 阅读详情

相关推荐

android viewpager fragment 生命周期,Viewpager + Fragment滑动时生命周期的回调顺序

最近在做一个项目中用到了viewpager+fragment实现的功能,但是出现了一些问题,尤其是fragment生命周期的问题,有人会说了这生命周期有什么难的,不就是按顺序回调么,显示回调哪些,隐藏回调哪些…… 这大家都知道的其实这种问题经常出现在用到的fragment是相同的,比如说做题同一种题型我们就会用相同的fragment,因为里面的业务逻辑都是一样的,所以在这个时候我们切换题目的时候,...

weixin_36150816的博客 903

【Android】友盟统计Fragment页面显示隐藏的完美解决方案

【Android】友盟统计Fragment页面显示隐藏的完美解决方案 字数887 阅读3111 评论22 喜欢13 在使用友盟统计的时候常常会遇到Activity加Fragment的组合,统计起来比较麻烦。 友盟给出的解决方案是在Activity的onResume()和onPause()方法中执行MobclickAgent.onResume()加MobclickAgent.o

Able 1810

Fragment懒加载 友盟统计Fragment时长

Fragment懒加载 友盟统计Fragment时长的最佳实践。

友盟统计

1.  cocos2d-x统计分析SDK使用指南 2.  在项目中集成SDK 2.1  Andorid 2.1.1  导入SDK 先在友盟的管理后台中创建App,获得AppKey下载SDK并解压缩 导入插件 下载最新版SDK的zip包,将其中的mobclickcpphelper.jar文件复制到本地工程libs子目录下,将libMobClickCpp文件夹复制到[COC

lihonggang_logo的专栏 861

Fragment中嵌套(Fragment+ViewPager)完整Demo

该Demo为Fragment中嵌套(Fragment+ViewPager),在实际的项目中要注意Activity和Fragment的生命周期,以及它们随时可能被销毁的情况。

C++11并发与多线程笔记(2) 线程启动、结束,创建线程多法、join,detach

第二节 线程启动、结束,创建线程多法、join,detach 一、范例演示线程运行的开始 程序运行起来,生成一个进程,该进程所属的主线程开始自动运行;当主线程从main()函数返回,则整个进程执行完毕 主线程从main()开始执行,那么我们自己创建的线程,也需要从一个函数开始运行(初始函数),一旦这个函数运行完毕,线程也结束运行 整个进程是否执行完毕的标志是:主线程是否执行完,如果主线程执行完毕了,就代表整个进程执行完毕了,此时如果其他子线程还没有执行完,也会被强行终止【此条有例外,以后会解释】 创建

qq_38231713的博客 1万+

android友盟自定义事件,友盟统计事件添加

SDK集成通过在工程build.gradle配置脚本中添加maven线上依赖,导入最新版本组件化基础库和统计SDK。 在Gradle依赖中添加:dependencies {compile 'com.umeng.sdk:common:latest.integration'compile 'com.umeng.sdk:analytics:latest.integration'}如果无法正常集成请添加如...

weixin_42320061的博客 874

HWSD全球土壤数据下载处理

下载地址: http://www.fao.org/soils-portal/soil-survey/soil-maps-and-databases/harmonized-world-soil-database-v12/en/

江北20190411的博客 3万+

关于友盟统计Viewpager+Fragment实现方式页面统计

在使用友盟统计的时候分为两种页面统计方式:Activity实现和Activity嵌套Fragment实现两种。我们在构建工程的时候一般都会自定义两个父类BaseActivity和BaseFragment,在这两个类中重写它们的两个生命周期方法,onResume和onPause,友盟统计只需要在这两个方法中加入统计代码即可。 在Activity中,添加session和页面统计 @Over

why110999784的博客 4752

基于深度学习的中文方言识别模型训练实战

本文介绍了一个基于深度学习的中文方言识别模型开发流程。项目采用PyTorch框架和Chinese-BERT-wwm预训练模型,构建了包含BERT基础层、方言特征增强层和注意力机制的多方言分类系统。文中详细阐述了数据收集策略,包括从社交媒体、语料库和众包平台获取多源数据,并实现了文本清洗、同义词替换和回译等数据增强技术。模型架构部分展示了如何在BERT基础上添加方言特征提取层和多头注意力机制来提升识别性能。该方案支持普通话、粤语等6种主要方言的识别,目标准确率达90%以上,响应时间小于100ms,适用于智能客

电脑管家 1736

开源GIS -- 笔记

基础开发库 数据读写:GDAL/OGR(C/C++) ArcGIS和GE都是使用此工具 投影转换:Proj.4(C/C++) 拓扑计算:JTS(Java),GEOS(C++),Shapely(python) 组件式开发库 GeoTools(Java),DotSpatial(.NET) 空间分析: Scipy(通用科学计算、方程求解), numpy,NextworkX, rPy(统计分析), Scikit-learn,pysal(空间分析) 深度学习: Keras、 tensorflow、 pytor

DZ Space 4521

关于Activity中的Viewpager中的Fragment的生命周期

Activity的生命周期是较为经典也最清晰的,在此不表;Fragment从出现到广泛运用也有一段时间了,其标准生命周期也仅比Activity多出一些流程,如onCreateView(); Activity和Fragment在实际编码中必定是结合出现的,表现为Activity作为容器,装载有一个或若干个Fragment;装载多个Fragment时,经常使用TabHost和Viewpage

struggling的专栏 503

使用Matlab实现海洋监视雷达检测仿真

海洋监视雷达是一项重要的海洋探测技术,可以用于海上船只、飞机、潜艇等目标的探测和监视,具有广泛的应用价值。本篇文章将介绍如何使用Matlab进行海洋监视雷达的检测仿真,并提供相应的源代码。本篇文章提供了利用Matlab进行海洋监视雷达检测仿真的基本思路和代码实现。读者可以根据自己的需求进行修改和优化,以适应不同的应用场景。使用Matlab实现海洋监视雷达检测仿真。

2301_78484069的博客 450

Android ViewPager+Fragment(使用问题处理)

ViewPager+Fragment可以非常高效地实现动态编辑多个相似页面。 但是ViewPager会预加载Fragment(左右n(n>=1)个页面) ,导致Fragment的onResume()和onPause()可能不会按预期的执行。在接入友盟统计时,页面统计需要Activity和Fragment的onResume()和onPause()配对,但ViewPager中的Fragment...

u010218170的博客 961

《QGIS快速入门与应用基础》230:添加图例工具

本文系统讲解QGIS图例制作的核心方法与优化技巧。首先强调图例与地图框的绑定逻辑,提出三种绑定状态及适用场景。详细拆解三种图例添加方法:布局工具栏一键添加法(新手首选)、菜单栏添加法和右键快捷创建法,并给出单地图框和多地图框两种典型场景的规范技巧。重点解决新手常见的图例杂乱、样式不规范、内容脱节等问题,帮助用户从基础图例制作进阶到符合行业标准的专业图例设计。通过分步操作图示和实用技巧,使读者能够快速掌握图例创建的核心流程与优化方法。

LuckyHanMo的博客 555

基于 Simulink 的固态变压器(SST)多级协同控制实战教程

《固态变压器多级协同控制仿真指南》摘要: 本教程详细讲解了基于Simulink的固态变压器(SST)三级架构建模与控制方法。核心内容包含:1)搭建级联H桥整流(CHB)、双有源桥(DAB)和逆变器(VSI)的三级主电路;2)提出创新的多级协同控制策略,通过功率前馈实现输入输出级动态匹配;3)给出系统级功率平衡、单元级均压控制的具体实现方案。教程特别强调解决实际工程中的关键问题:代数环处理、软启动设计和刚性系统求解器选择,并提供了硬件在环(HIL)仿真建议。附带的MATLAB代码示例可直接用于实现电容电压均衡

xiaoheshang_123的博客 121

关于Viewpager中的Fragment的生命周期

Activity和Fragment各自理论上的生命周期 Activity的生命周期是较为经典也最清晰的,在此不表;Fragment从出现到广泛运用也有一段时间了,其标准生命周期也仅比Activity多出一些流程,如onCreateView(); Activity和Fragment在实际编码中必定是结合出现的,表现为Activity作为容器,装载有一个或若干个Fragment;装载多

zhangjun的博客 702

【史上最全面esp32教程】oled显示篇

esp32-arduino Oled屏幕的使用

m0_62599305的博客 1万+

ViewPager+Fragment研究总结

viewpager+fragment在日常的开发中经常用到,viewpager为了提高用户进行左右切换时的流畅度,实现了一套预加载的功能,在默认情况下,viewpager会预加载一个页面(默认情况下为1,可以自己设置),即当你使用viewpager+fragment时,除了当前可见的第一个fragment会被加载之外,这个fragment后面的一个fragment也会被加载,这样用户进行切屏时就会...

Fun哥 790

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android面经分享:渣本毕业四年面试多家大厂被拒,原因竟是这个!(最终收获小公司Offer)

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

2401_84537603的博客 610

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ViewPager中Fragment的生命周期

切换ViewPager时Fragment的生命周期变化这里有一个MainActivity,MainActivity中有一个ViewPager,使用的适配器是FragmentPagerAdapter,ViewPager中有三个Fragment:FirstFragment,SecondFragment,ThirdFragment。刚进入MainActivity,Log是这样的:可以看到,MainActi

ting说你跳? 1546

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

android webview onpage started,WebView设置WebViewClient的方法

WebView设置WebViewClient的方法shouldOverrideUrlLoading:在web页面里单击链接的时候,会自动调用android自带的浏览器来打开链接,需要通过该方法在本页面打开;@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);ret...

weixin_31591011的博客 1153

ViewPager中Fragment的懒加载和可见状态监听

什么是对象的序列化和反序列化? 对象序列化,就是将Object对象转换成byte字节序列;这里使用ObjectOutputStream — writeObject(); 对象的反序列化,就是将byte字节序列转换成Object对象;这里使用ObjectInputStream—readObject(); Serializable接口 是java所提供的一个序列化方式,为对象提供标准的序列化和

热爱技术 3855
上一篇: Android开发 - 下拉刷新和分段头悬停列表
下一篇: 在Viewpager中的Fragment使用ContextMenu问题
tongcpp
博客等级 码龄15年 32粉丝 23原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值