Обратный вызов WorkManager doWork не получен в Redmi и других пользовательских китайских ПЗУ после перезагрузки устройства и принудительного закрытия приложения.

Мое приложение не получает push-уведомлений в телефонах Redmi, пока приложение находится в фоновом режиме или оно было убито смахиванием.

Поэтому я пытаюсь разбудить телефон с помощью WorkManager, который работает на многих телефонах, кроме Redmi и других китайских телефонов с ПЗУ.

Вот мой код рабочего класса

public class OpenTalkWorkManager extends Worker {

@NonNull
@Override
public Result doWork() {

    Log.i("wake_up", "Waking up now: " + System.currentTimeMillis());

    FirebaseUtils.getInstance().updateUserPresenceStatus(getApplicationContext(), "yes");

    Intent intent = new Intent("com.opentalk.WAKE_UP");
    getApplicationContext().sendBroadcast(intent);

    return Result.SUCCESS;
}

Я пытаюсь поставить работу в очередь через PeriodicWorkRequest

PeriodicWorkRequest.Builder mPeriodicWorkRequest = new PeriodicWorkRequest.Builder(OpenTalkWorkManager.class, 4, TimeUnit.MINUTES);
    Constraints myConstraints = new Constraints.Builder()
            .setRequiresBatteryNotLow(false)
            .setRequiredNetworkType(NetworkType.NOT_REQUIRED)
            .setRequiresCharging(false)
            .setRequiresDeviceIdle(false)
            .setRequiresStorageNotLow(false)

            // Many other constraints are available, see the
            // Constraints.Builder reference
            .build();
    PeriodicWorkRequest myWork = mPeriodicWorkRequest.setConstraints(myConstraints).build();

    UUID compressionWorkId = myWork.getId();
    WorkManager.getInstance().cancelWorkById(compressionWorkId);

    WorkManager.getInstance().enqueue(myWork);

1 ответ

Решение

Какая версия WorkManager ты используешь? Мы исправили несколько ошибок в отношении PeriodicWork и принудительная остановка приложений в alpha05, alpha06 отсутствует, и я рекомендую попробовать его. Если проблема не исчезла, сообщите о проблемном трекере с помощью воспроизводимого контрольного примера на трекере проблем.

WorkManager API будет хорошо работать, как это задокументировано на устройствах Android Stock или в эмуляторе. Настроенные ПЗУ, такие как Xiaomi, Vivo и т. Д., Имеют параметр экономии заряда батареи, установленный по умолчанию на "оптимизированный", и не позволяют использовать WorkManager API, как ожидалось. Установите для параметра Battery Saver значение "без ограничений", и ваш WorkManager выполнит задачу.

Я использую версию 1.0.1, и она хорошо работает с устройствами Xiaomi после внесения вышеуказанных изменений для режима экономии заряда батареи.

Также обратите внимание на то, что Xiaomi, Vivo, Oppo и huawei по умолчанию ограничивают фоновые службы. После применения этого решения мой WorkManager также начал работать.

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <uses-permission android:name="android.permission.WAKE_LOCK" />

Добавьте эти разрешения в ваш файл манифеста, это может работать.

Другие вопросы по тегам