如来自android开发人员JobIntentService在Android O或更高版本上运行时,该作品将通过 JobScheduler.enqueue
作为工作分派(dispatch)。在较旧版本的平台上运行时,它将使用 Context.startService
。
就我而言,我正在学习 JobIntentService
,就我而言,我有一个计时器,该计时器每秒钟运行一次并显示当前日期和时间,但是当我的应用程序被销毁时, JobIntentService
也被销毁,如何在应用程序运行时运行它被摧毁
JobIntentService
class OreoService : JobIntentService() {
private val handler = Handler()
companion object {
private const val JOB_ID = 123
fun enqueueWork(cxt: Context, intent: Intent){
enqueueWork(cxt,OreoService::class.java,JOB_ID,intent)
}
}
override fun onHandleWork(intent: Intent) {
toast(intent.getStringExtra("val"))
Timer().scheduleAtFixedRate(object : TimerTask() {
override fun run() {
println(Date().toString())
}
}, Date(),1000)
}
override fun onDestroy() {
super.onDestroy()
toast("Service Destroyed")
}
private fun toast(msg: String){
handler.post({
Toast.makeText(applicationContext,msg,Toast.LENGTH_LONG).show()
})
}
}
list
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
....... >
<service android:name=".service.OreoService"
android:permission="android.permission.BIND_JOB_SERVICE"/>
</application>
MainActivity(按下按钮即可启动服务)
startServiceBtn.setOnClickListener({
val intent = Intent()
intent.putExtra("val","testing service")
OreoService.enqueueWork(this,intent)
})
最佳答案
那不是JobIntentService
的合适用法(或者几乎其他任何事情)。
JobIntentService
的要点是要做一些工作-一些磁盘I/O,一些网络I/O等-然后消失。它不是无限期地做某事,也不适合开始异步工作,并且您正在尝试两者都做。 onHandleWork()
结束后,服务就会消失,您的进程可以在此后的任何时间终止,这将停止Timer
。
欢迎您使用前景Service
,而不是IntentService
或JobIntentService
。如果进程终止(例如由于内存不足),请从START_STICKY
返回onStartCommand()
,以要求Android重新启动服务。即使那可能是由用户终止的,但它是用户的设备,而不是您的设备,因此用户可以执行用户想要执行的任何操作。