2015-09-07 15 views
5

Quando iniziamo un servizio come segue:Perché Intent servizio deve essere esplicita Intent

Intent in = new Intent(); 
in.setAction("com.android.myAction"); 
startService(in); 

dà un errore: Servizio intenti deve essere esplicita.

Perché è così. Perché Android richiede che l'intento del servizio sia esplicito?

+1

sicurezza ... se ci sono più attività che reagiscono per lo stesso intento, all'utente viene chiesto di sceglierne una ... ora, immagina solo come potrebbe funzionare per i servizi (non posso) ... ecco perché devi punto esatto nome del componente – Selvin

+0

http://developer.android.com/guide/components/intents-filters.html – Sree

+1

@selvin ha funzionato per le versioni pre v5 (credo) in modo che potesse funzionare ... – pskink

risposta

1

Quando si avvia un servizio con intento implicito diverso da Attività, non è coinvolta alcuna interfaccia utente . Quando più servizi sono in grado di gestire un intent, Android ne seleziona uno a caso; l'utente non viene invitato a selezionare un servizio.

Nel caso in cui il Servizio dannoso è legato all'applicazione chiamante, quindi l'attaccante può restituire i dati dannosi arbitrari o semplicemente restituire un risultato positivo senza prendere l'azione richiesta. Il servizio dannoso può rubare dati e mentire sul completamento delle azioni richieste .

0

"Per garantire che l'app sia protetta, utilizzare sempre un intento esplicito all'avvio o associazione del servizio e non dichiarare filtri di intent per il servizio." (From Android developer) Deve esserlo perché senza di esso altre app potranno avviarlo servizio ed ecc.

0

Un po 'più a questo: Se vogliamo usare Intent implicito (Con Nome azione), dobbiamo usare setPackageName come questo:

Intent intent = new Intent(); 
intent.setPackage("com.action.ServicePackageName"); 
intent.setAction("com.action.ActionNameOfService"); 
bindService(intent, yourServiceConectionObject, Service.BIND_AUTO_CREATE); 
//or 
//startService(intent); 

punto da notare, tuttavia, è che se il servizio è servizio locale ; È necessario utilizzare l'intento esplicito in quanto la classe di servizio è disponibile. Possiamo anche utilizzare nello stesso modo mostrato sopra, ma l'uso di Explicit è consigliato per gli stessi motivi indicati in alcune risposte. Per servizi remoti (servizi in altre app); Dal momento che non possiamo avere la classe di servizio disponibile per noi; Dobbiamo legare per servire solo in questo modo.

Problemi correlati