只要有可用的网络,Job Scheduler就会运行作业?

时间:2017-03-06 23:41:33

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

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

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

这是日程安排代码

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() );

2 个答案:

答案 0 :(得分:0)

最简单的解决方案是使用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
)

由于新的background service limitations

,广播解决​​方案无法运行,至少在Android 8中无效

答案 1 :(得分:-1)

过时的答案

您可以注册this来监听网络上的更改(可用/不可用),然后执行您的任务或安排BroadcastReceiver

的工作

您必须向JobScheduler添加CONNECTIVITY_ACTION过滤条,如下所示:

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
        }
    }
}