【问题标题】:UsageStatsManager not returning correct weekly or monthly resultsUsageStatsManager 未返回正确的每周或每月结果
【发布时间】:2020-05-04 16:21:42
【问题描述】:

问题

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

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

背景

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

问题

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

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

但查询 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&lt;UsageStats&gt; 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 查询周/月/年的开源应用程序示例都会非常有帮助。提前致谢。

【问题讨论】:

  • 您是否使用 queryEvents 函数进行每日统计?
  • 是的,但那部分(如前所述)很好。我遇到的麻烦是查询周数和月数。

标签: android usage-statistics usagestatsmanager


【解决方案1】:

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

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

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

【讨论】:

  • 确实,但这种解决方法并不理想,因为我将自己实现 UsageStatsManager 类的功能,而且用户必须等待他们的每周和每月数据可用,从他们开始使用该应用程序的时间。
  • 好吧,用户不必等待每周数据。但是,是的,对于月度数据,它们确实如此,可悲的是,这是这种解决方法的唯一漏洞。
  • 谢谢。我会等待接受您的回答,因为它不能解决最初的问题,但它很有帮助。一个问题,你提到查询每周数据是可能的,但由于某种原因,我无法让它在过去一周以上的使用时间里工作。您能否详细说明您将如何实现这一目标?
  • 好吧,我不应该使用“每周”这个词。 “每周数据”实际上是指过去 7 天的数据。我已经相应地编辑了我的答案
猜你喜欢
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2013-12-24
  • 2016-08-22
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多