【发布时间】:2018-02-21 10:05:57
【问题描述】:
我的混合 Cordova Android 应用程序使用一个自定义插件,我每隔大约 30 分钟在该插件中执行大量后台工作。到目前为止,我一直在使用 AlarmManger 和 setInexact 警报来执行工作。我对该路线唯一真正的问题是警报无法在重新启动后继续存在。鉴于我现在只支持 Android 6 (API 23)+ 设备,我现在正在尝试用 JobScheduler 替换 AlarmManager。到目前为止,我的努力如下所示
public class UnyService extends JobService
{
@Override
public boolean onStartJob(JobParameters params)
{
UnyHandler.sendMessage(Message.obtain(UnyHandler,1,params));
return true;
}
@Override
public boolean onStopJob(JobParameters params)
{
UnyHandler.removeMessages(1);
return false;
}
我使用Handler 来执行实际工作。 Handler 的代码如下所示
private Handler UnyHandler = new Handler(new Handler.Callback()
{
@Override
public boolean handleMessage(Message msg)
{
Feedback.postBackInfo("Handled it!");
jobFinished((JobParameters)msg.obj,false);
return true;
}
});
然后我使用以下代码启动并运行该作业
private void launchTimerJob()
{
timerJob =
(JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo.Builder builder = new JobInfo.Builder(1,new
ComponentName(Utils.packName,UnyService.class.getName()));
builder.setPeriodic(30000);
builder.setPersisted(true);
builder.setBackoffCriteria(30000,JobInfo.BACKOFF_POLICY_LINEAR);
if (0 >= timerJob.schedule(builder.build()))
Feedback.postBackInfo("Job Build Error");
else Feedback.postBackInfo("Job Created and Scheduled");
}
Feedback 和 Utils 是我的应用程序中提供支持服务的其他类。为了促进测试,我使用了相对较短的 30 秒时间。
当我安装并启动应用程序时,插件初始化代码会调用launchTimerJob(),我会按预期收到“已创建和计划的作业”通知。
从那时起,我预计每隔大约 30 秒就会收到来自上述Handler 的已处理!通知。在奇怪的情况下会出现通知,但从应用程序启动开始测量的时间完全是任意的,并且没有义务重复。显然,我在这里做错了什么。
【问题讨论】:
标签: android-6.0-marshmallow job-scheduling