我有一个简单的应用程序,它在该服务内打开一个服务,它每 3 秒重复一个函数,该函数应该获取应发送的短信列表并开始发送它们。应用程序正常工作几个小时,然后开始发送重复的短信,例如先发送 2 条,然后发送 3 条……我的猜测是,一段时间后会启动多个服务,但我不确定,请帮助我处理此代码 这就是我启动服务的方式:
startService(Intent(this, BckService::class.java))
这是我的服务:
class BckService : Service() {
override fun onBind(intent: Intent): IBinder? {
return null
}
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
val apiService = RestApiService()
val smsManager: SmsManager
if (Build.VERSION.SDK_INT >= 23) {
smsManager = this.getSystemService(SmsManager::class.java)
} else {
smsManager = SmsManager.getDefault()
}
var smsId = 0
startUpdates {
apiService.getSmsList {
var text = ""
var phone = ""
for (i in it) {
if ((i.text == text && i.phone == phone)||i.id == smsId){
continue
}
text = i.text
phone = i.phone
val parts = smsManager.divideMessage(i.text)
smsManager.sendMultipartTextMessage(i.phone,null,parts,null,null)
apiService.smsSent(i.id)
smsId = i.id
}
}
}
return super.onStartCommand(intent, flags, startId)
}
fun startUpdates(getData: () -> Unit) {
job = scope.launch {
while (true) {
getData()
delay(3000)
}
}
}
}
好吧,你永远不会停止你的背景
Thread
。您的 Service
可能会被 Android 停止(出于各种原因),这不一定会杀死您的背景 Thread
。您应该在 onDestroy()
的 Service
中添加代码来停止背景 Thread
。
另外,请注意,每次调用
startService()
来启动您的 Service
时,都会调用 onStartCommand()
,并且您将启动另一个背景 Thread
。因此,如果您预计在任何给定时间只有 1 个背景 Thread
正在运行,则需要跟踪该 Thread
并确保在已经有一个正在运行的情况下不要启动一个。
当您在
Job
中执行此操作时,您会得到 startUpdates()
的回报:
job = scope.launch { ...
job
是对 Job
的引用,您应该将其保存在 Service
中(从代码中不清楚声明变量 job
的位置)。
在你的
onDestroy()
中实现Service
,在这种方法中你应该做这样的事情:
job?.cancel()
job = null // clear any reference to a running Job
这将取消正在运行无限循环的
Job
。
此外,在
onStartCommand()
中,您应该在开始另一个无限循环之前取消任何已经运行的 Job
,使用如下所示:
job?.cancel()
job = null