在 Kotlin Android studio 中启动不需要的服务

问题描述 投票:0回答:1

我有一个简单的应用程序,它在该服务内打开一个服务,它每 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)
        }
    }
}
}
android kotlin android-service
1个回答
0
投票

好吧,你永远不会停止你的背景

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
© www.soinside.com 2019 - 2024. All rights reserved.