关键字: 应用统计 Android源码 应用使用时长 应用使用次数

最近在做有关于应用统计有关的工作,主要是统计系统中客户端应用(非系统自带的那些基础应用,比如DownLoadManager),在每一天的使用情况,统计内容包括:应用打开次数,应用合计使用时长等。
在所搜寻的方案中,大致有如下两种:

  • 方案一:自行记录每次activity的打开和关闭,根据这些数据进行统计。
  • 方案二:使用系统自行记录的每次activity的打开和关闭数据,进行统计。

以下方案采用两个方案并行,主要是以系统数据统计结果为主,以自行记录的数据作为参照,用以对比两组数据,以保证数据统计结果的有效性和稳定性。
#系统数据
在Android中,系统会自行记录应用的打开次数和使用时间,且提供了相关api于开发者,但是每一次版本提升都可能会对api带来相当大的改变,这一块也不例外。但是始终没有变化的就是在拨号键盘输入* # * #4636 # * # *,进入工程模式,点击“使用情况统计数据”,你就可以看到统计界面了。由于各个版本之间差异比较大,而且相关的资料也比较少,本次使用的api以及相关的说明都是以Android-5.1为基础。在某些版本中,应用统计api,存在不少缺陷以及避坑的地方,尤其是手机厂家修改过源码之后,所以对于某些品牌的测试机器,程序的运行结果会有一点不一样,请各位读者有所注意。
#如何获取系统数据
###第一步:获取权限

  1. 在manifest文件中注册该权限
  2. 在系统setting应用中打开相应开关,准许demo应用获取数据。如果不执行这一步的话,demo将无法读取系统数据。
    测试机 : 小米4C。
    打开目录 : 设置 -〉其他高级设置 -〉安全和隐私 -〉有权查看使用情况的应用。界面如下图:

###第二步:获取数据

  1. 获取系统统计信息:
       @SuppressWarnings("ResourceType")@TargetApi(Build.VERSION_CODES.LOLLIPOP)public static ArrayList<UsageStats> getUsageList(Context context, long startTime, long endTime) {Log.i(TAG," EventUtils-getUsageList()   Range start:" + startTime);Log.i(TAG," EventUtils-getUsageList()   Range end:" + endTime);Log.i(TAG," EventUtils-getUsageList()   Range start:" + dateFormat.format(startTime));Log.i(TAG," EventUtils-getUsageList()   Range end:" + dateFormat.format(endTime));ArrayList<UsageStats> list = new ArrayList<>();UsageStatsManager mUsmManager = (UsageStatsManager) context.getSystemService("usagestats");Map<String, UsageStats> map = mUsmManager.queryAndAggregateUsageStats(startTime, endTime);for (Map.Entry<String, UsageStats> entry : map.entrySet()) {UsageStats stats = entry.getValue();if(stats.getTotalTimeInForeground() > 0){list.add(stats);Log.i(TAG," EventUtils-getUsageList()   stats:" + stats.getPackageName() + "   TotalTimeInForeground = " + stats.getTotalTimeInForeground());}}return list;}
  1. 获取系统记录的详细的各个activity的使用情况:
    @SuppressWarnings("ResourceType")@TargetApi(Build.VERSION_CODES.LOLLIPOP)public static ArrayList<UsageEvents.Event> getEventList(Context context, long startTime, long endTime){ArrayList<UsageEvents.Event> mEventList = new ArrayList<>();Log.i(TAG," EventUtils-getEventList()   Range start:" + startTime);Log.i(TAG," EventUtils-getEventList()   Range end:" +endTime);Log.i(TAG," EventUtils-getEventList()   Range start:" + dateFormat.format(startTime));Log.i(TAG," EventUtils-getEventList()   Range end:" + dateFormat.format(endTime));UsageStatsManager mUsmManager = (UsageStatsManager) context.getSystemService("usagestats");UsageEvents events = mUsmManager.queryEvents(startTime, endTime);while (events.hasNextEvent()) {UsageEvents.Event e = new UsageEvents.Event();events.getNextEvent(e);if (e != null && (e.getEventType() == 1 || e.getEventType() == 2)) {Log.i(TAG," EventUtils-getEventList()  "+e.getTimeStamp()+"   event:" + e.getClassName() + "   type = " + e.getEventType());mEventList.add(e);}}return mEventList;}
  1. 获取系统记录的各个应用的使用次数:
    由于该字段不能通过api拿到,故而采取反射的形式,拿到该字段。(注:其实该字段的统计数据并不可靠,一旦强行关机,比如拔电池,就可能失去数据,所以在系统代码中该字段是被隐藏的。当然关于数据的可靠性,在接下来的文章中会有更详细的说明)
