Firebase Job Dispatcher не запускается каждый раз при подключении к интернету
Ниже приведен код, который я использую для планирования работы, чтобы запускать каждый раз, когда я подключаюсь к Интернету
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
Job job = dispatcher.newJobBuilder()
//persist the task across boots
.setLifetime(Lifetime.FOREVER)
//.setLifetime(Lifetime.UNTIL_NEXT_BOOT)
//call this service when the criteria are met.
.setService(ScheduledJobService.class)
//unique id of the task
.setTag("UniqueTagForYourJob")
//don't overwrite an existing job with the same tag
.setReplaceCurrent(false)
// We are mentioning that the job is periodic.
.setRecurring(true)
// Run between 30 - 60 seconds from now.
.setTrigger(Trigger.executionWindow(3, 5))
// retry with exponential backoff
.setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)
//.setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
//Run this job only when the network is available.
.setConstraints(Constraint.ON_ANY_NETWORK)
.build();
dispatcher.mustSchedule(job);
Ниже приведен код для ScheduleJobService, который используется для запуска случайного уведомления с текущей датой (только для целей тестирования) при выполнении задания
package com.labstract.lest.wallistract;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.RingtoneManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.support.v7.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.firebase.jobdispatcher.JobParameters;
import com.firebase.jobdispatcher.JobService;
import com.labstract.lest.wallistract.FullScreenViewSlider.FullScreenActivity;
import com.labstract.lest.wallistract.GridActivities.Image;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
public class ScheduledJobService extends JobService {
@Override
public boolean onStartJob(JobParameters job) {
Log.d("ScheduledJobService", "Job called");
Toast.makeText(getApplicationContext(), "hi", Toast.LENGTH_LONG).show();
ConnectivityManager connectivity = (ConnectivityManager) getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivity.getActiveNetworkInfo();
int random = (int)(Math.random() * 50 + 1);
if (networkInfo.isConnected()) {
Date currentTime = Calendar.getInstance().getTime();
Toast.makeText(getApplicationContext(), "Connected", Toast.LENGTH_LONG).show();
NotificationCompat.Builder builders = new NotificationCompat.Builder(getApplicationContext());
Notification notifications = builders.setContentTitle("Wallistract")
.setContentText(currentTime.toString())
.setAutoCancel(true)
.setPriority(Notification.PRIORITY_HIGH)
.setSmallIcon(R.mipmap.ic_launcher)
.build();
NotificationManager notificationManagers = (NotificationManager) getSystemService(getApplicationContext().NOTIFICATION_SERVICE);
notificationManagers.notify(random, notifications);
}
return true;
}
@Override
public boolean onStopJob(JobParameters job) {
return false;
}
}
Мой вопрос: что не так в моем коде, из-за которого он не срабатывает, когда телефон подключается к Интернету каждый раз, это параметры в
.setTrigger(Trigger.executionWindow(3, 5))
или же
.setConstraints(Constraint.ON_ANY_NETWORK)
или же
любая другая вещь? Пожалуйста помоги.
1 ответ
Я не уверен, что вы используете правильный инструмент для работы. Firebase Job Dispatcher предназначен для случаев, когда вы хотите запускать задачу каждые X часов / дней, с требованиями по зарядке, интернету и т. Д.
Вы описали желание выполнять код каждый раз, когда устройство подключается к Интернету, для чего Job Dispatcher не будет работать хорошо. В качестве тривиального примера, если вы быстро подключаетесь + отключаетесь, Диспетчер заданий запускается только один раз, а затем предполагает, что его задача выполнена. Кроме того, очень короткое время, подобное тому, которое вы перечислили, ненадежно.
Альтернативный подход для вашего случая заключается в регистрации android.net.conn.CONNECTIVITY_CHANGE
широковещательный приемник в манифесте, а затем ОС уведомляется при каждом изменении состояния сети. Это гораздо надежнее и проще в реализации.
Этот ответ определяет процесс настройки приемника вещания и проверки состояния интернета в нем. Код не идеален, но это отправная точка.
Я также ранее создал пример репозитория, если вы просто хотите отслеживать состояние внутри приложения, гораздо более эффективным способом, чем связанный ответ.