我正在使用以下方法查看结果:
List<UsageStats> usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime,endTime);
其中startTime在午夜之后,而endTime在同一天午夜之前。
示例结果:
Pkg:com.android.chrome 前台时间:6412秒 上次使用时间:美国太平洋夏令时间2018年4月19日星期四22:31:17
Pkg:com.instagram.android 前台时间:5415秒 上次使用时间:2018年4月19日星期四23:11:22
Pkg:com.android.chrome 前台时间:5304秒 上次使用时间:2018年4月19日星期四03:00:49
Pkg:com.instagram.android 前台时间:5202秒 上次使用时间:2018年4月19日星期四03:00:45
如您所见,即使某些情况下我最后一次使用的时间是在我指定的24小时间隔内,它也会为某些事情两次返回相同的程序包,并使用不同的时间。
我在这里查看了很多其他结果: Android UsageStatsManager producing wrong output?
但似乎无法解决我的问题。
有人知道为什么会这样吗?似乎是时间相关的?尽管我当时睡着了,但最后一次使用的时间总是说凌晨3点才打包?
答案 0 :(得分:2)
晚聚会。我已经看到许多关于此问题的线程,并且每个人似乎都对如何使用此API感到困惑。在自己为此奋斗了一段时间之后,我发现UsageStats
是准确的,但是在幕后进行的操作却很违反直觉。
摘自UsageStatsManager.queryUsageStats()
文档:
注意:时间范围的开始和结束时间可能会扩展到最接近的整个间隔时间。
事实证明,您提供给该方法的开始和停止时间通常都在您下方进行更改,以与每日间隔相匹配。您认为您正在查询最近15分钟的使用情况,但实际上是最近24小时的使用情况。
值得庆幸的是,该API至少为您提供了一种确定开始时间和停止时间更改为什么的方法。使用此方法的正确方法是始终检查使用getFirstTimeStamp()
和getLastTimeStamp()
将范围转换为什么。
非常令人沮丧的结果是,您对间隔没有任何可靠的控制,这使得它在很多用例中都没有用。像其他人建议的那样,如果您需要精确度,则应该使用queryEvents()
方法,不幸的是,这意味着需要一些人工工作才能汇总所需的适当事件。
答案 1 :(得分:0)
我建议您看看queryAndAggregateUsageStats
(documentation)。
但是,我自己也遇到了UsageStats的一些问题,请在此处查看:https://issuetracker.google.com/issues/118564471