8

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

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

4

3 回答 3

11

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

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;
}
于 2011-06-30T01:46:45.597 回答
6

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

于 2011-06-30T01:39:06.183 回答
1

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

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

于 2011-06-30T01:32:08.833 回答