gpt4 book ai didi

android - 当应用程序处于前台状态时,如何计算应用程序使用时间?

转载 作者:行者123 更新时间:2023-12-01 18:33:51 32 4
gpt4 key购买 nike

我正在开发一个用于跟踪每日应用使用情况的android应用。这个想法是,用户可以为任何应用设置每日时间限制,超过该限制后最多2分钟内会出现一条通知。 (延迟的原因:我使用AlarmManager类创建了一个警报系统,该警报系统每分钟运行一次JobIntentService,它将检查是否超过了任何应用程序的限制)

我已经使用queryEvents类的UsageStatsManager方法来计算应用使用时间。

这是我的用于计算应用使用时间的代码(我遵循How to use 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)的时差。然后,将这种差异添加到应用程序的总使用时间中。

问题在于,除非应用程序变为后台,否则无法计算花费在前台的时间。因此,如果超出了使用限制,则在应用程序变为后台之前,不会出现通知。

当应用程序处于前台状态时,实际上是否可以获得前台时间?

N.B.我已经尝试将 queryUsageStatsUsageStats.getTotalTimeInForeground()一起使用,但是由于queryUsageStats还有一些与此问题无关的问题而无法成功。

最佳答案

我已经解决了这个问题。

添加当前时间和当前正在运行的应用程序进入前台的时间戳的时间差就可以了。

我只是在return语句之前添加了以下代码:

UsageEvents.Event lastEvent = allEvents.get(allEvents.size() - 1);
if(lastEvent.getEventType() == UsageEvents.Event.ACTIVITY_RESUMED) {
int diff = (int)System.currentTimeMillis() - (int)lastEvent.getTimeStamp();
diff /= 1000;
Integer prev = appUsageMap.get(lastEvent.getPackageName());
if(prev == null) prev = 0;
appUsageMap.put(lastEvent.getPackageName(), prev + diff);
}


这很简单,在发布问题之前我应该​​考虑一下。

关于android - 当应用程序处于前台状态时,如何计算应用程序使用时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60103058/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com