Android Oreo Workmanager PeriodicWork не работает

Версия Android: 8.1.0

Устройство: Infinix X604B

Workmanager: 1.0.0-alpha11 (последняя версия)

Запланировал запуск PeriodicWorkRequest каждые 15 минут. Запрос на работу запускается каждые 15 минут в течение примерно одного часа. Тогда PeriodicWorkRequest перестает работать. Через 8 часов фоновая работа вообще не расписывается. Я не убивал свое приложение, оно в фоне.

Когда я возвращаю приложение на передний план, PeriodicWorkRequest снова запускает фоновую задачу. С аналогичным опытом без повтора после того, как я поместил свое приложение в фоновый режим.

Я отключил оптимизацию батареи для своего приложения.

Вот образец класса My Worker.

class TestWorker extends Worker {
public TestWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
    super(context, params);
}

@NonNull
@Override
public Result doWork() {
    // Adding timestamp of background execution to firestore.
    Map<String, String> value = new TreeMap<>();
    SimpleDateFormat df = new SimpleDateFormat("hh:mm");
    String dateFormat = df.format(Calendar.getInstance().getTime());
    value.put("time", dateFormat);
    FirebaseFirestore.getInstance()
            .collection("my-collection")
            .add(value);
    return Result.SUCCESS;
}

}

Вот как я это называю:

PeriodicWorkRequest.Builder testBuilder =
    new PeriodicWorkRequest.Builder(TestWorker.class, 15,
                                    TimeUnit.MINUTES);

PeriodicWorkRequest testWork = testBuilder.build();
WorkManager.getInstance().enqueue(testWork);

person Ashish Khurange    schedule 13.11.2018    source источник
comment
Не могли бы вы поделиться кодом о том, как вы начинаете свой PeriodicWorker?   -  person Jeel Vankhede    schedule 13.11.2018
comment
У меня тоже была такая проблема. Я пробовал с телефоном Xiomi. Из-за нестандартной работы с ромом ясли не работали. Итак, я начал использовать Alarm Manager для этого типа функций.   -  person Suresh    schedule 13.11.2018
comment
@JeelVankhede Добавил образец кода.   -  person Ashish Khurange    schedule 14.11.2018
comment
@Suresh опробует Alarm Manager и обновит вас. Спасибо.   -  person Ashish Khurange    schedule 14.11.2018
comment
@AshishKhurange У тебя получилось? В моем случае dowork запускается только один раз и никогда не повторяется, даже если я установил время на 1 секунду!   -  person lucky1928    schedule 12.03.2019
comment
@ lucky1928 Нет, когда приложение работает в фоновом режиме на этом конкретном устройстве, периодическая работа никогда не повторяется. Но когда приложение выходит на передний план, запускается периодическая работа. Обратите внимание, что минимальное время для повтора составляет 15 минут, вы не можете установить 1 секунду.   -  person Ashish Khurange    schedule 13.03.2019


Ответы (2)


Вы можете начать с уникальной периодической работы, как показано ниже,

WorkManager.getInstance().enqueueUniquePeriodicWork(UNIQUE_ID, ExistingPeriodicWorkPolicy.REPLACE, testWork);

Здесь UNIQUE_ID - это Строка, которая проверит уникальность вашего воркера и заменит существующий, если он уже находится в очереди на периодические работы.

Ознакомьтесь с политиками для сотрудников здесь.

И не забудьте добавить тот же тег к вашему экземпляру worker, например:

PeriodicWorkRequest.Builder testBuilder =
new PeriodicWorkRequest.Builder(TestWorker.class, 15, TimeUnit.MINUTES);
PeriodicWorkRequest testWork = testBuilder.addTag(UNIQUE_ID).build(); // Set the same string tag for worker.
person Jeel Vankhede    schedule 15.11.2018
comment
Не повезло с твоим советом. На моем устройстве Workmanager не работает должным образом. Даже когда я использую свое устройство, если приложение находится в режиме ожидания, Workmanager не планирует задачу. Workmanager работает только тогда, когда используется мое приложение. - person Ashish Khurange; 20.11.2018
comment
Это может быть связано с тем, что если вы включили не скрывать действия в параметрах разработчика устройства. (Это всего лишь предположение) - person Jeel Vankhede; 20.11.2018
comment
такая же проблема со мной, как и @AshishKhurange. Я делаю то же самое на 100% - person Killer; 21.04.2019
comment
@AshishKhurange: Вы нашли решение? Я столкнулся с той же проблемой - person AndroidGuy; 26.02.2020
comment
Я бы посоветовал использовать последний артефакт с версией androidx. - person Jeel Vankhede; 26.02.2020
comment
@AndroidGuy Я не нашел решения. Проверьте эту ссылку, и многие другие сталкиваются с той же проблемой, для фонового выполнения, диспетчера аварийных сигналов и даже FCM: dontkillmyapp.com/problem - person Ashish Khurange; 27.02.2020

Недавно я работал с PeriodicWorkRequest и узнал, что Workmanager все еще находится в режиме Alpha / Beta в android.arch и имеет некоторые ошибки, которые еще не исправлены. Затем я просмотрел документацию по androidX (this), где установлена ​​стабильная версия выпущен, и он работает идеально, как и ожидалось. Основная проблема заключается в том, что вам необходимо перенести свой проект на AndroidX.

Проще говоря, если вы используете "android.arch.work:work-runtime:1.x.x", то нет никаких гарантий работы на данный момент (пока у нас не будет стабильной версии). Попробуйте использовать "androidx.work:work-runtime", который определенно сработает.

Просмотрите документ для получения дополнительной информации. this и this.

ПРИМЕЧАНИЕ::

Если вы хотите перенести свой проект на AndroidX. Следуй этим шагам,

Панель инструментов Android Studio (v3.4.1) -> Рефакторинг -> Переход на AndroidX

person Rajesh Naddy    schedule 23.07.2019
comment
Спасибо за предложение. Дай мне попробовать. Скоро буду обновлять. - person Ashish Khurange; 30.07.2019