Планировщик заданий запускает задание всякий раз, когда есть доступная сеть?

Я использую приведенный ниже код, чтобы запланировать выполнение задания при наличии Интернета, но оно запускается только один раз, я бы хотел, чтобы оно запускалось всякий раз, когда есть доступная сеть. Это возможно?

Я попытался сделать задание периодическим и добавить сетевое ограничение, думая, что оно будет спать и просыпаться всякий раз, когда проходит период, и проверять доступную сеть, если есть доступная сеть, тогда оно будет выполнять задание, иначе оно вернется в спящий режим. но я не получил желаемого поведения, так как задание выполняется все время, когда истекает период (как будто нет ограничения сети)

Это код расписания

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

person student93    schedule 06.03.2017    source источник


Ответы (2)


Самое простое решение — использовать планировщик 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
)

Решение Broadcast не будет работать, по крайней мере, не в Android 8, из-за нового ограничения фоновой службы

person Shine    schedule 13.04.2018

УСТАРЕВШИЙ ОТВЕТ

Вы можете зарегистрировать BroadcastReceiver, который будет прослушивать изменения в сети (доступно /unavailable), а затем выполните свою задачу или запланируйте задание с помощью 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
        }
    }
}
person Dean Koštomaj    schedule 05.10.2017