升级到Android 8后,我的应用程序的某些功能已被破坏,甚至没有明确定位到API 26。特别是,用于检查服务是否正在运行的良好旧函数(如StackOverflow中所述:How to check if a service is running on Android?)不再起作用。
只是为了刷新我们的集体记忆,这是一种经典的方法:
private boolean isMyServiceRunning(Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
现在的问题是getRunningServices
现已弃用,并且不再返回正在运行的服务。有没有人在Android 8上遇到过这个问题?
有没有官方解决方案(或黑客)?我还应该指出,我想要在与调用isMyServiceRunning()
的代码相同的进程/应用程序中查找不(由于向后兼容原因,仍然提供该功能)
答案 0 :(得分:0)
getRunningServices()此方法不再对第三方应用程序可用。没有获得运行服务的替代方法。
https://developer.android.com/reference/android/app/ActivityManager.html#getRunningServices(int)
如何检查服务是否在Android上运行?) 我只是手动检查它,在服务运行时将Boolean设置为true,在服务停止或销毁时将Boolean设置为false。我正在使用SharedPreferences保存布尔值。
Service.class
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
Log.d("service", "onStartCommand")
setRunning(true)
}
private fun setRunning(running: Boolean) {
val sessionManager = SessionManager(this)
sessionManager.isRunning = running
}
override fun onDestroy() {
setRunning(false)
super.onDestroy()
}
SessionManager.class
class SessionManager(var context: Context) {
private val loginpreferences: SharedPreferences
private val logineditor: SharedPreferences.Editor
init {
loginpreferences = context.getSharedPreferences(Pref_name, private_modde)
logineditor = loginpreferences.edit()
}
var isRunning: Boolean
get() = loginpreferences.getBoolean(SERVICES, false)
set(value) {
logineditor.putBoolean(SERVICES, value)
logineditor.commit()
}
companion object {
private val SERVICES = "service"
}
}