【问题标题】:Job Scheduler run job whenever there is available network?只要有可用网络,作业计划程序就运行作业?
【发布时间】:2017-03-06 23:41:33
【问题描述】:

我正在使用下面的代码来安排一个作业在有互联网时运行,但它只运行一次,我希望它在有可用网络时运行。这可能吗?

我尝试使作业周期性并添加网络约束,认为只要经过一段时间,它就会休眠和唤醒并检查可用网络,如果有可用网络,则它将执行作业,否则它将返回进入睡眠模式,但我没有得到想要的行为,因为只要周期结束,作业就会一直运行(好像没有网络限制)

这是调度代码

mJobScheduler = (JobScheduler)
                getSystemService( Context.JOB_SCHEDULER_SERVICE );

        JobInfo.Builder builder = new JobInfo.Builder( 1,
                new ComponentName( getPackageName(),
                        JobSchedulerService.class.getName() ) );

       // builder.setPeriodic( 3000 );

        builder.setPersisted(true);
        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
        mJobScheduler.schedule( builder.build() );

【问题讨论】:

    标签: android android-5.0-lollipop job-scheduling periodic-task android-jobscheduler


    【解决方案1】:

    最简单的解决方案是使用 Firebase 调度程序及其 API,就像在他们的 README 上报告的那样,使用正确的 Constraint(我猜值可能是 ON_ANY_NETWORK)

     .setConstraints(
        // only run on an unmetered network
        Constraint.ON_UNMETERED_NETWORK,
        // only run when the device is charging
        Constraint.DEVICE_CHARGING
    )
    

    广播解决方案无法使用,至少在 Android 8 中无法使用,因为新的background service limitations

    【讨论】:

      【解决方案2】:

      过时的答案

      您可以注册BroadcastReceiver 来监听网络上的变化(可用/不可用),然后使用JobScheduler 执行您的任务或安排一个作业

      您必须像这样将CONNECTIVITY_ACTION 过滤器添加到您的BroadcastReceiver

      IntentFilter filter = new IntentFilter();
      filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
      getActivity().registerReceiver(networkStateReceiver, filter);
      

      然后实现你的BroadcastReceiver 类似的东西:

      @Override
      public void onReceive(Context context, Intent intent)
      {
          if (intent != null && intent.getExtras() != null)
          {             
              ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
              NetworkInfo ni = manager.getActiveNetworkInfo();
      
              if (ni != null && ni.getState() == NetworkInfo.State.CONNECTED)
              {
                  // conected
              }
              else if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE))
              {
                  // not connected
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2010-09-12
        • 1970-01-01
        • 2018-02-28
        • 2015-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多