标签: android-jobscheduler

Firebase JobDispatcher - 与以前的API(JobScheduler和GcmTaskService)相比,它是如何工作的?

背景

Google有多种工作/任务调度解决方案,例如JobSchedulerGcmTaskService.每个都有自己的优点和缺点.

最近,Google推出了一个名为"Firebase JobDispatcher"的新库.

问题

遗憾的是,关于这个新API的知识很少.事实上,很难找到任何关于它的东西.

我发现的只有他们的公告视频样本.但即使是他们,也没有太多关于这个API的知识.

问题

看看之前的问题,调查和我与其他API(例如,这里)的比较,我想问一下新的API是如何工作的,并且知道在使用它时应该考虑什么:

  1. 作业是否可以使用与之相关的参数,甚至可以在需要时进行修改?他们在示例中说" 一个可选的用户提供的附加软件包.默认是一个空的Bundle. "这是吗?它可以在执行时被作业修改吗?

  2. 工作可以轻松重新安排吗?它被称为" 一个布尔值,表明作业是否应该重复 ".怎样才能选择何时重新安排?我已经尝试了样本,并选择了"Recurring",但它似乎没有再次运行,只有一次.

  3. 它可以保护与图书馆的工作(因为独特的ID)吗?

  4. 更新应用程序时是否需要格外小心(如先前的API所做的那样)?更新应用后,仍可安排作业吗?对样本进行测试,似乎在更新应用程序后作业已完全消失.可以避免吗?

  5. RECEIVE_BOOT_COMPLETED如果我希望即使重启设备仍然可以安排作业,是否需要?样本似乎有它.

  6. 是否可以获取所有预定作业及其信息(包括参数)的列表,并能够取消特定/所有作业甚至修改它们?

  7. 在清除数据操作应用程序时,是否会删除作业?

  8. 是否有可能告诉工作它最好在一段时间内运行(例如:早上7点到8点之间)?它被提到" ExecutionWindowTrigger - 它指定了一个应该执行Job的时间窗口 ".是吗?当它错过这个窗口会发生什么?

  9. 该方法onStartJobJobService类返回一个布尔和它的说明" 是否有剩余的更多的工作. "这是什么意思?方法的needsReschedule参数是什么jobFinished意思?它们是否相互关联?

  10. 我应该知道有什么限制吗?例如,每个函数的最小值和最大值?

android android-jobscheduler firebase-job-dispatcher gcmtaskservice

70
推荐指数
1
解决办法
1万
查看次数

有哪些工具可用于测试JobScheduler?

我们通过JobScheduler实现了一个Job,用于后台加载数据.这项工作每天会开一次.我们可以使用哪些工具来测试此功能(可能是ADB)?

用例是能够模拟运行作业所需的条件,或者只是说"运行此作业"作为我们自动化测试套件的一部分.

android job-scheduling android-jobscheduler

51
推荐指数
3
解决办法
2万
查看次数

Job Scheduler未在Android N上运行

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(预览版)上是否有任何人遇到此问题?

android android-jobscheduler android-7.0-nougat

41
推荐指数
3
解决办法
3万
查看次数

Job Scheduler与后台服务

我有一个应用程序,其功能A应该每分钟在后台运行.功能A是应用程序应该连接到数据库,读取一些数据然后获取设备的当前位置,并根据它们检查条件,如果条件为真,它应该向用户发送状态栏通知,以便用户点击通知,将显示应用程序的用户界面并发生一些事情.
这个后台任务应该每分钟都运行一次,无论应用程序是否被使用,关闭,终止(例如facebook或Whatsapp向我们显示通知,无论它们是否在应用程序堆栈中).
现在我已经搜索并发现Android提供Job Scheduler,后台服务,AlarmManager处理程序.
但是我读到的越多,这些陈述对我来说就越矛盾.

  1. 关于处理程序我已经读过它们不存在长时间延迟,并将在系统重启后终止.所以它们不适合我的任务.
  2. 但是AlarmManager似乎是这个问题的一个很好的选择,因为当它被允许时,即使在系统重启后它们也存在,并且可以重新运行应用程序.但在Android文档中,Alarm Manager旨在用于必须在特定时间运行的任务(如闹钟).但我的任务必须每分钟运行一次.
  3. 然后是背景服务.这更像是我在阅读后在后台下载的任务,而不是用于我已经解释过的事情.
  4. JobScheduler似乎不适用于必须永久完成的任务,但是对于满足特定约束的任务,例如空闲或没有网络...那么您建议使用哪些(或其他如果存在)对于我在第一部分中解释的任务

android background-process alarmmanager android-handler android-jobscheduler

33
推荐指数
3
解决办法
3万
查看次数

Android WorkManager与JobScheduler

如果我们已经有一个JobScheduler以及一些具有相同功能的漂亮的后端(AndroidJobFirebaseJobDispatcher),为什么我们需要新的Android WorkManager?它有任何杀戮功能吗?因为我没有看到任何让我想要迁移到另一个调度程序的东西.

android android-jobscheduler android-workmanager

27
推荐指数
5
解决办法
1万
查看次数

Android JobScheduler执行了好几次

我使用以下代码使用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)

java android android-jobscheduler

