2013-07-30 17 views
15

da sviluppatori di Android: "Componenti (servizio) pubblicizzare le loro capacità - I tipi di intenti che possano rispondere alle - attraverso filtri intentoscopo del servizio Intent-filtro all'interno Manifest.xml

Ho appena riesco a capire lo scopo della. Filtro intenti all'interno servizio nel Manifest.xml, qual è la capacità di qui?

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

e per di lui differenza se mi tolgo l'intent-filtro?

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

grazie.

risposta

38

Se si desidera utilizzare un servizio per eseguire azioni diverse, dichiarare un filtro di intenti aiuterà il servizio a confrontarsi con le diverse azioni che si desidera eseguire.

L'esempio spiegherà meglio.
Supponete di avere seguente dichiarazione nel file manifesto:

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

Poi, nel tuo IntentService si potrebbe filtrare per queste azioni di questo tipo:

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

Fondamentalmente, essa consente di utilizzare lo stesso servizio per i diversi azioni, invece di creare due servizi separati, ad esempio.

Tuttavia, avendo filtri intenti dichiarati per un servizio non è considerato come una buona pratica, e questo è ciò che la documentazione avevano da dire:

Attenzione: Per garantire la vostra applicazione è sicura, utilizzare sempre un esplicito intent all'avvio di un servizio e non dichiarare filtri di intent per i servizi . L'utilizzo di un intento implicito per avviare un servizio è un pericolo di sicurezza perché non si può essere certi di quale servizio risponderà all'intento e l'utente non può vedere quale servizio verrà avviato.

+0

bella spiegazione –

+0

Thanks it mi ha davvero aiutato !! – joseRo

+0

Ma se avvio un servizio di questo tipo con un'azione che non è inclusa nel '', il servizio inizierà e farà il suo lavoro. Quindi, dovrebbe esserci qualcosa come 'if (action.equals (ACT_1)) {// Do task # 1} else if (action.equals (ACT_2)) {// Do task # 2} else {throw IllegalArgumentException (" Illegal azione "+ azione);}' –

3

È possibile utilizzare filtri intenti per chiamare in modo esplicito il vostro servizio o ottenere il vostro servizio essere chiamato implicitamente in cui i componenti da qualsiasi applicazione installata sul dispositivo dell'utente può potenzialmente iniziare il servizio

Se si pensa di utilizzare il vostro servizio solo a livello locale (le altre applicazioni non lo usano), allora non c'è bisogno di (e non dovrebbe) la fornitura di eventuali filtri intento

si è chiaramente specificato nella documentazione Declaring a service in the manifest