首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用activityManager.getRunningAppProcesses()获取(真实)前台进程

使用activityManager.getRunningAppProcesses()获取(真实)前台进程
EN

Stack Overflow用户
提问于 2015-12-11 01:55:33
回答 1查看 2.1K关注 0票数 19

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

我知道该方法在Android 5.1.1中不受支持--这没问题。

在一开始,它的工作方式就像咒语一样,我遍历了RunningAppProcessInfos列表,并检查了它的重要性。

tl;dr获取当前前台进程并防止误报的正确方法是什么?列表的顺序是如何完成的-- API说没有指定。有没有办法对它们进行正确的排序?

我所做的:

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

这导致了我有很多误报的问题。例如,我用facebook进行了测试,每次facebook出现在前台时,我都会创建一个吐司。我切换到Home,所以我的启动器应该是前台进程。大概10秒之后,facebook再次以重要的前景出现在列表中(它既不是开放的,也不是可见的),我得到了一个假阳性。

我意识到一些设备会根据最新的进程在顶部对列表进行排序。因此,我决定尝试以下方法:

代码语言:javascript
复制
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说没有指定。有没有办法对它们进行正确的排序?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-12-14 16:30:52

获取当前前台进程并防止误报的正确方法是什么?

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

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

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

代码语言:javascript
复制
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()获取前台应用。

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

https://stackoverflow.com/questions/34208624

复制
相关文章

相似问题

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