Я реализовал ClearCacheWorker с помощью WorkManager для обработки фоновых задач, когда приложение закрыто. Я планирую этого работника в методе onDestroy следующим образом:
Код: Выделить всё
@Override
protected void onDestroy() {
Log.d("MainActivity", "onDestroy called");
ClearCacheScheduler.scheduleClearCache(this);
super.onDestroy();
}
Код: Выделить всё
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)
}
}
Код: Выделить всё
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
Мобильная версия