如何检查Android服务是否已在运行中

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

这是与How to check if a service is running on Android?类似的问题,但由于该问题较旧且提供的答案已弃用或无法正常使用。因此是单独的问题。

[我有一个实现,可以在启动完成时触发服务,但是如果以前没有启动,我还想在MainActivity的onCreate中启动该服务。

这是我尝试过的:

1。提取静态布尔值以获取服务状态,如下所示。

MyService.kt

class MyService : Service() {
    override fun onCreate() {
        super.onCreate()
        isServiceStarted = true
    }
    override fun onDestroy() {
        super.onDestroy()
        isServiceStarted = false
    }
    companion object {
        var isServiceStarted = false
    }
}

MainActivity.kt

class MainActivity : AppCompatActivity(){
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val serviceStarted = MyService.isServiceStarted
        if (!serviceStarted) {
            val startMyService = Intent(this, MyService::class.java)
            ContextCompat.startForegroundService(this, startMyService)
        }
    }
}

但是我很快发现,销毁服务时并不总是调用onDestroy,因此实际上销毁了我的静态布尔变量(isServiceStarted)为true。

2。要检查的功能

fun isMyServiceRunning(serviceClass : Class<*> ) : Boolean{
    var manager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
    for (service in manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceClass.name.equals(service.service.className)) {
            return true
        }
    }
    return false
}

通话

isMyServiceRunning(MyService::class.java)

此方法存在的问题包括:-从Android O(API 27)开始不赞成使用getRunningServices,-遍历正在运行的服务会浪费资源并且效率低下,因为文档说:

注意:此方法仅用于调试或实现服务管理类型的用户界面。

这不是为了控制流程!

一种检查服务是否已在运行的优雅/有效方式是什么?

android kotlin android-service
1个回答
0
投票

如果服务在应用程序过程中,只需使用服务(伴侣对象)或bind内部的静态字段进行服务。如果该服务在远程进程中运行,则如果要进行同步通信,请使用Messanger;如果要关心线程,请使用AIDL

© www.soinside.com 2019 - 2024. All rights reserved.