使用Evernote android-job库时应用启动后任务自动执行问题求助
兄弟我太懂你这情况了!之前用android-job的时候也踩过这个一模一样的坑——明明没调用调度方法,任务却自己跑起来了,查了半天才搞明白到底咋回事。
问题根源
android-job库默认会把已调度的任务持久化到SharedPreferences里,哪怕你重启应用、杀死进程,只要之前成功调度过任务且没主动取消,JobManager在初始化的时候就会自动恢复这些任务并触发执行。你大概率是之前测试的时候调用过scheduleJobPeriodically(),后来把调用代码去掉了,但遗留的持久化任务还存在本地存储里,所以应用一启动就自动触发了。
解决步骤
1. 先确认是否有残留任务
在Application的JobManager初始化后,加一段代码排查是否有遗留的持久化任务:
// 在JobManager.create(this).addJobCreator(MyJobCreator())之后添加 val allJobs = JobManager.instance().allJobRequests allJobs.forEach { Timber.d("残留任务:tag=${it.tag}, id=${it.id}") }
如果输出里能看到你的JOB_TAG任务,那就是残留的持久化任务在搞鬼。
2. 清除残留任务(开发阶段专用)
如果是开发测试阶段,直接在初始化JobManager后清空所有任务:
JobManager.create(this).apply { addJobCreator(MyJobCreator()) // 清空所有遗留任务,上线前记得去掉这行! cancelAll() }
这样就能一次性清除所有之前持久化的任务,之后只有显式调用scheduleJobPeriodically()才会调度任务。
3. 配置任务不自动持久化(推荐长期方案)
如果你希望任务只有在显式调用调度时才生效,应用重启后不会自动恢复,就在构建JobRequest的时候加上setPersisted(false):
fun scheduleJobPeriodically(ms: Long) { if (jobRequested()) { cancelJob() } jobId = JobRequest.Builder("JOB_TAG") .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED) .setPeriodic(ms, TimeUnit.MINUTES.toMillis(5)) .setRequirementsEnforced(true) // 关键配置:设置为false,任务不会被持久化,重启后不会自动恢复 .setPersisted(false) .build() .schedule() }
这个配置是长期有效的,之后哪怕你调用了调度,应用重启后也不会自动恢复任务,必须再次显式调用scheduleJobPeriodically()才会生效。
4. 检查代码历史
再回想下之前有没有在某个地方调用过scheduleJobPeriodically(),比如测试按钮、启动页逻辑里,如果有的话,确保那些调用已经彻底移除,避免后续再触发不必要的调度。
内容的提问来源于stack exchange,提问作者Maurice

