4

我正在尝试使用 UsageStatsManager 在带有 Marshmallow 的 Nexus 5 上获取前台应用程序。我记得它曾经可以工作,但由于某种原因,我现在得到了包/类名的空字符串。

这是我的实现

public String[] getForegroundPackageNameClassNameByUsageStats() {
    String packageNameByUsageStats = null;
    String classByUsageStats = null;
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
        UsageStatsManager mUsageStatsManager = (UsageStatsManager)getSystemService("usagestats");                       
        final long INTERVAL = 1000;
        final long end = System.currentTimeMillis();
        final long begin = end - INTERVAL;
        final UsageEvents usageEvents = mUsageStatsManager.queryEvents(begin, end);
        while (usageEvents.hasNextEvent()) {
            UsageEvents.Event event = new UsageEvents.Event();
            usageEvents.getNextEvent(event);
            if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
                packageNameByUsageStats = event.getPackageName();
                classByUsageStats = event.getClassName();
                Log.d(TAG, "packageNameByUsageStats is" + packageNameByUsageStats + ", classByUsageStats is " + classByUsageStats);
            }
        }
    }
    return new String[]{packageNameByUsageStats,classByUsageStats};
}

由于某种原因,它没有进入while 循环,即usageEvents.hasNextEvent() 为假。因此,它返回空包/类名。

知道我做错了什么吗?

谢谢。

4

2 回答 2

4

好的,所以我发现一旦我将间隔设置为 10000 而不是 1000,它就可以工作。显然1s的间隔太小了。

于 2016-08-17T01:55:30.313 回答
2

我自己正在使用这个。我认为只有当应用程序进入前台时才会更新使用统计信息。因此,如果前台应用程序在您的“开始”时间戳之前到达前台(并停留),那么您将无法获得它。:(

另一方面,当你使用很久以前你会得到一个巨大的列表,你只需要最高的时间来确定前台应用程序。

所以我要做的是创建 3 个不同的时间:1 分钟前、1 小时前和 12 小时前。

当我在 1 分钟内得到一个空列表时,我会在 1 小时内重复请求,依此类推。这样我大部分时间都在前台。但我从来没有让它一直工作。

我真的很怀念只询问包管理器哪个应用程序是前台的旧方式(在android 5之前),新方式有点乱。

于 2017-10-05T08:11:15.483 回答