这是与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,-遍历正在运行的服务会浪费资源并且效率低下,因为文档说:
注意:此方法仅用于调试或实现服务管理类型的用户界面。
这不是为了控制流程!
一种检查服务是否已在运行的优雅/有效方式是什么?