首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >应用程序在前台时如何计算应用程序的使用时间?

应用程序在前台时如何计算应用程序的使用时间?
EN

Stack Overflow用户
提问于 2020-05-08 10:54:16
回答 1查看 1.9K关注 0票数 8

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

我使用了queryEvents类的UsageStatsManager方法来计算应用程序的使用时间。

下面是我计算应用程序使用时间的代码(我跟踪了如何使用queryEvents):

代码语言:javascript
复制
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)的时间差。然后将这一差异添加到应用程序的总使用时间中。

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

当应用程序在前台时,是否有可能获得前台时间?

注:我和https://developer.android.com/reference/android/app/usage/UsageStats#getTotalTimeInForeground()一起尝试过https://developer.android.com/reference/android/app/usage/UsageStats#getTotalTimeInForeground(),但没有成功,因为queryUsageStats还有一些与这个问题无关的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-11 09:46:03

我已经解决了这个问题。

添加当前运行应用程序当前运行的时间和时间戳的差异,使前景变得更好。

我刚才在return语句之前添加了以下代码:

代码语言:javascript
复制
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);
}

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61677505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档