Android JobScheduler 作业不是 运行
Android JobScheduler job not running
我的混合 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()
,我按预期收到了 "Job Created and Scheduled" 通知。
从那时起,我预计会收到 Handled It! 上面 Handler
的通知,间隔大约为 30 秒。偶尔会出现一条通知,但是从应用程序启动开始计算的时间完全是任意的,并且没有义务重复。显然,我在这里做错了什么。
Android 文档可以更好地提到 最小间隔 允许 周期性作业是 900,000 毫秒 ,即
15 minutes !!!!
我了解到,在 API 24 (Nogat) 之前,可以使用更小的间隔,但现在不行了。小心你会在那里找到的各种 JobScheduler 教程。有很多已经过时了,Android 乔布斯似乎仍在发展 API。
我自己最初使用 AlarmManager
的原因是为了在应用程序处于后台运行时启用后台任务。然而,随着打瞌睡模式的到来,这个策略失败了,因为当设备打瞌睡时,应用程序根本不会收到广播消息。
改为考虑以下策略
- 当应用程序处于前台时,您可以非常简单地使用 Handler 来管理周期性任务 - 即使是那些以几秒为间隔发生的任务。
- 当 phone 正在打瞌睡时,任何普通应用程序都不应该以该频率(每隔几秒)执行后台任务 - 当需要时,有一条通过应用程序特定请求的路线免于电池优化。在这种情况下,一个周期为 15 分钟的周期性 JobScheduler 是您能做的最好的。
我的混合 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()
,我按预期收到了 "Job Created and Scheduled" 通知。
从那时起,我预计会收到 Handled It! 上面 Handler
的通知,间隔大约为 30 秒。偶尔会出现一条通知,但是从应用程序启动开始计算的时间完全是任意的,并且没有义务重复。显然,我在这里做错了什么。
Android 文档可以更好地提到 最小间隔 允许 周期性作业是 900,000 毫秒 ,即
15 minutes !!!!
我了解到,在 API 24 (Nogat) 之前,可以使用更小的间隔,但现在不行了。小心你会在那里找到的各种 JobScheduler 教程。有很多已经过时了,Android 乔布斯似乎仍在发展 API。
我自己最初使用 AlarmManager
的原因是为了在应用程序处于后台运行时启用后台任务。然而,随着打瞌睡模式的到来,这个策略失败了,因为当设备打瞌睡时,应用程序根本不会收到广播消息。
改为考虑以下策略
- 当应用程序处于前台时,您可以非常简单地使用 Handler 来管理周期性任务 - 即使是那些以几秒为间隔发生的任务。
- 当 phone 正在打瞌睡时,任何普通应用程序都不应该以该频率(每隔几秒)执行后台任务 - 当需要时,有一条通过应用程序特定请求的路线免于电池优化。在这种情况下,一个周期为 15 分钟的周期性 JobScheduler 是您能做的最好的。