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

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

在所搜寻的方案中,大致有如下两种:

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

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

以下方案采用两个方案并行,主要是以系统数据统计结果为主,以自行记录的数据作为参照,用以对比两组数据,以保证数据统计结果的有效性和稳定性。

系统数据

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

如何获取系统数据

第一步:获取权限

在manifest文件中注册该权限

在系统setting应用中打开相应开关,准许demo应用获取数据。如果不执行这一步的话,demo将无法读取系统数据。

测试机 : 小米4C。

打开目录 : 设置 -〉其他高级设置 -〉安全和隐私 -〉有权查看使用情况的应用。界面如下图:

第二步:获取数据

获取系统统计信息:

@SuppressWarnings("ResourceType")

@TargetApi(Build.VERSION_CODES.LOLLIPOP)

public static ArrayList 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 list = new ArrayList<>();

UsageStatsManager mUsmManager = (UsageStatsManager) context.getSystemService("usagestats");

Map map = mUsmManager.queryAndAggregateUsageStats(startTime, endTime);

for (Map.Entry 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;

}

获取系统记录的详细的各个activity的使用情况:

@SuppressWarnings("ResourceType")

@TargetApi(Build.VERSION_CODES.LOLLIPOP)

public static ArrayList getEventList(Context context, long startTime, long endTime){

ArrayList 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;

}

获取系统记录的各个应用的使用次数:

由于该字段不能通过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,将会在接下来的文章中详细阐述。

转载请注明出处。

android判断点击次数_Android应用统计-使用时长及次数统计(一)相关推荐

  1. 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. java 统计在线时长_如何有效统计app用户在线时长?

    Android平台: sdk版本v5.2.0及之后: app的单次使用时长=本次启动的结束时间减去本次启动的开始时间,即end_time减去start_time. 如果在本次启动过程中,应用退到后台运 ...

  6. 数据埋点统计页面使用时长

    Android应用中的页面,也就Activity,Fragment两种.对于Activity,系统了全局的生命周期监听的方法,只需要在onResume中记录页面显示时的时间,在onPause中计算显示 ...

  7. android 轮播coverflow,vue-awesome-swiper 3D coverflow effect 使用时每个slider发生错位

    项目中使用3D Coverflow Effect 这个组件,但是在同一个页面中,会被其他组件(switch,popup)(操作时带有动画或过渡效果,如遮罩层的显示隐藏.switch的开关切换)影响,导 ...

  8. Android开发-在Android项目里集成友盟统计SDK进行对移动APP统计的实现

    前 言 友盟(Umeng),2010年4月在北京成立,是中国最专业.最有数据凝聚力的移动开发者服务平台.友盟以移动应用统计分析为产品起点,发展成为提供从基础设置搭建-开发-运营服务的整合服务平台,致力 ...

  9. 统计app用户在线时长_「云工作普及系列」2.如何实时统计工作时长,提高工作效率

    记上节我们讲了[1.如何注册云工作平台]之后,接下来一起探索下该平台提供的各个产品功能.今天主要讲一下如何它的实时统计工作时长是怎么实现的? 我们先来了解一下它的工作时长实时统计的功能. 一,从web ...

最新文章

  1. 美多商城之商品(商品数据库表设计)
  2. WF4.0 基础篇 (十八) Flowchar
  3. 《乐在C语言》一2.2 数据类型
  4. 在linux oracle 10g/11g x64bit环境中,goldengate随os启动而自己主动启动的脚本
  5. java学习(101):arraylist的遍历和增加
  6. linux 建立交叉编译环境变量,ARM-Linux-gcc-4.4.3交叉编译环境终于搭建
  7. treeset java_Java TreeSet last()方法与示例
  8. 对文件夹内所有文件批量命名
  9. 360路由器v2刷第三方固件_路由器不拆闪存,编程器刷机技巧,恢复出厂固件办法...
  10. 小米 Notebook Air 2016 13.3黑苹果efi引导文件
  11. python fundamental structure_Data Structures and Algorithms in Python
  12. ubuntu java ide,在Ubuntu 18.04系统中下载与安装Eclipse IDE的方法
  13. MySQL 高级查询
  14. matlab提取数据的一部分,matlab处理excel数据【怎么用MATLAB从excel中提取部分数据】...
  15. HTML5+app开发学习之调试篇
  16. Lawnmower(洛谷 CF115B)
  17. I2C总线时序以及ACK和NACK(NAK),SCL被从机拉低?
  18. C#事务处理(三)之Transactions事务
  19. Oracle 11.2 参数详解
  20. 软件开发团队中的特殊角色

热门文章

  1. php 网站移动端自适应,HTML5 移动端自适应布局
  2. java事务超时时间,java – 如何在WebSphere Liberty Batch中配置事务超时?
  3. Mybatis-plus批量插入、批量修改数据saveBatch等速度缓慢
  4. Git bash 编码格式配置_02
  5. Git 切换提交历史节点
  6. centos7无法使用epel的解决方法
  7. Centos7 下载、安装、配置、启动部署
  8. python-解码 decode 报错的问题
  9. Java-类加载器-类运行时结构-。。。。
  10. linux运行雷神之锤,Ubuntu18.04下可以完美运行Quake3..