Wifi状态更改(连接或断开网络)时如何触发JobScheduler?

时间:2018-01-16 08:56:01

标签: java android kotlin android-jobscheduler

我希望在连接Wifi或从某些路由器断开连接时运行一段代码。我可以使用服务和BrodcastReceiver,但是从Oreo开始,服务在应用程序关闭几分钟后被杀死(除非在前台)。所以,我正在尝试使用JobScheduler,但我无法弄清楚为执行我的Job提供了什么触发器。

2 个答案:

答案 0 :(得分:5)

Android不希望每次网络更改时都运行您的代码。这些更改可能每分钟发生几次,而您的代码会导致电池耗尽过多。

你能做的最好的事情是安排你的工作定期运行(这不能太短 - 如果你要求不到15分钟,你就不会经常得到它)并检查你需要的东西。您可以请求您的作业仅在有网络连接时运行,而不是相反(在没有连接时运行)。

答案 1 :(得分:-1)

您可以使用Firebase JobDispatcher完美地完成此任务。

开始工作的代码:

fun startNetworkChangeJob() {
    // Create a new dispatcher using the Google Play driver.
    val dispatcher = FirebaseJobDispatcher(GooglePlayDriver(app))

    val myJob = dispatcher.newJobBuilder()
            // the JobService that will be called
            .setService(NetworkChangeJob::class.java)
            // uniquely identifies the job
            .setTag(app.getString(R.string.networkChangeJobId))
            // recurring job
            .setRecurring(true)
            // don't 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)
}

然后是工作本身。在这里,您可以放置​​逻辑来确定要执行的操作:

override fun onStartJob(job: com.firebase.jobdispatcher.JobParameters): Boolean {
    // Runs on the main thread!

    checkIfNeedToStartService()

    return false  // Answers the question: "Is there still work going on?"
}

override fun onStopJob(job: com.firebase.jobdispatcher.JobParameters): Boolean {
    // Runs on the main thread!

    return true // Answers the question: "Should this job be retried?"
}

请务必在清单中添加以下内容:

<service
        android:name=".jobs.NetworkChangeJob"
        android:exported="false">
        <intent-filter>
            <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE" />
        </intent-filter>
    </service>