JobScheduler调用时机咨询:每日僵尸生成任务方法需单次还是启动即调用?
关于JobScheduler调度任务的调用时机问题
嘿,这个问题问得很关键!你的startZombieSpawnService方法只需要调用一次就够了,不用每次应用启动都跑一遍~
核心原因:JobScheduler的任务是系统持久化的
当你调用jobScheduler.schedule()方法提交任务后,Android系统会把这个任务的配置(比如执行间隔、触发条件)持久化存储起来。只要任务没有被主动取消、执行完成,或者没有因为系统限制被移除,系统就会自动按照你设置的intervaloDeRepeticao(也就是每天一次)来触发任务——哪怕你的应用被后台杀死,甚至设备重启(这里有个前提,后面会说)。
几个必须注意的细节
设备重启后的任务存活
你的代码里目前没加setPersisted(true),如果希望设备重启后任务还能继续执行,一定要在JobInfo.Builder里补上这个配置:new JobInfo.Builder(1, new ComponentName(context, ZombieSpawnJobService.class)) .setPeriodic(intervaloDeRepeticao) .setPersisted(true) // 加上这行,设备重启后任务会被恢复 .build();如果没加这个,设备重启后任务就会丢失,这时候可能需要在应用启动时重新调度,但加了之后就完全不用操心了。
避免重复调度的小技巧
虽然重复调用schedule()(用同一个Job ID)会直接覆盖旧任务,不会造成冲突,但没必要做无用功。你可以加个方法先检查任务是否已经在调度中:public static boolean isJobAlreadyScheduled(Context context, int jobId) { JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); for (JobInfo pendingJob : jobScheduler.getAllPendingJobs()) { if (pendingJob.getId() == jobId) { return true; } } return false; }然后在应用启动的地方(比如
Application的onCreate())做个判断:if (!isJobAlreadyScheduled(this, 1)) { startZombieSpawnService(this); }这样既能保证任务存在,又不会重复提交。
任务被意外取消的情况
如果任务因为某些原因被系统取消(比如应用被卸载、用户强制停止应用,或者任务连续执行失败次数过多),这时候任务会从系统的调度列表里消失。这种情况下,你可以在应用启动时通过上面的检查方法,重新触发调度,确保任务恢复。
总结
- 正常场景下,
startZombieSpawnService只需要调用一次; - 加上
setPersisted(true)确保设备重启后任务不丢失; - 可选在应用启动时检查任务状态,避免意外丢失后无法自动恢复。
内容的提问来源于stack exchange,提问作者Sila Siebert
相关产品推荐
相关产品推荐

