Похоже, Google наконец закрыл все двери для получения текущего пакета приложений переднего плана.
После обновления Lollipop, которое убило, getRunningTasks(int maxNum)
и благодаря этому ответу я использовал этот код для получения пакета приложения переднего плана, начиная с Lollipop:
final int PROCESS_STATE_TOP = 2;
RunningAppProcessInfo currentInfo = null;
Field field = null;
try {
field = RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception ignored) {
}
ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appList = am.getRunningAppProcesses();
for (RunningAppProcessInfo app : appList) {
if (app.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
app.importanceReasonCode == 0 ) {
Integer state = null;
try {
state = field.getInt( app );
} catch (Exception ignored) {
}
if (state != null && state == PROCESS_STATE_TOP) {
currentInfo = app;
break;
}
}
}
return currentInfo;
Android 5.1.1 и выше (6.0 Marshmallow) вроде getRunningAppProcesses()
тоже убили . Теперь он возвращает список вашего собственного пакета приложений.
UsageStatsManager
Мы можем использовать новый UsageStatsManager
API, как описано здесь, но он работает не для всех приложений. Некоторые системные приложения возвращают один и тот же пакет
com.google.android.googlequicksearchbox
AccessibilityService (декабрь 2017 г .: будет запрещен для использования Google)
Некоторые приложения используют AccessibilityService
(как показано здесь ), но у него есть некоторые недостатки.
Есть ли другой способ получить пакет текущего работающего приложения?
источник
ps
в оболочке и политика равна,"fg"
а содержимое/proc/[pid]/oom_adj_score
равно,0
тогда приложение является приложением переднего плана. К сожалению, он/proc/[pid]/oom_adj_score
больше не читается на Android 6.0. gist.github.com/jaredrummler/7d1498485e584c8a120eОтветы:
Чтобы получить список запущенных процессов на Android 1.6 - Android 6.0, вы можете использовать эту библиотеку, которую я написал: https://github.com/jaredrummler/AndroidProcesses . Библиотека читает / proc для получения информации о процессе.
Google значительно ограничил доступ к / proc в Android Nougat. Чтобы получить список запущенных процессов на Android Nougat, вам необходимо использовать UsageStatsManager или иметь root-доступ.
Щелкните историю редактирования, чтобы просмотреть предыдущие альтернативные решения.
источник
Process
реализациюComparable
и переопределитеcompareTo
метод. Затем, когда вы используетеCollections.sort(processesList)
, он будет использовать указанный вами порядок.Используйте этот метод для получения задачи переднего плана. U потребуется системное разрешение "android: get_usage_stats"
ЕСЛИ пользователь включит это в настройках -> Безопасность-> приложение с доступом к использованию. После этого вы получите задачу переднего плана. Аналогичный процесс Очистить матсер от Cheetahamobile ссылка на игру в Google
источник
UsageStatsManager
. Компания Samsung удалила запросы, и пользователю очень неприятно предоставлять системное разрешение.Взгляните на https://github.com/ricvalerio/foregroundappchecker , возможно, это то, что вам нужно. Предоставляет образец кода и избавляет от необходимости реализовывать перекрестный детектор переднего плана.
Вот два образца:
Или регулярно проверяйте:
источник
Google ограничил эту функцию только для системных приложений. Как сообщалось в сообщении об ошибке , для доступа к нему вам потребуется разрешение REAL_GET_TASKS .
источник
Просто добавление потенциальной оптимизации к тому, что я представляю, - это сильно скопированный фрагмент кода для обнаружения самого верхнего приложения на Android M.
это
Можно упростить до этого
Я обнаружил, что использую этот код в двухсекундном цикле, и задался вопросом, почему я использую сложное решение, которое было O (n * log (n)), когда более простое решение было доступно в Collections.max (), которое равно O (n ).
источник
Затем запустите доступность службы и приложения в настройках вашего устройства -> доступность -> Приложение для этой службы.
источник
Пожалуйста, попробуйте использовать
getRunningServices()
вместоgetRunningAppProcesses()
метода.источник