触发WiFi连接Android

时间:2017-10-05 11:33:19

标签: android triggers wifi jobs firebase-job-dispatcher

背景信息

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

突破性变化

现在我们有Android Oreo的背景限制。因此,为了保留一些电池,我已经更改了应用程序,以便在WiFi断开连接时停止服务,并启动Firebase Jobdispatcher作业。只要Android有这样的工作,就会执行这项工作。因此,很可能用户已连接到WiFi,15分钟后该作业将被执行。

问题

我希望在手机连接到WiFi网络时立即执行该作业,而无需运行服务。我知道它可能,因为我最近在谷歌翻译Android应用程序中看到了这种完全相同的行为。当您启用离线翻译语言时,只有在连接WiFi时才会下载。即使我关闭所有服务(在Developer选项中),当我连接到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);

1 个答案:

答案 0 :(得分: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);
}