Обратный вызов 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" />
Добавьте эти разрешения в ваш файл манифеста, это может работать.