Android O替代getRunningServices方法的解决方案

44

在之前的Android版本中,我使用这种方法来查找另一个应用程序中的服务是否正在运行。对我来说,它工作得可靠:

ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<RunningServiceInfo> services = manager.getRunningServices(Integer.MAX_VALUE);

然而,在Android O中,此功能已被弃用,仅会返回有关调用应用程序服务的信息。我已经研究了其他解决方案,但我不想要求用户获得更多权限(例如UsageStatsManager、NotificationManager等)。

在Android O中,是否有获取不同应用程序的服务是否正在运行的替代解决方案?


6
我怀疑这一点。谷歌特别希望用户知道,如果用户有权访问此类信息(通过其他权限),则可以访问该信息。但如果用户无权访问,则不会显示该信息。 - CommonsWare
这正是我担心的。似乎Android正在限制这种类型的交互,使应用程序更加孤立(没有用户同意)。这对用户来说是好事,但对开发人员来说并不好玩。 - JoeyG
我需要这个功能来满足我的特定使用情况。我不需要服务一直在运行,但需要知道它是否正在运行。 - JoeyG
一个可以用于自动化测试的工具。 - Paul Omta
是否有解决以上问题的方法?请帮帮我。 - Makvin
这两个问题是在我问了这个问题之后被问出来的,所以它们是我的问题的重复。 - JoeyG
2个回答

1
这个函数是故意没有替换的。虽然文档不太清楚,但是从文档中可以看出:

注意:此方法仅用于调试或实现服务管理类型的用户界面。

基本上,使用该方法来检查其他应用程序的服务是一个意外的副作用,因此Google决定删除它。可能是出于隐私/安全目的,以避免应用程序在用户设备上“嗅探”其他应用程序/服务。
您没有提及您的用例,但您想避免向用户请求权限。然而,Google有意强制开发人员明确请求他们需要的权限,这种哲学可以在这里找到解释。

感谢您的评论,不过自从最初的问题发布以来将近3年时间,我认为可以确定的是当时没有替代方案,现在也没有引入替代方案。 - JoeyG
这就是为什么我留下了评论,以便任何寻找答案的人不会被搁置。 - Sharp

0
根据文档:
As of O, this method is no longer available to third party applications.
For backwards compatibility, it will still return the caller's own services.

但也许这个解决方案会有所帮助:如何检查Android上的服务是否正在运行?


谢谢,是的我已经阅读了文档,这就是为什么我特别要求替换的原因。正如问题所述,它必须返回来自不同应用程序的服务状态,因此创建一个静态变量,就像链接的解决方案建议的那样,将无法工作。 - JoeyG

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