Как программно проверить, объявлен ли сервис в AndroidManifest.xml? - PullRequest
6 голосов
/ 30 июня 2011

Я пишу библиотеку, которая предоставляет Сервис, который используется другими разработчиками, включая его в свой проект.Таким образом, я не могу контролировать AndroidManifest.xml.Я объясняю, что делать в документах, но, тем не менее, общая проблема заключается в том, что люди пренебрегают, чтобы добавить соответствующиепометить их в манифесте или добавить в неправильном месте.

Прямо сейчас, когда моя библиотека вызывает startService, а служба не объявлена ​​в манифесте, единственное, что происходит, - ActivityManager записывает предупреждение.Я хотел бы выбросить исключение, когда это произойдет, чтобы разработчики знали, как это исправить.Как я могу определить, действительно ли манифест объявляет об этой услуге?

Ответы [ 3 ]

9 голосов
/ 30 июня 2011

Я полагаю, у вас должен быть контекст в библиотеке, чтобы сделать это.Более чистым способом было бы запросить packagemanager для intent, с которого вы хотите начать 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;
}
6 голосов
/ 30 июня 2011

Глупо игнорировать это, но startService () возвращает null, если такой службы не найдено, и возвращает ComponentName в противном случае. Так что это самый простой способ для меня. Похоже, что использование PackageManager также будет работать.

1 голос
/ 30 июня 2011

PackageManager знает, какие службы, действия и другие компоненты установлены. Я не использовал его широко, но я считаю, что getServiceInfo должен удовлетворить ваши требования.

Вы должны попытаться найти служебную информацию для компонента. Если они забыли указать это в своем манифесте, возникает исключение. Вы можете поймать это исключение и выдать свой собственный информативный пользователю.

...