我正在尝试为用户确定当前可见的应用程序。
为此,我使用了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 Security和AppLock这样的应用在Android 5.1.1+上使用UsageStatsManager。由于SeLinux,不可能使用
getRunningTasks(int maxNum)
或 getRunningAppProcesses()
获得前台应用程序。关于android - 使用activityManager.getRunningAppProcesses()获取(真实的)前台流程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34208624/