当前位置: 首页 > news >正文

【技术支持】安卓开发中queryUsageStats不准确的问题

首先抛出问题

如下第一种方法,不管app是前台到后台,使用总时间总是没有增加,百思不得其解
但是使用第二种方法就可以正常更新,具体原因,看如下分析:

    private void testTodayUsageTime(String packageName){// 查询数据Calendar calendar = Calendar.getInstance();calendar.set(Calendar.HOUR_OF_DAY, 0);calendar.set(Calendar.MINUTE, 0);calendar.set(Calendar.SECOND, 0);calendar.set(Calendar.MILLISECOND, 0);long startTime = calendar.getTimeInMillis();long endTime = System.currentTimeMillis();//第一种方式List<UsageStats> statsList1 = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,startTime,endTime);for (UsageStats stats : statsList1) {if (packageName.equals(stats.getPackageName())) {long dailyUsageMs = stats.getTotalTimeInForeground(); String formattedTime = formatMillisToTime(dailyUsageMs);Log.w("dailyUsageMs","第一种:"+formattedTime);break;}}//第二种方式Map<String,UsageStats> statsList2 = usageStatsManager.queryAndAggregateUsageStats(startTime,endTime);for (Map.Entry<String, UsageStats> entry : statsList2.entrySet()) {String packageNameT = entry.getKey();UsageStats stats = entry.getValue();if(packageNameT.equals(packageName)){// 打印日志long totalTimeInForeground = stats.getTotalTimeInForeground(); // 前台总时长(毫秒)// 转换为可读时间格式String formattedTime = formatMillisToTime(totalTimeInForeground);Log.d("UsageStats","第二种: " + formattedTime);}}}

分析

查看源码,发现了queryUsageStatsqueryAndAggregateUsageStats方法的区别。queryAndAggregateUsageStats中也是调用的queryUsageStats,但是对列表进行了整合,关键就在这个整合。
queryUsageStats由于这个返回的列表中可能会有相同包名的项目,所以有时只打印了第一个包名的值


2025-06-02 23:17:41.607 13651-13651 list  D  com.jingdong.app.mall,47420365
2025-06-02 23:17:41.609 13651-13651 list  D  com.jingdong.app.mall,379028

去掉第一种方法的break后,明显第二种是第一种两个值的累积

2025-06-02 23:42:04.993 14108-14108 dailyUsageMs  W  第一种:13:10:20
2025-06-02 23:42:04.993 14108-14108 dailyUsageMs  W  第一种:00:06:35
2025-06-02 23:42:04.997 14108-14108 UsageStats   D  第二种: 13:16:55

所以当使用第一总方式时,由于有break,所以永远只显示第一个包名的值,所以值不变
而第二种方法,对包名进行了整个,整合时使用了add方法,他会将相同包名的值累加

相关文章:

  • esp32关于PWM最清晰的解释
  • Ⅱ.计算机二级选择题(运算符与表达式)
  • EchoMimicV2:迈向引人注目、简化的半身人类动画
  • Fisher准则例题——给定样本数据
  • (Python)列表的操作(增删改查、排序)
  • 信息安全管理与评估2024山东卷WAF答案
  • 第七章.正则表达式
  • 车载软件更新 --- 数据完整性和正确性策略(数据验签事宜汇总)
  • 经典数学教材推荐(AI相关)
  • 《人性的弱点》能带给我们什么?
  • 构建高性能风控指标系统
  • 初识Linux指令(笔记2)
  • 业务系统-AI 智能导航设计-系统设计篇(上)
  • Matlab绘图
  • 快手可灵视频V1.6模型API如何接入免费AI开源项目工具
  • 【Java EE初阶 --- 多线程(初阶)】多线程的实现案例
  • 达芬奇(DaVinci Resolve)下载安装教程
  • rate-limit 为 java 设计的渐进式限流开源工具
  • 《类和对象--继承》
  • MySQL问题:count(*)与count(1)有什么区别
  • 深圳网站建设外贸/搜索指数查询平台
  • 58同城网网站建设/百度seo和谷歌seo有什么区别
  • 微信公众号的制作方法和步骤/东莞seo网络公司
  • 做彩票网站需要什么收钱的/aso具体优化
  • 网站建设流程及相应技术/谷歌商店app下载
  • 怎么样做免费网站/凡科网站建设