我正在尝试为用户确定当前可见的应用程序。
为此,我使用了activityManager.getRunningAppProcesses()方法。

我知道该方法由于不支持Android 5.1.1而已-可以。

一开始它就像魅力一样工作,我在遍历列表
的RunningAppProcessInfos并检查其重要性。

tl; dr
什么是获取当前前台进程并防止假阳性的正确方法?列表的顺序如何完成-API表示未指定。有没有办法正确订购它们?


我做了什么:

不幸的是,ActivityManager返回的列表在每个设备上都是不同的。即使当前不可见该过程,某些设备也会返回重要性为100(为FOREGROUND)的多个信息。

这引起了我有很多误报的问题。
例如,每次我都在facebook上测试它并创建一个吐司
Facebook是前台。我切换到家庭,所以我的启动器应该有
是前台程序。大约10秒钟之后,facebook
再次以重要的FOREGROUND出现在列表中(它既未打开也不可见),但我得到了误报。

我认识到某些设备在最近的过程中按顺序对列表进行排序。
因此,我决定尝试以下方法:

ActivityManager.RunningAppProcessInfo appProcess = appProcesses.get(0);
        final String processName = appProcess.processName;
        final String packageName = removeProcessSuffix(processName);
        if (appProcess.importance == FOREGROUND || appProcess.importance == VISIBLE){
            //do something, like the toast
        }

使用 appProcesses.get(0); 我只检查第一个元素,并且该错误消失了。没有误报了。

但是,现在在某些设备上,我不再有任何前台进程。因为他们不以任何方式对列表进行排序。
例如,一些4.2索尼智能手机就是其中的一些候选者。我得到了列表,但是当前真正可见的过程在索引11左右。

我不知道如何做才能获得当前的前台流程,而没有误报。

什么是获取当前前台进程并防止假阳性的正确方法?列表的顺序如何完成-API表示未指定。
有没有办法正确订购它们?

谢谢!

最佳答案



UsageStatsManager是获取当前正在运行的应用程序(see #50)的唯一官方API。

使用 getRunningTasks(int maxNum) getRunningAppProcesses() AccessibilityService 来获取前台应用从未如此可靠。前两种方法的文档具有以下警告: Note: this method is only intended for debugging

以下是使用UsageStatsManager获取顶级应用程序的示例:

Calendar endCal = Calendar.getInstance();
Calendar beginCal = Calendar.getInstance();
beginCal.add(Calendar.MINUTE, -30);
UsageStatsManager manager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
List<UsageStats> stats =  manager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,
    beginCal.getTimeInMillis(), endCal.getTimeInMillis());
Collections.sort(stats, new Comparator<UsageStats>() {

  @Override public int compare(UsageStats lhs, UsageStats rhs) {
    long time1 = lhs.getLastTimeUsed();
    long time2 = rhs.getLastTimeUsed();
    if (time1 > time2) {
      return -1;
    } else if (time1 < time2) {
      return 1;
    }
    return 0;
  }
});
// The first "UsageStats" in the list will be the top application.
// If the list is empty you will need to ask for permissions to use UsageStatsManager
// To request permission:
// startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));

我知道这不是您想要的答案。像CM SecurityAppLock这样的应用在Android 5.1.1+上使用UsageStatsManager。由于SeLinux,不可能使用 getRunningTasks(int maxNum) getRunningAppProcesses() 获得前台应用程序。

关于android - 使用activityManager.getRunningAppProcesses()获取(真实的)前台流程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34208624/

10-10 18:04