Получить (реальный) процесс переднего плана, используя activityManager.getRunningAppProcesses()
Я пытаюсь определить видимое в настоящее время приложение для пользователя.
Для этого я использую метод activityManager.getRunningAppProcesses()
.
Я знаю, что этот метод не поддерживается как Android 5.1.1 - это нормально.
В начале это работало как шарм, я повторяю в списке
RunningAppProcessInfos и проверьте важность.
TL;DR
Каков правильный метод получения текущего процесса переднего плана и предотвращения ложных сообщений? Как выполняется порядок списка - API говорит, что он не указан. Есть ли способ правильно их упорядочить?
Что я сделал:
К сожалению, список, возвращенный ActivityManager, отличается на каждом устройстве. Некоторые устройства возвращают несколько информации с значением 100 (что является FOREGROUND), даже если процесс в настоящее время не отображается.
Это вызвало проблему, что у меня было много ложных срабатываний.
Например, я тестировал его с помощью facebook и создавал тост, каждый раз
facebook находится на переднем плане. Я переключился на Home, поэтому моя пусковая установка должна иметь
был основным процессом. Это было как 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 смартфонов Sony - некоторые из кандидатов. Я получаю список, но действительно просматриваемый в данный момент процесс имеет индекс 11 или около того.
Я не знаю, что делать, чтобы получить текущий процесс переднего плана, без ложных срабатываний.
Каков правильный метод получения текущего переднего плана и предотвращения ложных сообщений? Как выполняется порядок списка - API говорит, что он не указан.
Есть ли способ правильно их упорядочить?
Спасибо!
Ответы
Ответ 1
Каков правильный метод получения текущего переднего плана и предотвратить ложные срабатывания?
UsageStatsManager является единственным официальным API для получения текущего запущенного приложения (см. № 50).
Использование 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 и AppLock use UsageStatsManager на Android 5.1.1+. Из-за SeLinux невозможно получить приложение переднего плана, используя getRunningTasks(int maxNum)
или getRunningAppProcesses()
.