У меня есть приложение, в котором я объявил WorkManager, и переопределенная функция doWork() вызывается 3 или 4 раза, как только мое приложение запускается, не запрашивая, чтобы система запускала его в любое время в коде...
Я проверил, чтобы в приложении не было ссылки на WorkManager. В файле App.kt есть только один (который расширяет Application()).
В App.kt:
class App : Application(){
companion object {
var appSyncRepository = AppSyncRepository()
}
}
В AppSyncRepository.kt:
class AppSyncRepository {
}
class AppSyncRepositoryWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
override fun doWork(): Result {
return Result.success()
}
}
Я ожидаю, что рабочий процесс не будет вызван, потому что я пока не объявлял ни OneTimeWorkRequestBuilder, ни PeriodicWorkRequestBuilder.
Нет, я не добавлял никакого кода ни с PeriodicWorkRequestBuilder, ни с OneTimeWorkRequestBuilder.
Я думаю, что Санлок Ли верен после анализа этого вопроса (несколько месяцев назад), и, если я хорошо помню, то, что вы написали, является объяснением.
Извините, у меня недостаточно репутации, чтобы комментировать.
В своем тестировании вы установили запрос PeriodicWorkRequestBuilder? Если это так, вы должны отменить его.
В качестве первого шага я бы проверил, что запланировано.
void cancelJob(){
WorkManager.getInstance(mContext).cancelAllWorkByTag(SYNC_WORK_JOB1);
WorkManager.getInstance(mContext).cancelAllWork();
Log.d(TAG, "Job cancelled!");
}
private boolean isWorkScheduled() {
WorkManager instance = WorkManager.getInstance(mContext);
ListenableFuture<List<WorkInfo>> statuses = instance.getWorkInfosByTag(SYNC_WORK_JOB1);
try {
boolean running = false;
List<WorkInfo> workInfoList = statuses.get();
for (WorkInfo workInfo : workInfoList) {
WorkInfo.State state = workInfo.getState();
running = state == WorkInfo.State.RUNNING | state == WorkInfo.State.ENQUEUED;
}
return running;
} catch (ExecutionException e) {
e.printStackTrace();
return false;
} catch (InterruptedException e) {
e.printStackTrace();
return false;
}
}
Или вы можете запустить в окне терминала
adb shell dumpsys jobscheduler | grep -C 5 SyncWorkManagerService
adb shell dumpsys jobscheduler | grep -B 10 "Pending queue"
Что такое SyncWorkManagerService?
Были ли у вас когда-нибудь
PeriodicWorkRequestв вашем приложении? Даже если вы удалитеPeriodicWorkRequestи переустановите свое приложение,PeriodicWorkRequest, которое вы уже поставили в очередь, не будет уничтожено, если вы не отмените его. Вся ваша периодическая работа будет вызываться при запуске процесса приложения. Кроме того, кажется, что несколько запросов одного и того же задания поставлены в очередь. ИспользуйтеenqueueUniquePeriodicWork, чтобы избежать дублирования работ.