Как запланировать WorkManager, когда приложение не находится на переднем плане

#android #android-jetpack #android-workmanager

#Android #android-jetpack #android-workmanager

Вопрос:

Я хочу запустить задачу, которая выполняет некоторые вызовы API и вносит изменения в локальную базу данных. Это не должно происходить во время работы приложения, иначе это приведет к хаосу.

Как я могу настроить WorkManager для выполнения, когда приложение не находится на переднем плане?

Я вижу, что есть setRequiresDeviceIdle(boolean) метод, который кажется наиболее подходящим, но, к сожалению, он недоступен ниже API 23, и к нему нельзя прибегнуть.

Какие у меня есть варианты для достижения этого?

Комментарии:

1. Сработает ли это, если вы настроите работу на выполнение в onPause и отмените ее onResume ?

2. Это действительно может сработать. Спасибо за это предложение @jackz314

Ответ №1:

Вы можете запустить расписание, а затем проверить, запущено приложение или нет. Если приложение запущено, не вызывайте вызов api else. Для проверки запущено приложение или нет, используйте следующий метод

 public static boolean isAppRunning(final Context context, final String packageName) {
            final ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            final List<ActivityManager.RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
            if (procInfos != null)
            {
                for (final ActivityManager.RunningAppProcessInfo processInfo : procInfos) {
                    if (processInfo.processName.equals(packageName)) {
                        return true;
                    }
                }
            }
            return false;
        }
  

Комментарии:

1. Мое приложение поддерживает API 16 и далее, поэтому я не могу использовать JobScheduler. В любом случае, WM уже использует JobScheduler внутренне. Альтернативой мог бы быть планировщик заданий Firebase, но теперь он устарел в пользу или WorkManager.

2. Не могли бы вы проверить мой второй подход.

3. Спасибо за ваше предложение, Султан. Я могу использовать эту проверку. Проблема не в этом. Проблема по-прежнему заключается в том, что работа или расписание должны выполняться, когда приложение не находится на переднем плане. Иначе это условие будет продолжать выполняться, и работа никогда не будет выполнена.

4. Без сервиса вы не сможете проверить, запущено приложение или нет. Итак, в сервисе вам нужно это проверить. Предположим, что каждые 30 минут служба будет проверять состояние вашего приложения, а затем запускать вызов API. Надеюсь, это поможет вам.

5. Это очень плохое решение. Если вы знаете, как работают режим ожидания, приложения в режиме ожидания, корзины приложений в режиме ожидания, и знаете о Samsung, Huawei и других OEM-производителях, которые сокращают агрессивные фоновые процессы, вы будете знать, что запускать компонент каждые 30 минут — очень плохая идея. Вот и вся причина, по которой были созданы WorkManager и JobScheduler.