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