Подтвердить что ты не робот

Получить (реальный) процесс переднего плана, используя 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 говорит, что он не указан. Есть ли способ правильно их упорядочить?

Спасибо!

4b9b3361

Ответ 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().