当前位置: 首页 > 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方法,他会将相同包名的值累加

http://www.lqws.cn/news/85213.html

相关文章:

  • 【latex】易遗忘的表达
  • cpper 转 Golang
  • 【LLM】AI Agents vs. Agentic AI(概念应用挑战)
  • K-匿名模型
  • 英语中什么时候用that?
  • 电磁场与电磁波公式汇总
  • DeepSeek 部署中的常见问题及解决方案
  • 【Java EE初阶 --- 多线程(初阶)】多线程的实现案例
  • torch.randn vs torch.rand
  • win32相关(虚拟内存和物理内存)
  • 探索大语言模型(LLM):RSE流程详解——从文档中精准识别高相关片段
  • 第17讲、odoo18可视化操作代码生成模块
  • 基于springboot的家政服务预约系统
  • 算法-集合的使用
  • 统计字符数
  • 知识图谱系列(5):表示学习
  • 【Linux】pthread多线程基础
  • 【python深度学习】Day43 复习日
  • RNN循环网络:给AI装上“记忆“(superior哥AI系列第5期)
  • 快手可灵视频V1.6模型API如何接入免费AI开源项目工具
  • gcc编译构建流程-函数未定义问题
  • UE特效Niagara性能分析
  • 数据资产评估进阶:精读资产评估专家指引第9号——数据资产评估指导【附全文阅读】
  • 【Godot引擎】如何使用内置的全局搜索功能提升开发效率
  • selenium-自动更新谷歌浏览器驱动
  • Redis-6.2.9 cluster集群部署和扩容缩容
  • bismark OT CTOT OB CTOB 以及mapping后的bam文件中的XG,XR列的含义
  • 调试的本质:从混沌走向秩序
  • 双指针题解——反转字符串中的单词【LeetCode】
  • FastAPI安全认证:从密码到令牌的魔法之旅