2

背景资料

所以我创建了一个主要由服务支持的通知控制的应用程序。当用户失去与特定 WiFi 网络的连接时,此通知会消失,并且必须在用户回到家并连接到 Wifi 网络时出现。在 Android OI 之前只是让服务在后台运行。该服务绑定到一个广播接收器,该接收器会在 WiFi 连接和断开连接时通知该服务。然后,该服务将对这些更改采取行动。

突破性的变化

现在我们有了具有背景限制的 Android Oreo。因此,为了节省一些电量,我更改了应用程序以在 WiFi 断开连接时停止服务,并启动 Firebase Jobdispatcher 作业。只要 Android 愿意,就会执行此作业。所以很可能是用户连接到 WiFi,15 分钟后作业被执行。

问题

我希望在手机连接到 WiFi 网络时立即执行这项工作,而无需运行服务。我知道这是可能的,因为我最近在 Google 翻译 Android 应用程序中看到了这种完全相同的行为。当您启用一种语言进行离线翻译时,只有在连接 WiFi 时才会下载它。即使我关闭了它的所有服务(在开发人员选项中),它也会在我连接到 WiFi 时立即做出反应。

有任何想法吗?

对于任何有兴趣的人,这是我的工作配置:

    Job myJob = mDispatcher.newJobBuilder()
            .setService(ScheduledJobService.class)
            .setTag(JOB_TAG)
            .setRecurring(true)
            .setTrigger(Trigger.executionWindow(1, 10))
            .setLifetime(Lifetime.UNTIL_NEXT_BOOT)
            .setReplaceCurrent(true)
            .setConstraints(Constraint.ON_UNMETERED_NETWORK)
            .setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)
            .build();
    mDispatcher.mustSchedule(myJob);
4

1 回答 1

0

这很好地完成了这项工作。这将在手机连接到 WiFi 时立即运行。

public void startNetworkChangeJob(){
    // Create a new dispatcher using the Google Play driver.
    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(mContext));

    Job myJob = dispatcher.newJobBuilder()
            // the JobService that will be called
            .setService(NetworkChangeJob.class)
            // uniquely identifies the job
            .setTag(mContext.getString(R.string.networkChangeJobId))
            // recurring job
            .setRecurring(true)
            // persist past a device reboot
            .setLifetime(Lifetime.FOREVER)
            // start between 0 and 60 seconds from now
            .setTrigger(Trigger.executionWindow(0, 60))
            // don't overwrite an existing job with the same tag
            .setReplaceCurrent(false)
            // retry with exponential backoff
            .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
            // constraints that need to be satisfied for the job to run
            .setConstraints(
                    // only run on an unmetered network
                    Constraint.ON_UNMETERED_NETWORK
            )
            .build();

    dispatcher.mustSchedule(myJob);
}
于 2018-08-01T09:17:59.640 回答