1

我正在查看我的使用结果:

List<UsageStats> usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,  startTime,endTime);

其中 startTime 在午夜之后,endTime 在同一天午夜之前。

示例结果:

Pkg:com.android.chrome ForegroundTime:6412 秒上次使用时间:2018 年 4 月 19 日星期四 22:31:17 PDT


Pkg:com.instagram.android ForegroundTime:5415 秒上次使用时间:2018 年 4 月 19 日星期四 23:11:22 PDT


Pkg:com.android.chrome ForegroundTime:5304 秒上次使用时间:2018 年 4 月 19 日星期四 03:00:49 PDT


Pkg:com.instagram.android ForegroundTime:5202 秒上次使用时间:2018 年 4 月 19 日星期四 03:00:45 PDT

如您所见,对于某些事情,它会两次返回相同的包,最后一次使用的时间不同,即使最后一次使用的时间都是在我指定的 24 小时间隔内。

我在这里查看了一堆其他结果: Android UsageStatsManager 产生错误的输出?

如何使用 UsageStatsManager?

但似乎无法解决我的问题。

有谁知道它为什么会这样?好像和时间​​有关?尽管我当时正在熟睡,但对于某些包裹,最后使用的时间总是凌晨 3 点?

4

2 回答 2

3

晚会迟到了。我在这个问题上看到了很多线程,每个人似乎都对如何使用这个 API 感到困惑。在我自己为此苦苦挣扎了一段时间后,我发现这UsageStats是准确的,但引擎盖下发生的事情是非常违反直觉的。

UsageStatsManager.queryUsageStats()文档中:

注意:时间范围的开始和结束时间可以扩展到最接近的整个间隔周期。

事实证明,您提供给该方法的开始和停止时间通常都会在您下方更改以匹配每日间隔。您认为您查询的是过去 15 分钟内的使用情况,但实际上您查询的是过去 24 小时内的使用情况。

值得庆幸的是,API 至少为您提供了一种确定您的开始和停止时间更改为的方法。使用此方法的正确方法是始终使用getFirstTimeStamp()and检查范围转换为的内容getLastTimeStamp()

这样做的非常令人沮丧的后果是您无法对间隔进行任何可靠的控制,这使得它对于许多用例来说毫无用处。像其他人建议的那样,如果您需要精确,那么您应该使用该queryEvents()方法,不幸的是,这意味着需要一些手动工作来总结您正在寻找的适当事件。

于 2020-02-07T14:50:33.030 回答
0

我建议看一下queryAndAggregateUsageStats文档)。

但是,我自己也遇到了 UsageStats 的一些问题,也请看这里:https ://issuetracker.google.com/issues/118564471

于 2018-12-17T12:53:48.240 回答