Android - getRunningservices(ActivityManager) 已经被弃用

38

我想知道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 为什么,我需要它。只是在我的代码中,这个方法被下划线标记了,作为一个完美主义者,我想要去掉这条线。 - Makhanov Madiyar
@pskink 当我点击按钮时,我的服务就会启动(这里是带有定时器的推送通知)。如果我重复点击按钮或在关闭和重新启动应用程序后再次点击按钮,则我的计时器会出现问题。这种方法解决了我的问题。 - Makhanov Madiyar
2
所以你的问题出现在你的服务中,而不是你的活动中,请参见https://groups.google.com/forum/#!topic/android-developers/jEvXMWgbgzE,“我们故意没有API来检查服务是否正在运行,因为几乎总是会在代码中出现竞争条件。” - 这是Android开发团队成员之一说的话。 - pskink
1
@MakhanovMadiyar 成为完美主义者并不是重点。这个函数在下一个更新后可能无法工作 - 所以最好为API >= 26和API < 26创建一个解决方案。 - user5803705
3个回答

19

尽管它并没有回答你的问题,但我认为你仍然可以使用这种方法来处理自己的服务:

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

如果你只是想去掉这个弃用警告,请使用 @SuppressWarnings("deprecation")


16
这怎么回答问题了呢?这只是一种权宜之计,而不是解决方案。 - user5803705
4
似乎这是应用程序内服务的有效解决方案,而且OP想要检查服务是否在他自己的应用程序中运行,因此它应该能够回答他的问题。 - Roman Rozenshtein

9

欢迎使用Android O

Android Oreo的另一个让人烦恼的bug是,只有Deprecated注释,没有其他方法可以解决。但也许在过去,安卓开发者决定创建替代功能。

目前根据文档,继续使用getRunningServices并在函数上方使用@SuppressWarnings("deprecation")来消除警告。

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


3

以下是您需要做的。如果您使用的服务在您自己的应用程序中,请创建一个单例,其中包含一个布尔变量表示服务是否已启动或停止。当服务启动时,请确保更新该变量。

public class SingletonServiceManager {

    public static boolean isMyServiceRunning = false;

}

以上内容就是我用于小型单例类的全部内容,稍后在其他类中,当你想知道服务是否正在运行时...
if(SingletonServiceManager.isMyServiceRunning == true){
    // do something
}

您只需要管理该值何时以及在哪里更新即可。例如,在服务启动时(在服务内部)将其设置为true。然后,在停止服务时(从服务内部)将布尔值更新为false。


11
如果该服务在不同的进程中运行(即加载了该单例类的多个实例),那么它可能无法正常工作,请参见 https://developer.android.com/guide/topics/manifest/service-element#proc。 - TWiStErRob
6
如果服务被停止了呢?尽管该服务不再运行,布尔值仍将保持为True。 - Daniel Bejan
1
你可以在服务的onCreate中将其设置为true,然后在onDestroy中将其设置为false。这样你就可以轻松地跟踪运行的服务。 - Ahmed Shahid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接