Google有多种工作/任务调度解决方案,例如JobScheduler和GcmTaskService.每个都有自己的优点和缺点.
最近,Google推出了一个名为"Firebase JobDispatcher"的新库.
遗憾的是,关于这个新API的知识很少.事实上,很难找到任何关于它的东西.
我发现的只有他们的公告视频和样本.但即使是他们,也没有太多关于这个API的知识.
看看之前的问题,调查和我与其他API(例如,这里)的比较,我想问一下新的API是如何工作的,并且知道在使用它时应该考虑什么:
作业是否可以使用与之相关的参数,甚至可以在需要时进行修改?他们在示例中说" 一个可选的用户提供的附加软件包.默认是一个空的Bundle. "这是吗?它可以在执行时被作业修改吗?
工作可以轻松重新安排吗?它被称为" 一个布尔值,表明作业是否应该重复 ".怎样才能选择何时重新安排?我已经尝试了样本,并选择了"Recurring",但它似乎没有再次运行,只有一次.
它可以保护与图书馆的工作(因为独特的ID)吗?
更新应用程序时是否需要格外小心(如先前的API所做的那样)?更新应用后,仍可安排作业吗?对样本进行测试,似乎在更新应用程序后作业已完全消失.可以避免吗?
RECEIVE_BOOT_COMPLETED如果我希望即使重启设备仍然可以安排作业,是否需要?样本似乎有它.
是否可以获取所有预定作业及其信息(包括参数)的列表,并能够取消特定/所有作业甚至修改它们?
在清除数据操作应用程序时,是否会删除作业?
是否有可能告诉工作它最好在一段时间内运行(例如:早上7点到8点之间)?它被提到" ExecutionWindowTrigger - 它指定了一个应该执行Job的时间窗口 ".是吗?当它错过这个窗口会发生什么?
该方法onStartJob的JobService类返回一个布尔和它的说明" 是否有剩余的更多的工作. "这是什么意思?方法的needsReschedule参数是什么jobFinished意思?它们是否相互关联?
我应该知道有什么限制吗?例如,每个函数的最小值和最大值?
android android-jobscheduler firebase-job-dispatcher gcmtaskservice
我们通过JobScheduler实现了一个Job,用于后台加载数据.这项工作每天会开一次.我们可以使用哪些工具来测试此功能(可能是ADB)?
用例是能够模拟运行作业所需的条件,或者只是说"运行此作业"作为我们自动化测试套件的一部分.
Job Scheduler在Android Marshmallow和Lollipop设备上按预期工作,但它没有运行和Nexus 5x(Android N预览版).
用于安排作业的代码
ComponentName componentName = new ComponentName(MainActivity.this, TestJobService.class.getName());
JobInfo.Builder builder;
builder = new JobInfo.Builder(JOB_ID, componentName);
builder.setPeriodic(5000);
JobInfo jobInfo;
jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobInfo = builder.build();
int jobId = jobScheduler.schedule(jobInfo);
Run Code Online (Sandbox Code Playgroud)
服务在清单中定义为:
<service android:name=".TestJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
Run Code Online (Sandbox Code Playgroud)
在Android N(预览版)上是否有任何人遇到此问题?
我有一个应用程序,其功能A应该每分钟在后台运行.功能A是应用程序应该连接到数据库,读取一些数据然后获取设备的当前位置,并根据它们检查条件,如果条件为真,它应该向用户发送状态栏通知,以便用户点击通知,将显示应用程序的用户界面并发生一些事情.
这个后台任务应该每分钟都运行一次,无论应用程序是否被使用,关闭,终止(例如facebook或Whatsapp向我们显示通知,无论它们是否在应用程序堆栈中).
现在我已经搜索并发现Android提供Job Scheduler,后台服务,AlarmManager和处理程序.
但是我读到的越多,这些陈述对我来说就越矛盾.
android background-process alarmmanager android-handler android-jobscheduler
如果我们已经有一个JobScheduler以及一些具有相同功能的漂亮的后端(AndroidJob和FirebaseJobDispatcher),为什么我们需要新的Android WorkManager?它有任何杀戮功能吗?因为我没有看到任何让我想要迁移到另一个调度程序的东西.
我使用以下代码使用Androids JobScheduler API创建和安排作业:
Log.d("hanif", "Scheduling periodic job 2 hrs with 20 mins backoff linear");
JobInfo jobInfo = new JobInfo.Builder(JOB_ID,
new ComponentName(getApplicationContext(), MyJobService.class))
.setPeriodic(TimeUnit.HOURS.toMillis(2))
.setRequiresCharging(true)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setBackoffCriteria(TimeUnit.MINUTES.toMillis(20),
JobInfo.BACKOFF_POLICY_LINEAR)
.build();
JobScheduler scheduler =
(JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
scheduler.schedule(jobInfo);
Run Code Online (Sandbox Code Playgroud)
即每2小时执行一次定期工作,如果工作失败,执行20分钟*的线性退避策略将失败.
我的工作服务代码编写如下:
public class MyJobService extends JobService {
@Override
public boolean onStartJob(JobParameters jobParameters) {
Log.d("hanif", "onStartJob");
new MyWorker(getApplicationContext(), this, jobParameters).execute();
return true;
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
Log.d("hanif", "onStopJob");
return true;
}
private static class MyWorker extends AsyncTask<Void, Void, Boolean> {
private final Context …Run Code Online (Sandbox Code Playgroud) 我想使用Lollipop上提供的新JobScheduler API,但遗憾的是它没有用于pre-Lollipop的官方端口.
但是,有GcmTaskService,它提供了非常相似的功能.
这个API很新,所以很少有地方可以查找如何使用它的信息(例如这里和这里).
我对这个新API有几个问题:
它似乎需要使用Google Play服务(此处)(除非使用Lollipop版本的Android,它将使用正常的JobScheduler).如果Google Play服务不可用,我该怎么办?
似乎即使我使用"setPersisted(true)"来执行重复任务,当我重新启动设备时,也不会再次调用该任务.怎么会?编辑:那是因为我错过了RECEIVE_BOOT_COMPLETED的许可.
如果我不使用"setRequiredNetwork",任务的默认行为是什么?是"NETWORK_STATE_ANY"吗?
该文档说一下什么是从onRunTask回来后,我可以返回任何值"RESULT_FAILURE","RESULT_RESCHEDULE","RESULT_SUCCESS"(信息的位置).似乎FAILURE和SUCCESS选项都会做同样的事情 - 从队列中删除任务.这是真的吗?如果是这样,它们之间究竟有什么区别?他们的功能不同吗?
" TaskParams " 是否仅用于任务的标记?我可以以某种方式使用API将包传递给任务吗?否则,我需要设置一个DB来存储应该传递给任务的内容,对吗?
应用程序是否可以获取任务的队列?我知道使用adb是可能的,但也可以使用API吗?
他们说(这里)每个任务都有一个长达3分钟的唤醒锁.如果任务需要更多,应该怎么做?它应该为自己获得另一个唤醒锁吗?API是否会警告唤醒锁被释放?以下是文档所说的内容:
调度程序将为您的服务保留一个PowerManager.WakeLock,但是如果您的任务没有返回,执行三分钟后,它将被视为已超时,并且将释放唤醒锁.此时重新安排任务将不起作用.如果您怀疑自己的任务运行时间超过此时间,则应明确启动自己的服务或使用其他机制; 此API旨在用于相对快速的网络操作.
他们说(这里)每次应用程序升级/替换时都会删除所有网络任务,并且在发生这种情况时会调用"onInitializeTasks",并且您可以再次重新安排它们.我该如何重新安排任务?我认为我甚至无法获得任务清单......
有可能告诉任务更喜欢白天的特定时间吗?例如,在14:00-15:00之间?
我注意到,如果您安排任务,然后强制停止和/或清除应用程序的数据,该任务仍将运行.我该如何避免这种行为?
android android-5.0-lollipop android-jobscheduler gcmtaskservice
根据文档,作业必须具有每个uid的唯一作业ID.
如果我使用第三方库也安排工作,这是否意味着我不能使用与他们相同的工作ID?如果是这样,我怎样才能避免这种碰撞?
我试图创建一个简单的JobScheduler作业,看看它是如何工作的.但我一直在运行时遇到这个异常,我无法弄明白,因为我一步一步地按照指南.
这是我的电话:
ComponentName componentName = new ComponentName(getApplicationContext(), TestService.class);
JobInfo jobInfo = new JobInfo.Builder(1, componentName).setPeriodic(300000)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY).build();
JobScheduler tm =
(JobScheduler) getApplicationContext().getSystemService(Context.JOB_SCHEDULER_SERVICE);
tm.schedule(jobInfo);
Run Code Online (Sandbox Code Playgroud)
TestService不执行任何操作,然后扩展JobService.
我正在使用JobScheduler来安排工作.主要是我将它用于该.setRequiredNetworkType()方法,该方法允许您指定在建立网络连接(或更具体地说是未计量连接)时只希望调度作业.
我正在使用以下相当简单的代码来安排我的工作:
PersistableBundle extras = new PersistableBundle();
extras.putInt("anExtraInt", someInt);
int networkConstraint = useUnmetered ? JobInfo.NETWORK_TYPE_UNMETERED : JobInfo.NETWORK_TYPE_ANY;
ComponentName componentName = new ComponentName(context, MyJobService.class);
JobInfo jobInfo = new JobInfo.Builder(jobId, componentName)
.setRequiredNetworkType(networkConstraint)
.setExtras(extras)
.build();
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(jobInfo);
Run Code Online (Sandbox Code Playgroud)
因此,调度只有一个约束:网络连接(可以是"任何"或"未计量").
如何指定满足所有约束的最大延迟,以及实际运行作业,例如"在网络连接的2秒内运行作业"?
问题
我发现,在某些设备上,如果在已经满足网络约束的时间段内安排作业,则作业将立即运行(或者足够快以便用户感知到).
但是在其他设备上,即使已经有合适的网络连接(这样作业可以立即运行),在实际运行之前会有很长的延迟.因此,如果这是对用户操作的响应,那么就会发现没有任何事情发生并且应用程序已损坏.
现在,我很清楚这可能是JobScheduler...... 的意图是由系统来安排工作以最好地适应其他需求,并且无法保证在所有约束条件下作业将立即运行很满意.
但是如果需要的话,能够对它进行一些控制会很好.因此,对于按计划进行的工作,在没有用户参与的情况下,让系统完全控制精确计时是好的和良好的.
但是在作业响应用户操作的地方,我希望工作能够毫不拖延地运行......假设网络连接存在.(如果没有连接,则可以显示一条消息,指示在恢复网络连接时将执行操作,JobScheduler然后在网络恢复时确保作业运行.)
setOverrideDeadline()不是解决方案?
我可以看到它JobInfo.Builder确实有一种setOverrideDeadline()方法,这几乎就是我想要的.但是,这指定了从安排作业开始的最大延迟(即,即使不满足所有约束,也在10秒内运行作业),而不是从满足所有约束的时间开始(即在所有约束条件下运行作业)约束得到满足).
编辑:并且似乎有一个恼人的错误,可能导致作业在使用时运行两次setOverrideDeadline():请参阅此处和此处.
那么Firebase JobDispatcher呢? …