1

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

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

这是调度代码

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

2 回答 2

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
)

由于新的后台服务限制,广播解决​​方案无法运行,至少在 Android 8 中无法运行

于 2018-04-13T09:47:51.790 回答
-1

过时的答案

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

您必须向BroadcastReceiver添加一个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
        }
    }
}
于 2017-10-05T09:09:10.577 回答