我正在编写一个库,该库通过将服务包含在其他开发人员的项目中来提供其他开发人员使用的服务。因此,我无法控制AndroidManifest.xml。我在文档中解释了该做什么,但一个常见的问题是人们忽略了添加适当的<服务/>标记到他们的清单,或者将其添加到错误的位置。
现在,当我的库在清单中没有声明服务的情况下调用startService时,唯一会发生的事情就是ActivityManager记录一个警告。当这种情况发生时,我想抛出一个异常,以便开发人员知道如何修复它。我如何检测清单是否真的声明了此服务?
我想你应该在库中有一个上下文来做这件事。更干净的方法是在packagemanager
中查询要启动service
的intent
。
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;
}
忽略这一点对我来说有点傻,但如果找不到这样的服务,startService()将返回null,否则将返回ComponentName。这对我来说是最简单的方法。看起来使用PackageManager也可以。
您应该能够尝试查找组件的服务信息。如果他们忘记把它放在清单中,就会抛出一个异常。您可以捕捉到这个异常,并将自己的信息抛出给用户。