【问题标题】:How to programmatically check if a service is declared in AndroidManifest.xml?如何以编程方式检查服务是否在 AndroidManifest.xml 中声明?
【发布时间】:2011-06-30 01:25:00
【问题描述】:

我正在编写一个库,通过将它包含在他们的项目中来提供其他开发人员使用的服务。因此,我无法控制 AndroidManifest.xml。我在文档中解释了要做什么,但是一个常见的问题是人们忽略了将适当的 标签添加到他们的清单中,或者将其添加到错误的位置。

现在,当我的库调用 startService 而服务未在清单中声明时,唯一发生的事情是 ActivityManager 记录一个警告。当发生这种情况时,我想抛出一个异常,以便开发人员知道如何修复它。如何检测清单是否实际声明了此服务?

【问题讨论】:

    标签: android android-manifest android-service android-xml android-library


    【解决方案1】:

    我想您应该在库中有一个上下文来执行此操作。一种更简洁的方法是在 packagemanager 中查询您想要启动 serviceintent

    public boolean isServiceAvailable(Context context, String action) {
        final PackageManager packageManager = context.getPackageManager();
        final Intent intent = new Intent(context, MyService.class);
        List resolveInfo =
                packageManager.queryIntentServices(intent,
                        PackageManager.MATCH_DEFAULT_ONLY);
       if (resolveInfo.size() > 0) {
         return true;
        }
       return false;
    }
    

    【讨论】:

    • MATCH_DEFAULT_ONLY 标志是什么?
    【解决方案2】:

    忽略这一点对我来说有点愚蠢,但是 startService() 如果没有找到这样的服务则返回 null ,否则返回 ComponentName 。所以这对我来说是最简单的方法。看起来使用 PackageManager 也可以。

    【讨论】:

      【解决方案3】:

      PackageManager 知道安装了哪些服务、活动和其他内容。我没有广泛使用它,但我相信 getServiceInfo 应该满足您的要求。

      您应该能够尝试找到该组件的服务信息。如果他们忘记将其放入清单中,则会引发异常。您可以捕获此异常并向用户抛出您自己的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-28
        • 2014-03-20
        • 2011-06-29
        • 2010-10-10
        • 1970-01-01
        • 2011-12-10
        • 2013-05-05
        • 2012-08-19
        相关资源
        最近更新 更多