我试图确定用户当前正在使用的应用程序。为此,我使用activityManager.getRunningAppProcesses()
方法。
我知道该方法自Android 5.1.1以来不再支持 - 这没关系。
起初它像魔法一样工作,我正在迭代运行中的应用程序进程信息列表并检查其重要性。
简而言之,有什么正确的方法可以获取当前前台进程并防止误报?列表的排序方式是如何完成的- API表示未指定。有没有一种方法可以正确地排序它们?
我所做的:
很遗憾,ActivityManager返回的列表在每个设备上都不同。一些设备即使进程当前不可见也会返回多个重要性为100(即FOREGROUND)的信息。
这导致了我有很多误报的问题。例如,我用Facebook测试它,并创建了一个toast,每次Facebook在前台运行时就会出现。我切换到主屏幕,因此我的启动器应该是前台进程。它是在十秒钟内,之后,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表示未指定顺序。是否有一种方法可以正确排序它们?
谢谢!