为什么 Firebase JobDispatcher 运行 JobService 2 次?

Why Firebase JobDispatcher run JobService 2 times?

来自 Firebase JobDispatcher 文档 Firebase JobDispatcher

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

但是为什么我的服务运行两次

Firebase JobDispacter 代码

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

测试class(工作服务)

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

日志猫

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>

我可以再次使用我的工作服务吗?意味着 int i 应该每次都递增。

感谢您的帮助

我认为它运行2次的原因是你的执行window。

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

只有1秒window。 尝试使用更宽的间隔,例如 (0, 60),应该可以解决问题。

要回答关于变量 i 的其他问题,您必须将其设为静态:

private static int i = 0;

你的int i不会每次都递增。

setTrigger(Trigger.executionWindow(0, 60))

而这个 JobTrigger 将确定创建的 Job 现在可以执行了。您指定了 0 到 1 秒的执行 window。这就是为什么你的工作每秒都在触发。

这个触发很重要,因为重复作业总是需要执行 window 触发器。当然,如果你的工作不是经常性的,你就不用设置任何触发器。

您的第一个参数是两个作业之间的间隔时间(以秒为单位),第二个参数是间隔时间 + 以秒为单位的同步弹性时间。

我认为我们应该知道一些方法

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)) :

.setReplaceCurrent(false) :这意味着不要覆盖具有相同标签的现有作业。