WiFi连接Android上的触发器

WiFi连接Android上的触发器,android,triggers,wifi,jobs,firebase-job-dispatcher,Android,Triggers,Wifi,Jobs,Firebase Job Dispatcher,背景信息 所以我创建了一个应用程序,它主要由服务支持的通知控制。当用户断开与特定WiFi网络的连接时,此通知将消失,并且必须在用户回到家并连接到WiFi网络时出现。在Android O之前,我只是让服务在后台运行。该服务绑定到一个广播接收器,该接收器会在WiFi连接和断开时通知该服务。然后,服务将根据这些变化采取行动 突破性变化 现在我们有了有背景限制的Android Oreo。因此,为了节省一些电池,我将应用程序更改为在WiFi断开时停止服务,并启动Firebase Jobdispatcher

背景信息

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

突破性变化

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

问题

我希望在手机连接到WiFi网络时立即执行该任务,而无需运行服务。我知道这是可能的,因为我最近在谷歌翻译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);

这项工作做得很好。当手机连接到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);
}

有人有答案吗?编辑:有时候是有效的,但我真的需要一个一直有效的解决方案。就像YouTube应用程序一样,每当我回到家有人在电视上播放流媒体时,我都会收到一条通知,让我知道有人正在播放流媒体,而且它一直都在工作。他们是怎么做到的?有什么消息吗?当用户连接到特定的WIFI时,我正处于一种非常相似的情况,但幸运的是,没有。可能YouTube应用程序在Android中有一些特殊权限。我仍然没有一个可靠的方法来做到这一点。我是按照@commonware的建议工作的是的,这就是我现在向用户提供的,仅次于不太可靠的Android Worker。