为什么 WorkManager 在我的应用程序启动后会被多次触发?

Why is WorkManager fired multiple times as soon as my app starts?

我有一个应用程序,我在其中声明了一个 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()
}
}

我希望不会调用 worker,因为我现在既没有声明任何 OneTimeWorkRequestBuilder 也没有声明任何 PeriodicWorkRequestBuilder。

抱歉,我没有足够的声誉来发表评论。

在您的测试中,您是否设置了 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;
    }
}

或者您可以 运行 在终端 window

adb shell dumpsys jobscheduler | grep -C 5 SyncWorkManagerService
adb shell dumpsys jobscheduler | grep -B 10 "Pending queue"