2013-07-30 8 views
15

z Android programistów: „Składniki (usługa) reklamowania swoich możliwości - rodzaje zamiarów mogą reagować na - przez filtry intencyjnycelu doręczenia intent-Filter wewnątrz manifest.xml

ja po prostu nie mogę zrozumieć cel. intencją filtr wewnątrz służby w manifest.xml, co jest zdolność tutaj?

<service 
    android:name="com.x.y" 
    android:enabled="true" 
    android:exported="true" > 
    <intent-filter> 
     <action android:name="com.x.y" /> 
    </intent-filter> 
</service> 

a co on różnica jeśli usunąć intent-filtr?

<service 
     android:name="com.x.y" 
</service> 

dzięki.

Odpowiedz

38

Jeśli chcesz użyć usługi do wykonywania różnych czynności, deklarowanie filtra intencji pomoże dopasować usługę do różnych działań, które chcesz wykonać.

Przykład wyjaśni lepiej.
Załóżmy, że po deklaracji w pliku manifestu:

<service 
    android:name="MyService" > 
    <intent-filter> 
     <action android:name="com.x.y.DOWNLOAD_DATA" /> 
     <action android:name="com.x.y.UPLOAD_DATA" /> 
    </intent-filter> 
</service> 

Następnie w IntentService można filtrować za tymi działaniami tak:

public class MyService extends IntentService { 

    public MyService() { 
     super("MyService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     if(intent.getAction().equals("com.x.y.DOWNLOAD_DATA"){ 
      //download data here 
     }else if(intent.getAction().equals("com.x.y.UPLOAD_DATA"){ 
      // upload data here 
     } 
    } 
} 

Zasadniczo, to pozwala na wykorzystanie tej samej usługi dla różnych działania, zamiast tworzyć na przykład dwie oddzielne usługi.

Jednakże mając filtry zamiarom zadeklarowane za usługę nie jest uważany za dobrą praktykę, i to docs miał powiedzieć:

Uwaga: Aby zapewnić aplikacja jest bezpieczna, zawsze używać jawne intencją przy rozpoczynaniu usługi i nie deklaruj filtrów intencji dla swoich usług . Używanie ukrytego zamiaru uruchomienia usługi jest zagrożeniem, ponieważ nie można mieć pewności, jaka usługa będzie odpowiadać intencji , a użytkownik nie będzie widział, która usługa jest uruchamiana.

+0

ładny wyjaśnieniu –

+0

Dziękujemy naprawdę mi pomogło !! – joseRo

+0

Ale jeśli uruchomię taką usługę z akcją, która nie jest zawarta w '', usługa uruchomi się i wykona swoje zadanie. Powinno być coś takiego: 'if (action.equals (ACT_1)) {// Zadanie nr 1} else if (action.equals (ACT_2)) {// Zadanie nr 2} else {throw IllegalArgumentException (" Nielegalne akcja "+ akcja);}' –

3

Można używać filtrów intencyjny wyraźnie nazywając swoją usługę lub uzyskać dostęp do usługi mają być domyślnie nazywa gdzie elementy z dowolnej aplikacji zainstalowanej na urządzeniu użytkownika może potencjalnie uruchomić usługę

Jeśli planujesz korzystania z usługi tylko lokalnie (inne aplikacje nie należy go używać), wtedy nie trzeba (i nie powinien) dostarczają żadnych zamiarów filtry

jest jasno określony w dokumentacji Declaring a service in the manifest