在写一款音乐播放器时,发现如果不判断service是否启动,每次进入本地歌曲的界面时,由于重新加载就会造成重复startService的现象,后台播放的歌曲就会停止,所以我们需要先判断如果service已经启动,那么便不启动服务。
查资料后发现android中已经封装了一个获取正在运行的activity和service的类:ActivityManager
var activityManager: ActivityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
通过以下代码可以判断服务是否启动
fun isServiceRunning(context: Context, className: String): Boolean{
if(className.isNullOrEmpty()){
return false
}
var isRunning: Boolean = false
var activityManager: ActivityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
var serviceList: List<ActivityManager.RunningServiceInfo> = activityManager.getRunningServices(30)
if(serviceList.isEmpty()){
return false
}
serviceList.forEach { item ->
if(item.service.className == className){
isRunning = true
return@forEach
}
}
return isRunning
}
简单调用:
isServiceRunning(context, Service::class.java.name)
这个方法思路就是通过ActivityManager获得后台正在运行的服务,再遍历匹配服务名称,来判断该服务是否在后台运行。
注意:这里有个坑,就是getRunningServices(30)//这里的值小了会漏掉该service而返回false,如果不想漏掉,可以设置值大些
var serviceList: List<ActivityManager.RunningServiceInfo> = activityManager.getRunningServices(Int.MAX_VALUE)
网友评论