【问题标题】:FirebaseJobDispatcher run on network changeFirebaseJobDispatcher 在网络更改时运行
【发布时间】:2017-09-14 10:03:29
【问题描述】:

我有点不确定FirebaseJobDispatcher (JobScheduler) 应该如何工作。当用户失去互联网连接然后再次连接以使我的应用程序运行并进行同步以在重新连接时检查内容更新时,我想要它做什么。

我知道我们不应该使用连接更改广播侦听器并使用 JobScheduler,但似乎 JobScheduler 更像是一个更智能的 AlarmManager,即使没有连接更改(我不需要)它也会在其中运行。

是这种情况还是我误解了它的工作原理?如果不是,是否只有在用户重新连接互联网时才会触发?

【问题讨论】:

  • 嗨@tyczj,我们和你有同样的要求。当互联网从不可用变为可用时,我们想启动一个警报广播接收器。我们使用通过CONNECTIVITY_CHANGE 来实现这种无缝连接。但是,既然听CONNECTIVITY_CHANGE已经不管用了,如果你杀了这个应用程序,你知道如何使用FirebaseJobDispatcher吗?
  • @CheokYanCheng 工作调度程序不能这样工作,它是一个更智能的警报管理器。我现在使用推送通知,当用户重新上网时,推送通知就会进来并更新内容

标签: android android-jobscheduler firebase-job-dispatcher


【解决方案1】:

JobScheduler 是一个很好的选择,当您想要触发一些仅在满足某些前提条件(连接、电池和系统的广播)时发生的操作时。在您的情况下,安排一些仅在用户有互联网连接时发生的工作。

您可以使用JobScheduler最低 API 21 并且不需要 Google Play 服务FirebaseJobDispatcher 需要最低 API 9 和 Play 服务
此外,AndroidJob 是一个具有最低 API 14 且不需要 Play Service 的库。

这个视频可以帮助澄清FirebaseJobDispatcher 的一些疑问,另外Evernote 的这个帖子是很好的资源。

【讨论】:

    【解决方案2】:

    以下代码将在任何网络上触发,简单来说就是 Wifi 或数据网络

    Job myJob = mDispatcher.newJobBuilder()
                    .setService(MyJobService.class)
                    .setTag(JOB_TAG)
                    .setRecurring(true)
                    .setTrigger(Trigger.executionWindow(5, 5))
                    .setLifetime(Lifetime.FOREVER)
                    .setConstraints(Constraint.ON_ANY_NETWORK)
                    .setReplaceCurrent(false)
                    .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
                    .build();
    
            mDispatcher.schedule(myJob);
    

    更改为 .setConstraints(Constraint.ON_UNMETERED_NETWORK) 它将仅适用于 wifi 网络。

    删除限制,即使没有网络也可以工作

    【讨论】:

      【解决方案3】:

      JobDispatcher 的TestApp 提供了很好的示例; 虽然很普通,但可以使用 Builder 为 Dispatcher 创建 Job。刚刚在这里找到了这个answer,里面解释的比较详细。

      /* a recurring job, being triggered in the time-frame in between 59-61 seconds */
      Job.Builder builder = dispatcher
          .newJobBuilder()
          .setTag("SomeJob")
          .setService(SomeJobService.class)
          .setRecurring(true)
          .setTrigger(Trigger.executionWindow(59, 61));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多