自Android 8更改以来,我在设置定期工作中遇到各种问题。我选择使用Firebase调度程序,因为它的Lifetime.FOREVER
听起来很有希望。我的工作下载了k个JSON数据并定期存储,时间并不是那么重要。这是我创建作业的代码:
dispatcher.newJobBuilder()
.setService(MPWService.class)
.setTag("mpw-updater")
.setRecurring(true)
.setLifetime(Lifetime.FOREVER)
.setTrigger(periodicTrigger(intervalMsec, (intervalMsec/100)*10))
.setReplaceCurrent(true)
// retry with exponential backoff
//.setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
.setExtras(myExtrasBundle)
.build();
它几乎可以按预期工作,根据
intervalMsec
每30分钟左右安排一次。但是,如果长时间不使用应用程序(不再有通过全局接收器重新安排作业的方式)或设备重新启动,则将不再安排作业。用于调度作业的代码位于Activity的onCreate方法中:
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
Job myJob = MPWService.getJobUpdate(prefs, dispatcher);
dispatcher.schedule(myJob);
我尝试使用
adb shell dumpsys activity service GcmService | grep mystuff
调试服务,但出现了我的问题 (scheduled) it.angelic.mpw/com.firebase.jobdispatcher.GooglePlayReceiver{u=0 tag="mpw-updater"
trigger=window{start=1620s,end=1800s,earliest=1612s,latest=1792s} requirements=[NET_ANY] attributes=[RECURRING] scheduled=-7s last_run=N/A jid=N/A status=PENDING retries=0 client_lib=FIREBASE_JOB_DISPATCHER-1}
(finished) [it.angelic.mpw/com.firebase.jobdispatcher.GooglePlayReceiver:mpw-updater,u0]
我的问题:
为什么last_run = N / A?我很确定我总是以
jobFinished()
调用结束服务执行。为什么我的工作的属性标记为[RECURRING]而不是我期望的[PERSISTED,RECURRING]?
earliest=1612s,latest=1792s
是什么意思? 最佳答案
好吧,不久发现.setLifetime(Lifetime.FOREVER)
需要:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
在清单中。请参阅问题1和3,谢谢