private int getLaunchCount(UsageStats usageStats) throws IllegalAccessException {Field field = null;try {field = usageStats.getClass().getDeclaredField("mLaunchCount");} catch (NoSuchFieldException e) {e.printStackTrace();}return (int) field.get(usageStats);}

###结语:
本文主要介绍了关于Android系统中统计各个app的使用情况的解决方案,以及获取相关数据的方法。关于系统记录的数据的原理以及在该原理的逻辑下可能出现的bug,将会在接下来的文章中详细阐述。
###转载请注明出处。
github:UseTimeStatistic
参考文献:
Android 5.0以上通过UsageStatsManager类 获取应用使用情况(精品)
android如何获取系统里各个应用的使用时间?
Android UsageStatsService:要点解析
Android5.1应用打开次数获取

下一篇:Android应用统计-使用时长及次数统计(二)

Android应用统计-使用时长及次数统计(一)相关推荐

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

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

  2. Android 11.0 系统Settings app详情页增加统计使用时长功能

    1.概述 在系统产品开发中,在app详情页展示着权限,使用缓存数据等数据,由于产品需求需要在app 详情页增加app使用时长功能的需求来查看app使用情况的功能,所以就需要统计app使用的时间了 来实 ...

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

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

  4. 王者荣耀服务器什么时候增加人数,2019年王者荣耀与和平精英用户数量、启动次数及使用时长分析[图]...

    一.简介 1.和平精英 <和平精英>是腾讯光子工作室群研发的反恐军事竞赛体验手游,该作于2019年5月8日正式公测.<和平精英>采用虚幻4引擎研发,致力于从画面.地图.射击手感 ...

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

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

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

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

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

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

  8. 雷军手机使用时长曝光!一天刷抖音、微博、微信,办公仅34分钟

    程序员新鲜事(ID:CoderNews)整理 内容参考自:腾讯新闻.微博 要说现在最让大家离不开的东西,就是手机了.身为小米科技创始人.董事长的雷军,每天要各种忙,甚至直至深夜,除了工作时间,他每天玩 ...

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

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

最新文章

  1. 为什么 Java 不支持运算符重载?
  2. python importerror怎么解决-解决python有时候import不了当前的包问题
  3. TCollector
  4. cass怎么把块打散命令_分解cass高程点即属性块
  5. python吧_python初始与安装 - Python东
  6. Linux驱动(13)--传递参数
  7. windows ftp服务器_ftp是什么意思,在windows系统安装ftp只需3步
  8. 安卓系统dicom阅读器_文石BOOX发布新品poke2 color 全球首款开放系统彩色电纸书
  9. VC2013生成的程序兼容WindowsXP操作系统
  10. 串口连接设置超级终端管理交换机
  11. 计算机键盘有哪些作用,电脑键盘各个按键有哪些作用 电脑键盘各个按键作用介绍...
  12. 怎样写好Git的commit信息
  13. 如何用朴素贝叶斯模型预测柯南里的被害人和凶手
  14. 志强处理器结尾的ES、QS、正式版的区别
  15. 京东小程序开放平台,他来了
  16. 【单片机毕业设计】【mcuclub-jj-006】基于单片机的指纹电子密码锁的设计
  17. 【AI视野·今日Robot 机器人论文速览 第二十六期】Wed, 3 Nov 2021
  18. python 渗透率_python达
  19. MULE DW Function 使用expression transformer解析嵌套MEL
  20. python 实现九型人格测试小程序

热门文章

  1. 3个5相乘列乘法算式_新人教版四年级数学上册4.2因数中间或末尾有0的乘法精讲...
  2. Java中ASC码与字符互相转换
  3. 推荐几个很好的编程在线测试平台 online judge
  4. 三种有序表的查找算法
  5. STM32 HAL I2C(IIC)通信的序列传输(restart condition)
  6. busybox 的insmod can't insert operation not permitted 错误解决
  7. readv和writev
  8. 编写函数求特殊a串和
  9. 圆球的体积 (10 分) - PTA
  10. QCS2290 secureboot 流程