在写一款音乐播放器时,发现如果不判断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.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.getRunningServices(Int.MAX_VALUE)

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