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

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

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

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

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


person vepzfe    schedule 22.04.2019    source источник
comment
Будет ли это работать, если вы настроите Работу на выполнение в onPause и отмените ее onResume?   -  person Jack    schedule 22.04.2019
comment
Это действительно может сработать. Спасибо за предложение @ jackz314   -  person vepzfe    schedule 22.04.2019


Ответы (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;
        }
person Sultan Mahmud    schedule 22.04.2019
comment
Мое приложение поддерживает API 16 и далее, поэтому я не могу использовать JobScheduler. В любом случае WM уже внутренне использует JobScheduler. Альтернативой был бы планировщик заданий Firebase, но теперь он устарел в пользу WorkManager. - person vepzfe; 22.04.2019
comment
Не могли бы вы проверить мой второй подход. - person Sultan Mahmud; 22.04.2019
comment
Спасибо за предложение, Султан. Я могу использовать этот чек. Это не проблема. Проблема по-прежнему заключается в том, что работа или расписание должны выполняться, когда приложение не находится на переднем плане. В противном случае это условие будет продолжать отказываться, и работа никогда не будет выполнена. - person vepzfe; 22.04.2019
comment
Без сервиса вы не можете проверить, запущено приложение или нет. Так что в сервисе вам нужно это проверить. Предположим, каждые 30 минут сервис будет проверять статус вашего приложения, а затем запускать вызов API. Надеюсь, это поможет вам. - person Sultan Mahmud; 22.04.2019
comment
Это очень плохое решение. Если вы знаете, как работают режим Doze, режим ожидания приложений, сегменты ожидания приложений, и знаете, что Huawei, Samsung и другие OEM-производители агрессивно сокращают фоновые процессы, вы знаете, что запускать компонент каждые 30 минут - очень плохая идея. Это вся причина, по которой были созданы WorkManager и JobScheduler. - person vepzfe; 22.04.2019