1

问题

我想检索UsageStats每周或每月的列表。但是,当我请求月度数据时,输出通常具有重叠的时间间隔,例如 4 月 29 日星期三到 5 月 4 日星期一(请参阅下面时间戳的最新结果)。

所以我的问题是:如何使用 UsageStatsManager 干净地获取特定周(例如周一 - 周日)或月份(例如 4 月 1 日 - 4 月 31 日)的使用情况统计信息?

背景

在我的 Android 应用程序中,我使用UsageStatsManager来检索每周/每月在前台的总时间。这篇关于如何使用的帖子UsageStatsManager已经非常有帮助,以及关于产生错误的每日结果的这篇文章UsageStatsManager(我正在使用该方法进行日常使用统计,现在工作正常)。

问题

当我尝试检索每周/每月间隔的使用情况统计信息时,问题就开始了。UsageStatsManager文档指出

使用数据汇总为时间间隔:天、周、月和年。

但是我从查询 UsageStatsManager 得到的输出是非常不同的。我如何检索过去两个月的 UsageStats 对象列表的示例:

    Calendar endCalendar = Calendar.getInstance();
    long endTime = endCalendar.getTimeInMillis();
    Calendar startCalendar = Calendar.getInstance();
    startCalendar.add(Calendar.MONTH, -2); // since two months.
    long startTime = startCalendar.getTimeInMillis();
    UsageStatsManager usm = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
    List<UsageStats> result = usm.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY, startTime, endTime);

但是,当我查看List<UsageStats> result并记录包的时间戳及其前台时间时,我得到了一堆时间戳,但它们根本不是每月间隔的。我从以下位置为联系人应用程序检索到的时间戳示例result

ForegroundTime: 4447 first=Wed Mar 04 03:53:28 GMT+01:00 2020 last=Fri Mar 06 11:46:18 GMT+01:00 2020
ForegroundTime: 176383 first=Fri Mar 06 11:46:18 GMT+01:00 2020 last=Tue Mar 17 07:53:54 GMT+01:00 2020
ForegroundTime: 14337 first=Tue Mar 17 07:53:54 GMT+01:00 2020 last=Tue Mar 17 20:03:31 GMT+01:00 2020
ForegroundTime: 0 first=Tue Mar 17 20:03:31 GMT+01:00 2020 last=Fri Mar 20 14:32:26 GMT+01:00 2020
ForegroundTime: 0 first=Fri Mar 20 14:32:26 GMT+01:00 2020 last=Mon Mar 23 00:12:11 GMT+01:00 2020
ForegroundTime: 0 first=Mon Mar 23 04:27:16 GMT+01:00 2020 last=Mon Mar 23 17:00:29 GMT+01:00 2020
ForegroundTime: 0 first=Mon Mar 23 17:00:29 GMT+01:00 2020 last=Sat Mar 28 00:52:10 GMT+01:00 2020
ForegroundTime: 0 first=Sat Mar 28 00:52:10 GMT+01:00 2020 last=Fri Apr 03 06:45:08 GMT+02:00 2020
ForegroundTime: 81481 first=Fri Apr 03 06:45:08 GMT+02:00 2020 last=Thu Apr 09 18:04:05 GMT+02:00 2020
ForegroundTime: 0 first=Thu Apr 09 18:04:05 GMT+02:00 2020 last=Thu Apr 16 10:31:23 GMT+02:00 2020
ForegroundTime: 157189 first=Thu Apr 16 10:31:23 GMT+02:00 2020 last=Sun Apr 26 02:10:31 GMT+02:00 2020
ForegroundTime: 0 first=Sun Apr 26 02:10:31 GMT+02:00 2020 last=Wed Apr 29 13:21:12 GMT+02:00 2020
ForegroundTime: 43516 first=Wed Apr 29 13:21:12 GMT+02:00 2020 last=Mon May 04 17:45:43 GMT+02:00 2020

这似乎几乎随机地划分为区间。

任何有关 UsageStatsManager 为何具有此行为的链接/解释,或使用 UsageStatsManager 查询周/月/年的开源应用程序示例都会非常有帮助。提前致谢。

4

1 回答 1

1

我可能无法解决这个问题,但我会建议一种解决方法,即对所有问题使用queryEvents函数 - 每日、每周和每月数据。

通过该功能查询周数据(最近7天的数据)与查询日数据类似。(您提到您已经实现了每日数据的功能)

至于月度数据,您不能直接使用该功能,因为如文档中所述,事件由系统保存大约一周。您需要将使用数据存储在本地数据库中并从中进行查询。

于 2020-05-16T00:02:11.797 回答