【问题标题】:Trigger on WiFi connected Android在连接 WiFi 的 Android 上触发
【发布时间】:2017-10-05 11:33:19
【问题描述】:

背景信息

所以我创建了一个主要由服务支持的通知控制的应用程序。当用户失去与特定 WiFi 网络的连接时,此通知会消失,并且必须在用户回家并连接到 Wifi 网络时出现。在 Android O 之前,我只是让服务在后台运行。该服务绑定到一个广播接收器,该接收器会在 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);

【问题讨论】:

  • 有人有答案吗?

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


【解决方案1】:

这很好地完成了这项工作。这将在手机连接到 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 SSID 时,我处于非常相似的情况尝试启动通知
  • 很遗憾没有。可能 YouTube 应用在 Android 中有一些特殊权限。我仍然没有可靠的方法来做到这一点。
  • 我按照@CommonsWare 建议的here987654321@
  • 是的,这就是我现在为用户提供的,旁边是不太可靠的 Android Worker。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2012-10-13
  • 2020-01-25
  • 1970-01-01
相关资源
最近更新 更多