如何检查服务是否在Android 8(API 26)上运行?

时间:2018-01-29 17:37:48

标签: java android android-8.0-oreo

升级到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()的代码相同的进程/应用程序中查找(由于向后兼容原因,仍然提供该功能)

1 个答案:

答案 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"
    }

}