Почему Firebase JobDispatcher запускает JobService 2 раза?

Как из Firebase JobDispatcher Documentation Firebase JobDispatcher

setTrigger(Trigger.executionWindow(0, 60))
// start between 0 and 60 seconds

, но почему мой сеанс работает два раза

Firebase JobDispacther Code

    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
    Job job = dispatcher.newJobBuilder()
            .setTag("testing job")
            .setService(TestingJob.class)
            .setReplaceCurrent(true)
            .setRecurring(true)
            .setTrigger(Trigger.executionWindow(0,1))
            .setConstraints(Constraint.ON_ANY_NETWORK)
            .setLifetime(Lifetime.FOREVER)
            .build();

    dispatcher.mustSchedule(job);

Класс тестирования (служба работы)

public class TestingJob extends JobService {

    private static final String TAG = "TestingJob";
    private int i =0;
    @Override
    public boolean onStartJob(JobParameters job) {

        Log.d(TAG, "onStartJob Testing Job: "+new Date().toString());
        Log.d(TAG, "onStartJob: i = "+String.valueOf(i));
        i+=1;
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters job) {

        Log.d(TAG, "onStopJob Testing Job: Stopped");
        return false;
    }
}

Журнал Cat

11-28 00:08:57.666 11793-11793: onStartJob Testing Job: Tue Nov 28 00:08:57 GMT+05:00 2017
11-28 00:08:57.666 11793-11793: onStartJob: i = 0
11-28 00:08:57.791 11793-11793: onStartJob Testing Job: Tue Nov 28 00:08:57 GMT+05:00 2017
11-28 00:08:57.791 11793-11793: onStartJob: i = 0

манифеста

   <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <service android:name=".services.TestingJob"
            android:exported="false">
        <intent-filter>
            <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
        </intent-filter>
    </service>

Могу ли я использовать сервис Job Service снова, значение int i должно увеличиваться каждый раз.

Thnx для вашей помощи

Ответ 1

Я думаю, что какой-то метод мы должны знать об этом

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
    Job job = dispatcher.newJobBuilder()
            .setTag("testing job")
            .setService(TestingJob.class)
            .setReplaceCurrent(true)
            .setRecurring(true)
            .setTrigger(Trigger.executionWindow(0,1))
            .setConstraints(Constraint.ON_ANY_NETWORK)
            .setLifetime(Lifetime.FOREVER)
            .build();

    dispatcher.mustSchedule(job);

в этом вы установите            .setRecurring(true): это означает, что он постоянно повторяется. установить триггер с начала и конца .setTrigger(Trigger.executionWindow(start, end)):

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

end: известно как windowEnd, последнее время (в секундах) задание должно выполняться в идеальном мире. Вычисляется так же, как windowStart.

.setReplaceCurrent(false): это означает, что вы не перезаписываете существующее задание тем же тегом.

Надеюсь, это поможет вам!

Ответ 2

Я думаю, что причина, по которой он работает 2 раза, - это ваше окно выполнения.

.setTrigger(Trigger.executionWindow(0,1))

Существует только 1-секундное окно времени. Попробуйте более широкий интервал, например (0, 60), который должен сделать трюк.

Чтобы ответить на другой вопрос о вашей переменной i, вы должны сделать ее статической:

private static int i = 0;

Ответ 3

Ваш int i не будет увеличиваться каждый раз.

setTrigger(Trigger.executionWindow(0, 60))

И этот JobTrigger определит, что созданное задание теперь готово к выполнению. Вы указали окно выполнения от 0 до 1 секунды. Вот почему ваша работа запускается каждую секунду.

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

Ваш первый параметр - это интервал времени в секундах между 2 заданиями, а вторым параметром является интервал времени + синхронизированный флексимум в секундах.