Почему мой рабочий WorkManager не запускается в onDestroy?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему мой рабочий WorkManager не запускается в onDestroy?

Сообщение Anonymous »

У меня возникла проблема с запуском работника WorkManager из метода onDestroy моего MainActivity. Вот сценарий:
Я реализовал ClearCacheWorker с помощью WorkManager для обработки фоновых задач, когда приложение закрыто. Я планирую этого работника в методе onDestroy следующим образом:

Код: Выделить всё

@Override
protected void onDestroy() {
Log.d("MainActivity", "onDestroy called");
ClearCacheScheduler.scheduleClearCache(this);
super.onDestroy();
}
ClearCacheScheduler выглядит следующим образом:

Код: Выделить всё

public class ClearCacheScheduler {
public static void scheduleClearCache(Context context) {
Log.d("ClearCacheScheduler", "scheduleClearCache called");

OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(ClearCacheWorker.class)

.setInitialDelay(0, TimeUnit.SECONDS)
.addTag("clear_cache")
.build();

WorkManager.getInstance(context).enqueue(request)
}
}
Однако, когда я закрываю приложение, вызывается метод onDestroy (проверяется журналами), но функция doWork() ClearCacheWorker никогда не запускается. Вот моя рабочая реализация:

Код: Выделить всё

public class ClearCacheWorker extends Worker {
private static final String TAG = "ClearCacheWorker";

public ClearCacheWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}

@NonNull
@Override
public Result doWork() {
Log.d(TAG, "doWork()");

try {
Thread.sleep(500); // Simulate delay
} catch (InterruptedException e) {
Log.d(TAG, "doWork() interrupted");
return Result.success();
}

if (isAppInForeground(getApplicationContext())) {
Log.d(TAG, "doWork() App is in foreground");
return Result.success();
}

Log.d(TAG, "doWork() App is in background");
Intent intent = new Intent(getApplicationContext(), ClearCacheService.class);
intent.putExtras(new android.os.Bundle());
getApplicationContext().startService(intent);

return Result.success();
}

private boolean isAppInForeground(Context context) {
android.app.ActivityManager activityManager =
(android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
java.util.List processes =
activityManager.getRunningAppProcesses();
if (processes != null) {
for (android.app.ActivityManager.RunningAppProcessInfo processInfo : processes) {
if (processInfo.importance ==
android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
&& processInfo.processName.equals(context.getPackageName())) {
Log.d(TAG, "doWork() App in foreground");
return true;
}
}
}
Log.d(TAG, "doWork() App in background");
return false;
}
}
Я проверил это:
  • Метод onDestroy правильно регистрируется, когда приложение закрывается.< /p>
  • Метод ScheduleClearCache запускается
Вопросы:
  • Есть ли причина, почему WorkManager не запускает работника при вызове из onDestroy?
  • Может ли это быть связано с тем, что процесс приложения завершается до того, как WorkManager сможет поставить в очередь или выполнить работу?

    Будет ли планирование рабочего процесса в onStop или другом методе жизненного цикла более надежным?
Будем очень признательны за любые идеи и предложения!
Заранее благодарим за помощь!

Подробнее здесь: https://stackoverflow.com/questions/793 ... -ondestroy
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»