5

Piszę bibliotekę, która udostępnia Usługę używaną przez innych programistów, włączając ją do swojego projektu. W związku z tym nie mam kontroli nad plikiem AndroidManifest.xml. Wyjaśniam, co należy robić w dokumentach, ale jednak powszechnym problemem jest to, że ludzie zaniedbują dodanie odpowiedniego tagu do swojego manifestu lub dodania go w niewłaściwym miejscu.Jak programowo sprawdzić, czy usługa jest zadeklarowana w AndroidManifest.xml?

Teraz, gdy moja biblioteka wywołuje usługę startService, gdy usługa nie jest zadeklarowana w manifeście, jedyne co się dzieje to ActivityManager rejestruje ostrzeżenie. Chciałbym rzucić wyjątek, gdy tak się dzieje, aby programiści wiedzieli, jak to naprawić. Jak mogę sprawdzić, czy manifest faktycznie deklaruje tę usługę?

Odpowiedz

5

Coś głupiego, gdybym przeoczył to, ale funkcja startService() zwraca wartość null, jeśli nie znaleziono takiej usługi, i zwraca w przeciwnym razie nazwę komponentu. To dla mnie najprostsza droga. Wygląda na to, że również będzie działał menedżer pakietów.

1

The PackageManager wie, jakie usługi, czynności i inne rzeczy są zainstalowane. Nie używałem tego zbyt szeroko, ale uważam, że getServiceInfo powinien spełniać twoje wymagania.

Powinieneś być w stanie wyszukać informacje serwisowe dla komponentu. Jeśli zapomnieli umieścić go w swoim manifeście, zostanie zgłoszony wyjątek. Możesz złapać ten wyjątek i wrzucić swój własny informacyjny do użytkownika.

9

Domyślam się, że powinieneś mieć kontekst w bibliotece, aby to zrobić. Czyściejszy sposób byłoby zapytanie do packagemanager dla intent chcesz rozpocząć z.

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

Co to jest flaga "MATCH_DEFAULT_ONLY"? – HyBRiD

Powiązane problemy