2014-09-04 8 views
5

Come tutti potrebbe sapere, ci sono due tipi principali di servizi in Android: iniziato e vincolati (servizi non sto partito il conteggio e legato, in quanto sono in gran parte gli stessi servizi appena iniziato).Perché utilizzare i servizi associati (non avviati) all'interno del processo di applicazione?

È possibile trovare tonnellate di tutorial su come utilizzare i servizi associati o su come collegarsi al servizio avviato, ma in realtà non esiste una risposta sul motivo per cui qualcuno dovrebbe utilizzare i servizi associati (non avviati) all'interno del processo di applicazione (in altre parole - senza IPC)?

Esiste un profitto (nascosto?) Dall'utilizzo del servizio associato (diciamo per una sorta di elaborazione) rispetto all'utilizzo di strumenti di threading standard (AsyncTak, Executor, thread semplici)? Ne varrebbe la pena il codice per la connessione di tale servizio?

Alcuni contesto

domanda è apparso dopo aver scavato attraverso fonti di Camera di Google. Stanno creando un servizio vincolato (ancora una volta non avviato) per il salvataggio delle immagini. Qual è il punto? Perché non solo usato un po 'di Executor? Mi sto perdendo qualcosa di importante?

Se questo è un servizio legato, allora non c'è modo sarebbe utile persistere progresso risparmio mentre configurazione del dispositivo cambia (cioè dispositivo viene ruotato). Quindi non vedo alcun vantaggio.

+0

intendi servizi locali legati? – pskink

+0

guardare in [questa] (http://stackoverflow.com/questions/9272217/service-or-bound-service) o [questo post] (http: // StackOverflow.it/questions/16162002/bound-service-versus-started-service-on-android-and-how-to-do) –

+0

@SagarPilkhwal il primo collegamento è un po 'più vicino alla risposta, ma ancora non descrive il perché dovresti usare questo servizio in primo luogo. Perché invece non lanciare alcuni 'HandlerThread'? Secondo link appena uscito dall'argomento in quanto descrive i servizi associati ** e ** avviati. –

risposta

2

Il servizio avviato è utile nel caso in cui sia necessaria un'interazione nulla o molto limitata (a senso unico) tra il componente di partenza, ad esempio Activity o BroadcastReceiver, e il servizio avviato. Ad esempio, un download di sfondo ignifugo. Dai al servizio del downloader un URL, avvia il servizio e dimentica tutto. L'unico modo in cui il servizio di downloader interagisce con l'utente è l'uso di Notifiche. L'attività potrebbe anche andare sul backstack nel frattempo, non ti interessa. Si noti che in questo caso, il servizio sta servendo l'attività che lo ha avviato e non è necessario che sia disponibile in modo generico per altre attività.

D'altra parte, il servizio legato è un servizio più generico o uno che ha bisogno di servire molteplici attività, e più oltre, ha bisogno di molteplici interazioni bidirezionali cioè attività invia un messaggio al servizio, quindi Service invia un messaggio al di attività e presto. Considera l'esempio del servizio di riproduzione musicale in background, in cui si passa il file musicale o l'URI/URL del flusso remoto al servizio, quindi un'altra attività potrebbe cambiare il volume o passare a un'altra traccia. Un messaggio da servizio a attività potrebbe essere che il il file mp3 è incompleto o corrotto o un messaggio di completamento della traccia.

In effetti, sono giunto a questa domanda cercando la risposta a questa domanda esatta, ma ho trovato la risposta abbastanza soddisfacente e completa in the link fornita da @SagarPikhwal. Certo, sono un principiante per quanto riguarda la programmazione Android, quindi quanto sopra è tutto per quello che ho capito!

Edit: sono reso conto che non ho risposto (al meglio delle mie capacità), l'altra parte della domanda circa il codice che avete visto per la macchina fotografica di Google. Penso che il motivo per cui creano un servizio associato è perché la fotocamera è una risorsa condivisa comune e potrebbero esserci più utenti simultaneamente di quella risorsa di sistema. L'attività che utilizza il servizio fotocamera per acquisire un'immagine o un video non è l'utente esclusivo. L'applicazione Google Fotocamera è ancora un altro utente dell'hardware della videocamera, mentre altri potrebbero esserlo e tutti sono serviti dal servizio associato.

+0

Grazie per la risposta, ma copre ancora solo i servizi avviati e i servizi avviati e vincolati. La mia domanda riguardava solo servizi vincolati. Il tuo esempio di servizio musicale è molto buono, sono d'accordo, ma comunque tale servizio funzionerà (e dovrebbe) senza alcun 'Activity' vivo, quindi non è un servizio puro legato (che rimane attivo solo mentre l'attività legata è viva). –

+0

Per quanto riguarda la fotocamera - come da documentazione, 'Activity' è un proprietario esclusivo di' Camera', quindi no - non è il caso che lo tengano in 'Service'. Quello che fanno è il salvataggio dei dati acquisiti. E ancora una volta - mi sembra strano, in quanto tale "Servizio" non rimarrà in vita dopo che "CameraActivity" è stato distrutto. –

+0

Ah, capisco - la mia conoscenza di Android è chiaramente abbastanza limitata finora. Ho letto (e interpretato come tale) che il servizio Bluetooth è un servizio puro, nel senso che nessuna attività dell'applicazione utente inizia. Qualsiasi attività o ricevitore di trasmissione che necessiti di utilizzare Bluetooth deve collegarsi a questo servizio e utilizzare il meccanismo basato sui messaggi per invocare funzionalità di rilevamento, accoppiamento/autenticazione, comunicazione dati ecc. – icarus74