【问题标题】:Android - getRunningservices(ActivityManager) deprecatedAndroid - 不推荐使用 getRunningservices(ActivityManager)
【发布时间】:2020-09-12 04:28:25
【问题描述】:

我想知道MyService.java 是否工作?

我创建了这个方法:

private boolean isServiceAlive(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceClass.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

它工作正常,但 manager.getRunningServices() 已从 API 26 中弃用。那么我们是否有另一个好的解决方案(方法)来获取当前正在运行的服务列表?

【问题讨论】:

  • 看来你不需要任何isServiceAlive()方法
  • @pskink 为什么,我需要它只是在我的代码中,这个方法用一行下划线,我是一个完美主义者想要删除这行
  • @pskink 当我单击按钮时我的服务启动(这里是带有计时器的推送通知)如果我反复单击按钮或在关闭和启动应用程序后,我的计时器工作不正确。这个方法解决了我的问题
  • 所以您的服务有问题,而不是您的活动,请参阅groups.google.com/forum/#!topic/android-developers/jEvXMWgbgzEWe deliberately don't have an API to check whether a service is running because, nearly without fail, when you want to do something like that you end up with race conditions in your code. - 这是一位 android 开发团队成员所说的
  • @MakhanovMadiyar 做一个完美主义者不是重点。此功能在下次更新后可能无法使用 - 因此最好为 API >= 26 和 API 创建解决方案

标签: java android


【解决方案1】:

尽管它没有回答您的问题,但我认为您仍然可以将此方法用于您自己的服务:

为了向后兼容,它仍然会返回调用者自己的服务。

如果您只想删除弃用警告,请使用@SuppressWarnings("deprecation")

【讨论】:

  • 这如何回答这个问题?这是创可贴,而不是解决方案。
  • @FoxDonut 这似乎是应用程序内服务的有效解决方案,OP 想检查服务是否在他自己的应用程序中运行,因此它应该回答他的问题。
【解决方案2】:

欢迎使用 Android O

android Oreo 的另一个烦人的错误,只有 Deprecated 注释,没有其他方法可以做到这一点。但也许在过去 android 开发人员决定创建替代功能。

现在正如Document 所说,继续使用getRunningServices 并在您的函数上方使用@SuppressWarnings("deprecation") 来消除警告。

从 Build.VERSION_CODES.O 开始,此方法不再可用于第三方应用程序。 为了向后兼容,它仍然会返回调用者自己的服务。

【讨论】:

    【解决方案3】:

    这就是你要做的。如果您正在使用的服务在您自己的应用程序中,只需创建一个具有用于启动或停止的布尔变量的单例。当服务启动时,请确保更新该变量。

    public class SingletonServiceManager {
    
        public static boolean isMyServiceRunning = false;
    
    }
    

    以上内容实际上是我用于小型单例类的全部内容,稍后,在其他一些类中,您想知道服务是否正在运行...

    if(SingletonServiceManager.isMyServiceRunning == true){
        // do something
    }
    

    您只需要管理更新此值的地点和时间。例如,在您启动服务时(在服务内部)将其设置为 true。然后,在您停止服务时(从服务内部)将布尔值更新为 false

    【讨论】:

    • 如果服务在不同的进程中运行(即加载了该 Singleton 类的多个实例),它可能不起作用,请参阅developer.android.com/guide/topics/manifest/…
    • 如果服务被杀死怎么办?尽管服务不再运行,布尔值仍将保持为真
    • 可以在服务的 onCreate 中设置为 true,然后在 onDestroy 中设置为 false。这样您就可以轻松跟踪正在运行的服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    相关资源
    最近更新 更多