9 Stimmen

Wie kann man programmatisch überprüfen, ob ein Dienst in AndroidManifest.xml deklariert ist?

Ich schreibe eine Bibliothek, die einen Dienst zur Verfügung stellt, der von anderen Entwicklern genutzt wird, indem sie ihn in ihr Projekt aufnehmen. Als solcher habe ich keine Kontrolle über die AndroidManifest.xml. Ich erkläre in den Dokumenten, was zu tun ist, aber dennoch ist ein häufiges Problem, dass die Leute es versäumen, den entsprechenden <service/>-Tag zu ihrem Manifest hinzuzufügen, oder ihn an der falschen Stelle hinzufügen.

Wenn meine Bibliothek startService aufruft, während der Dienst nicht im Manifest deklariert ist, passiert nur, dass ActivityManager eine Warnung ausgibt. Ich möchte eine Ausnahme auslösen, wenn dies geschieht, damit die Entwickler wissen, wie sie das Problem beheben können. Wie kann ich feststellen, ob das Manifest diesen Dienst tatsächlich deklariert?

11voto

Varun Punkte 33357

Ich schätze, dass Sie dafür einen Kontext in der Bibliothek haben sollten. Ein sauberer Weg wäre die Abfrage der packagemanager für die intent Sie möchten die service mit.

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;
}

1 Stimmen

Was ist die MATCH_DEFAULT_ONLY Flagge?

7voto

lacker Punkte 5229

Es ist dumm von mir, dies zu übersehen, aber startService() gibt null zurück, wenn kein solcher Dienst gefunden wird, und gibt ansonsten den Komponentennamen zurück. Das ist also der einfachste Weg für mich. Es sieht aus wie mit dem PackageManager würde auch funktionieren.

1voto

Spidy Punkte 39215

El PackageManager weiß, welche Dienste, Aktivitäten und andere Dinge installiert sind. Ich habe es nicht ausgiebig benutzt, aber ich glaube, getServiceInfo sollte Ihre Anforderungen erfüllen.

Sie sollten versuchen können, die Service-Informationen für die Komponente zu finden. Wenn sie vergessen haben, sie in ihr Manifest aufzunehmen, wird eine Ausnahme geworfen. Sie können diese Ausnahme abfangen und dem Benutzer Ihre eigene informative Ausnahme zukommen lassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X