【技术支持】安卓开发中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);}}}
分析
查看源码,发现了queryUsageStats
和queryAndAggregateUsageStats
方法的区别。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方法,他会将相同包名的值累加