为啥 Firebase JobDispatcher 运行 JobService 2 次?

Posted

技术标签:

【中文标题】为啥 Firebase JobDispatcher 运行 JobService 2 次?【英文标题】:Why Firebase JobDispatcher run JobService 2 times?为什么 Firebase JobDispatcher 运行 JobService 2 次? 【发布时间】:2018-05-11 03:14:07 【问题描述】:

来自 Firebase JobDispatcher 文档Firebase JobDispatcher

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

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

Firebase JobDispacther 代码

    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;
    

原木猫

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 应该每次都增加。

感谢您的帮助

【问题讨论】:

我一直在努力解决同样的问题,但是,我使用内容 URI 作为触发器。我测试的两台设备都出现了这个问题,但如果我在模拟环境中构建应用程序,它只会运行一次。 【参考方案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):这意味着不断重复。 用 start 和 end 设置触发器 .setTrigger(Trigger.executionWindow(start, end))

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

【讨论】:

谢谢你的帮助:)【参考方案2】:

我认为它运行 2 次的原因是您的执行窗口。

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

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

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

private static int i = 0;

【讨论】:

我怎样才能永远运行我的工作服务 您知道不是来自 github 的 Firebase JobDispatcher 的任何文档,以及任何其他资源 thnx 的答案@VollyNoob 0,60 也运行了两次 TestingJob: onStartJob 测试工作: Thu Nov 30 16:25:27 GMT+05:00 2017 TestingJob: onStartJob: i = 0 TestingJob: onStartJob 测试工作: Thu 2017 年 11 月 30 日 16:25:27 GMT+05:00 TestingJob:onStartJob:i = 0 这很奇怪,对我来说它有效。抱歉,我不知道任何其他文档【参考方案3】:

您的int i 不会每次都增加。

setTrigger(Trigger.executionWindow(0, 60))

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

这种触发很重要,因为重复作业总是需要执行窗口触发。当然,如果您的工作没有重复,您不必为其设置任何触发器。

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

【讨论】:

以上是关于为啥 Firebase JobDispatcher 运行 JobService 2 次?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Jobdispatcher - 现在开始并重复

Firebase jobdispatcher 未在指定窗口内触发

在 Firebase JobDispatcher 中更改定期任务的周期?

在firebase jobdispatcher中停止JobService内的计划作业

如何在 Firebase JobDispatcher 中设置周期性任务的周期?

在 Firebase JobDispatcher 和 AlarmManager 之间进行选择时感到困惑