2010-03-19 12 views
7

Sto lavorando per stabilire una comunicazione bidirezionale tra un'attività e un servizio che viene eseguito in un processo diverso.Come stabilire una comunicazione bidirezionale tra attività e servizio in processi diversi?

Interrogare il processo dall'attività non è un grosso problema. Ma voglio che il processo avvisi l'attività sugli eventi. L'idea alla base è questa: il servizio funziona indipendentemente dall'app reale. Interroga periodicamente un server web. Se viene trovata una nuova attività sul server web, il processo dovrebbe notificare l'attività.

Ho trovato this thread su AndDev.org ma non sembra funzionare per me. Sono stato in giro con BroadcastReceiver. Ho implementato un'interfaccia che dovrebbe notificare l'attività, ma il problema è che il listener è sempre nullo poiché la trasmissione dal processo avviene tramite Intent, quindi la classe che estende BroadcastReceiver verrà nuovamente istanziata.

Come è possibile stabilire una comunicazione a 2 vie? Questo deve essere possibile. Grazie per qualsiasi aiuto,

steff

+0

Puoi dettagliare come "interrogare il processo dall'attività non è un grosso problema"> Esattamente come lo fai? Sei legato al servizio? – Radu

risposta

4

Utilizzare BroadcastReceiver o Activity register a callback or listener object che Service inviti a eventi chiave. I link qui sopra sono per prenotare esempi di progetti che dimostrino ciascuna di queste tecniche.

+0

Posso utilizzare un BroadcastReceiver all'interno della mia attività o devo creare una classe diversa? Devo specificare la classe che estende BroadcastReceiver per l'intento? – stfn

+0

'BroadcastReceiver' è una classe - una classe non può essere sia un 'Activity' che un' BroadcastReceiver'. Puoi usare una classe interna del tuo 'Activity' per' BroadcastReceiver', come dimostrato nel codice di esempio collegato sopra. Puoi usare i nomi dei componenti per la tua trasmissione "Intenti", ma ciò richiede una classe pubblica "BroadcastReceiver'. Oppure puoi utilizzare stringhe di azioni personalizzate, come dimostrato nel codice di esempio collegato sopra. – CommonsWare

+0

Grazie, ma non sono proprio sicuro che un BroadcastReceiver sia adatto perché quello che voglio è un processo in esecuzione il più possibile lungo, indipendente dall'applicazione reale. Dovrebbe essere in grado di mostrare una notifica nella barra di stato proprio come fa una nuova email, anche se l'applicazione effettiva non è in esecuzione. Quindi questo significa che devo avviare un servizio tramite startService (intent) invece di bindService (intent, connection, flags), giusto? Ho cercato di capire il RemoteServiceClient di ApiDemos, ma pateticamente fallito.Più guardo gli 'esempi' più mi confuso ... – stfn

2

penso che si dovrebbe avere di nuovo il BroadcastReceiver iniziare la vostra attività con il risultato nell'intento.

Oppure è possibile utilizzare AIDL su AIDL. Gli esempi hanno anche un esempio (multiplo?) Su come utilizzare AIDL e servizi. Ma AIDL potrebbe essere molto più di una seccatura per il tuo scopo.

+0

... Inizia la mia attività di nuovo? Questo è quello che sto cercando di evitare ... AIDL è davvero una seccatura ma sembra la strada da percorrere. Ora sto cercando di capire RemoteServiceBinding da ApiDemos. Una difficile. – stfn

2

È necessario utilizzare BroadcastReceiver per ricevere gli intenti e, quando si desidera comunicare, è sufficiente creare un'intenzione con valori appropriati.

In questo modo si dovrebbe essere in grado di effettuare una comunicazione bidirezionale tra qualsiasi componente.

+0

Puoi specificare questa risposta? Quindi implementa un BroadcastReceiver nel servizio e un altro nell'attività? E ha inviato Intenti da entrambe le parti? Inoltre, posso utilizzare LocalBroadcastReceiver invece di BroadcastReceiver? – Radu

Problemi correlati