22
推荐指数
1
解决办法
4163
查看次数

关于GcmTaskService的一些问题

背景

我想使用Lollipop上提供的新JobScheduler API,但遗憾的是它没有用于pre-Lollipop的官方端口.

但是,有GcmTaskService,它提供了非常相似的功能.

问题

这个API很新,所以很少有地方可以查找如何使用它的信息(例如这里这里).

问题

我对这个新API有几个问题:

  1. 它似乎需要使用Google Play服务(此处)(除非使用Lollipop版本的Android,它将使用正常的JobScheduler).如果Google Play服务不可用,我该怎么办?

  2. 似乎即使我使用"setPersisted(true)"来执行重复任务,当我重新启动设备时,也不会再次调用该任务.怎么会?编辑:那是因为我错过了RECEIVE_BOOT_COMPLETED的许可.

  3. 如果我不使用"setRequiredNetwork",任务的默认行为是什么?是"NETWORK_STATE_ANY"吗?

  4. 文档说一下什么是从onRunTask回来后,我可以返回任何值"RESULT_FAILURE","RESULT_RESCHEDULE","RESULT_SUCCESS"(信息的位置).似乎FAILURE和SUCCESS选项都会做同样的事情 - 从队列中删除任务.这是真的吗?如果是这样,它们之间究竟有什么区别?他们的功能不同吗?

  5. " TaskParams " 是否仅用于任务的标记?我可以以某种方式使用API​​将包传递给任务吗?否则,我需要设置一个DB来存储应该传递给任务的内容,对吗?

  6. 应用程序是否可以获取任务的队列?我知道使用adb是可能的,但也可以使用API​​吗?

  7. 他们说(这里)每个任务都有一个长达3分钟的唤醒锁.如果任务需要更多,应该怎么做?它应该为自己获得另一个唤醒锁吗?API是否会警告唤醒锁被释放?以下是文档所说的内容:

调度程序将为您的服务保留一个PowerManager.WakeLock,但是如果您的任务没有返回,执行三分钟后,它将被视为已超时,并且将释放唤醒锁.此时重新安排任务将不起作用.如果您怀疑自己的任务运行时间超过此时间,则应明确启动自己的服务或使用其他机制; 此API旨在用于相对快速的网络操作.

  1. 他们说(这里)每次应用程序升级/替换时都会删除所有网络任务,并且在发生这种情况时会调用"onInitializeTasks",并且您可以再次重新安排它们.我该如何重新安排任务?我认为我甚至无法获得任务清单......

  2. 有可能告诉任务更喜欢白天的特定时间吗?例如,在14:00-15:00之间?

  3. 我注意到,如果您安排任务,然后强制停止和/或清除应用程序的数据,该任务仍将运行.我该如何避免这种行为?

android android-5.0-lollipop android-jobscheduler gcmtaskservice

21
推荐指数
2
解决办法
6050
查看次数

JobScheduler - 如何确定唯一的作业ID?

根据文档,作业必须具有每个uid的唯一作业ID.
如果我使用第三方库也安排工作,这是否意味着我不能使用与他们相同的工作ID?如果是这样,我怎样才能避免这种碰撞?

android android-jobscheduler

21
推荐指数
1
解决办法
3618
查看次数

Android java.lang.IllegalArgumentException:没有这样的服务ComponentInfo JobScheduler

我试图创建一个简单的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.

android android-jobscheduler

19
推荐指数
1
解决办法
1万
查看次数

JobScheduler:控制从满足约束到正在运行的作业的延迟

我正在使用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秒内运行作业"?

更长版本(带有ramblings)

问题

我发现,在某些设备上,如果在已经满足网络约束的时间段内安排作业,则作业将立即运行(或者足够快以便用户感知到).

但是在其他设备上,即使已经有合适的网络连接(这样作业可以立即运行),在实际运行之前会有很长的延迟.因此,如果这是对用户操作的响应,那么就会发现没有任何事情发生并且应用程序已损坏.

现在,我很清楚这可能是JobScheduler...... 的意图是由系统来安排工作以最好地适应其他需求,并且无法保证在所有约束条件下作业将立即运行很满意.

但是如果需要的话,能够对它进行一些控制会很好.因此,对于按计划进行的工作,在没有用户参与的情况下,让系统完全控制精确计时是好的和良好的.

但是在作业响应用户操作的地方,我希望工作能够毫不拖延地运行......假设网络连接存在.(如果没有连接,则可以显示一条消息,指示在恢复网络连接时将执行操作,JobScheduler然后在网络恢复时确保作业运行.)

setOverrideDeadline()不是解决方案?

我可以看到它JobInfo.Builder确实有一种setOverrideDeadline()方法,这几乎就是我想要的.但是,这指定了从安排作业开始的最大延迟(即,即使不满足所有约束,也在10秒内运行作业),而不是从满足所有约束的时间开始(即在所有约束条件下运行作业)约束得到满足).

编辑:并且似乎有一个恼人的错误,可能导致作业在使用时运行两次setOverrideDeadline():请参阅此处此处.

那么Firebase JobDispatcher呢? …

android alarmmanager android-jobscheduler

19
推荐指数
1
解决办法
1796
查看次数