判断服务是否为 运行 的正确方法

The correct way to determine if service is running

我在我的应用程序中 运行 前台服务,我需要确定它们是否在我的 activity 中 运行。 根据我的搜索,我发现这是一个选项:

private fun isMyServiceRunning(serviceClass: Class<*>): Boolean {
    val manager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
    for (service in manager.getRunningServices(Int.MAX_VALUE)) {
        if (serviceClass.name == service.service.className) {
            return true
        }
    }
    return false
}

但是:

getRunningServices(Int):已弃用。

所以我正在使用 3 种方法中的一种。

  1. 使用 onResume 将服务绑定到 activity。但是我认为仅仅检查服务是否 运行.
  2. 对于一些小的东西来说有点矫枉过正
  3. 创建 Intent public 并检查其是否为空,但在某些情况下 Intent 不为空但服务不为 运行
  4. 检查前台服务持久通知是否处于活动状态,但这是解决方法。

检查服务是否 运行 最正确的方法是什么?

当时没有其他方法可以找到哪些服务是 运行。 但是您可以使用这种方式来查找您的服务是否 运行:

// Singleton class
public class SingletonServiceManager {

    public static boolean isMyServiceRunning = false;

}

// Some other class
if(SingletonServiceManager.isMyServiceRunning == true){
    // do something (btw, you don't need the == true portion)
}

在服务本身中创建一个静态布尔值。 在 onCreate 中使其为真; 在 onDestroy() 中将其设置为 false;

public class ActivityService extends Service {

public static  boolean IS_ACTIVITY_RUNNING = false;

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
    IS_ACTIVITY_RUNNING = true;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
            if(!IS_ACTIVITY_RUNNING)
                stopSelf();
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    IS_ACTIVITY_RUNNING = false;
}}

现在,您可以通过布尔值 ActivityService.IS_ACTIVITY_RUNNING

检查您的活动是否 运行

您可以在 ServiceonCreate 方法中创建一个 SharedPreferences 并在其中附加一些布尔值。

getSharedPreferences( getString( R.string.app_name ) , Context.MODE_PRIVATE )
     .edit()
     .putBoolean( getString( R.string.service_running_status_key ) , true )
     .apply()

同样,在onDestroy方法中,将false附加到同一个键。然后,您可以使用 SharedPreferences.getBoolean 检查前景中的 Service 是否为 运行。