Android应用中的页面,也就Activity,Fragment两种。对于Activity,系统了全局的生命周期监听的方法,只需要在onResume中记录页面显示时的时间,在onPause中计算显示的时长,在onDestroy中将停留时长事件添加到数据库即可:

application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {private Map<Context, Long> durationMap = new WeakHashMap<>();private Map<Context, Long> resumeTimeMap = new WeakHashMap<>();@Overridepublic void onActivityCreated(Activity activity, Bundle bundle) {durationMap.put(activity, 0L);}@Overridepublic void onActivityResumed(Activity activity) {resumeTimeMap.put(activity, System.currentTimeMillis());}@Overridepublic void onActivityPaused(Activity activity) {durationMap.put(activity, durationMap.get(activity)+ (System.currentTimeMillis() - resumeTimeMap.get(activity)));}@Overridepublic void onActivityDestroyed(Activity activity) {long duration = durationMap.get(activity);if (duration > 0) {// 将事件添加到数据库}resumeTimeMap.remove(activity);durationMap.remove(activity);}// 其他生命周期方法
});

而对于Fragment,虽然com.app包中的Fragment没有提供生命周期的全局监听,但25.1.0之后的v4包中提供了全局监听,考虑到通常情况下都使用v4包中的Fragment,所以这里就直接使用了v4包中提供的方法来实现页面停留时长的监听。

FragmentManager fm = getSupportFragmentManager();
fm.registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() {private Map<Fragment, Long> resumeTimeMap = new WeakHashMap<>();private Map<Fragment, Long> durationMap = new WeakHashMap<>();@Overridepublic void onFragmentAttached(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull Context context) {super.onFragmentAttached(fm, f, context);resumeTimeMap.put(f, 0L);}@Overridepublic void onFragmentResumed(@NonNull FragmentManager fm, @NonNull Fragment f) {super.onFragmentResumed(fm, f);resumeTimeMap.put(f, System.currentTimeMillis());}@Overridepublic void onFragmentPaused(@NonNull FragmentManager fm, @NonNull Fragment f) {super.onFragmentPaused(fm, f);durationMap.put(f, durationMap.get(f) + System.currentTimeMillis() - resumeTimeMap.get(f));}@Overridepublic void onFragmentDetached(@NonNull FragmentManager fm, @NonNull Fragment f) {super.onFragmentDetached(fm, f);long duration = durationMap.get(f);if (duration > 0) {// 将事件添加到数据库}resumeTimeMap.remove(f);durationMap.remove(f);}
}, true);

上面的代码只是对Fragment生命周期的监听,但Fragment的可见性与生命周期并不总是一一对应的,如:Fragment show/hide或者ViewPager中的Fragment在切换时生命周期中的方法并不总是执行的,所以还需要监听与这两种情况对应的onHiddenChanged和setUserVisibleHint,但这两个方v4包中提供的全局监听中并没有,所以还需要特殊处理一下。这里提供两种解决方案:

  • 提供一个LifycycleFragment, 对onHiddenChanged和setUserVisibleHint方法进行监听,业务层的Fragment继承此Fragment;
  • 使用AOP,监听onHiddenChanged和setUserVisibleHint;

其中的处理逻辑与onResume和onPause中一致,具体参考后面的源码。
如果要对com.app包中的Fragment实现生命周期的全局监听,可采用以下两种方式:

写一个LifycycleFragment, 在其中实现生命周期的监听,业务层的Fragment实现时继承此Fragment;
使用透明的Fragment,透明的Fragment由于没有UI,其生命周期会与当前Fragment生命周期一致;

由于Fragment总是依赖于Activity存在的,所以其监听范围也是Activity级别的。在Activity的onCreate中对Fragment设置监听即可。
无埋点统计SDK实践

数据埋点统计页面使用时长相关推荐

  1. android判断点击次数_Android应用统计-使用时长及次数统计(一)

    关键字: 应用统计 Android源码 应用使用时长 应用使用次数 最近在做有关于应用统计有关的工作,主要是统计系统中客户端应用(非系统自带的那些基础应用,比如DownLoadManager),在每一 ...

  2. Android应用统计-使用时长及次数统计(一)

    关键字: 应用统计 Android源码 应用使用时长 应用使用次数 最近在做有关于应用统计有关的工作,主要是统计系统中客户端应用(非系统自带的那些基础应用,比如DownLoadManager),在每一 ...

  3. 字节跳动 CEO 张楠谈遭微信封禁;雷军手机使用时长曝光;营业厅能看到详细上网数据?专家:功能必需 | EA周报...

    EA周报 2021年1月29日 每个星期7分钟,元宝带你喝一杯IT人的浓缩咖啡,了解天下事.掌握IT核心技术. 周报看点 1.字节跳动 CEO 张楠谈"抖音遭微信封禁":反而促使用 ...

  4. 百度推出开发者搜索 Beta;雷军手机使用时长曝光;苹果败诉,电脑上可以模拟 iOS 系统 | 极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 丁恩华 出品 | CSDN(ID:CSDNnews ...

  5. android 计算方法数量,如何精确计算Android应用的使用时长

    应用时长的计算友盟早期做法计算每个Activity的时长,然后全部相加就是App的使用时长.后来的做法是在客户端计算,如果应用离开小于30秒内又切回就将切走的时间也算入App的使用时长内. 本人觉得既 ...

  6. charles 华为手机使用_华为手机EMUI9.0健康使用手机怎么用?如何控制手机使用时长?...

    ​随着生活水平的提高.智能手机的普及越来越多人机不离手.几乎到哪都要看一下手机.其实这是一个不好的现象,人们的生活不应该局限于手机屏幕,而忽视了身边的人和事. 华为手机EMUI9.0之后"学 ...

  7. 6亿小时,中国短视频APP日均使用时长!

    中国移动互联网用户规模达到8.2亿 数字媒体:企业采取行动帮助用户监测使用量 越来越多的企业对云部署感兴趣 顾客获取成本(CAC)在高度激烈的行业呈现上升 图片创作和分享越来越流行 今日凌晨,&quo ...

  8. 2022年5月视频用户洞察:用户使用时长增长 平台降本增效初见成效

    目前中国移动视频领域活跃用户数据呈现波动稳定的态势,据易观千帆数据,5月中国移动视频活跃用户数达到9.63亿人,相比上月略微回落:而用户使用时长实现三个月持续增长,达到714.77亿小时,成为近一年内 ...

  9. 如何精确统计页面停留时长

    关注公众号 前端开发博客,回复"加群" 加入我们一起学习,天天进步 作者:今日头条技术 链接:https://techblog.toutiao.com/2018/06/05/ru- ...

最新文章

  1. 算法导论——动态规划:0-1背包问题(完全解)
  2. 学习jQuery顺便学习下CSS选择器:奇偶匹配nth-child(even)
  3. 19道Python基础列表元祖的练习题
  4. 《犯罪心理学》读书笔记(part7)--犯罪心理的主观差异(中上)
  5. websphere一直安装部署_WebSphere集群安装配置及部署应用说明
  6. BGP/MPLS *** Option B 跨域研究实验
  7. 硬核!有人开源了一套呼吸机方案!
  8. 动态修改服务器配置文件,asp.net(c#)动态修改webservice的地址和端口(动态修改配置文件)...
  9. EasyExcel ExcelGenerateException: The index of ‘xx‘ and ‘xx‘ must be inconsistent
  10. PO与VO之间的相互转换
  11. 从零搭建uniapp app,适合小白,傻瓜化,页面搭积木可视化创建
  12. webpy+uploadify实现文件异步上传
  13. 微信自定义链接分享制作,微信自定义链接配置
  14. 产品学习笔记(产品分析报告篇)
  15. excel服务器几个小但是让人抓狂的小问题的解决办法
  16. 一个专科生学习JAVA目标月薪2万是否不切实际? 1
  17. 第三届“成思危社会企业奖”揭晓暨助力东北振兴对话会圆满举办
  18. cookie注入分析和动画教程
  19. 仿豌豆荚应用下载按钮效果
  20. 启动springBoot,使用h2内嵌数据库,修改hibernate方言

热门文章

  1. k8s中etcd报错etcd组件不健康
  2. 理解关系模型的完整性约束
  3. elgamal签名算法c语言,ElGamal加密、签名算法笔记
  4. JS输入银行卡 每4位 加空格分隔
  5. LayUI——数据表格使用
  6. 计算机利弊英语作文带翻译,英语作文电脑优缺点带翻译
  7. 小学英语课堂教学与计算机的结合,信息技术在小学英语课堂教学中的有效运用...
  8. 如何分析关键词排名?
  9. 【2021牛客多校2】F-Girlfriend 计算几何
  10. USBISP/USBasp编程器给Atmega32U4下载Arduino bootloader引导程序