使用 UsageStatsManager 获取前台应用

Using UsageStatsManager to get the foreground app

我正在尝试使用 UsageStatsManager 在带有 Marshmallow 的 Nexus 5 上获取前台应用程序。我记得它曾经有效,但出于某种原因,我现在得到 package/class 个名称的空字符串。

这是我的实现

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() 为假。因此,它 returns null package/class names.

知道我做错了什么吗?

谢谢。

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

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

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

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

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

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