我正在开发一个用于跟踪日常应用使用情况的安卓应用。这个想法是用户可以为任何应用程序设置每日时间限制,并且在超过限制后最多 2 分钟内会出现通知。(延迟的原因:我使用AlarmManager类创建了一个警报系统,该类将每分钟发出一次运行JobIntentService来检查是否超过任何应用程序的限制)
我使用了UsageStatsManager类的queryEvents方法来计算应用程序的使用时间。
这是我计算应用程序使用时间的代码(我遵循了如何使用 queryEvents):
HashMap<String, Integer> getTimeSpent(Context context, String packageName, long beginTime, long endTime) {
UsageEvents.Event currentEvent;
List<UsageEvents.Event> allEvents = new ArrayList<>();
HashMap<String, Integer> appUsageMap = new HashMap<>();
UsageStatsManager usageStatsManager = (UsageStatsManager)context.getSystemService(Context.USAGE_STATS_SERVICE);
UsageEvents usageEvents = usageStatsManager.queryEvents(beginTime, endTime);
while (usageEvents.hasNextEvent()) {
currentEvent = new UsageEvents.Event();
usageEvents.getNextEvent(currentEvent);
if(currentEvent.getPackageName().equals(packageName) || packageName == null) {
if (currentEvent.getEventType() == UsageEvents.Event.ACTIVITY_RESUMED
|| currentEvent.getEventType() == UsageEvents.Event.ACTIVITY_PAUSED) {
allEvents.add(currentEvent);
String key = currentEvent.getPackageName();
if (appUsageMap.get(key) == null)
appUsageMap.put(key, 0);
}
}
}
for (int i = 0; i < allEvents.size() - 1; i++) {
UsageEvents.Event E0 = allEvents.get(i);
UsageEvents.Event E1 = allEvents.get(i + 1);
if (E0.getEventType() == UsageEvents.Event.ACTIVITY_RESUMED
&& E1.getEventType() == UsageEvents.Event.ACTIVITY_PAUSED
&& E0.getClassName().equals(E1.getClassName())) {
int diff = (int)(E1.getTimeStamp() - E0.getTimeStamp());
diff /= 1000;
Integer prev = appUsageMap.get(E0.getPackageName());
if(prev == null) prev = 0;
appUsageMap.put(E0.getPackageName(), prev + diff);
}
}
return appUsageMap;
}
简而言之,上面的代码计算了应用程序进入前台时的时间戳(UsageEvents.Event.ACTIVITY_RESUMED)和进入后台时的时间戳( UsageEvents.Event.ACTIVITY_PAUSED )的时间差。然后它将这个差异添加到应用程序的总使用时间中。
问题是除非应用程序进入后台,否则无法计算在前台花费的时间。因此,如果超出使用限制,直到应用程序进入后台才会出现通知。
当应用程序在前台时,实际上是否有可能获得前台时间?
注意我已经尝试了queryUsageStats和UsageStats.getTotalTimeInForeground()但由于 queryUsageStats 有一些与此问题无关的其他问题而无法成功。