Come dovrebbe un servizio comunicare con un'attività in tempo reale?

2

Come dovrebbe un servizio comunicare con un'attività in tempo reale?

BroadcastReceivers sembrano troppo lenti e inaffidabili. A volte appaiono troppo lenti o smettono di funzionare completamente. Ad esempio, c'è stato un ritardo di alcuni minuti tra l'invio e la ricezione di trasmissioni con una delle mie applicazioni di test.

Non riesco a far funzionare i callback tradizionali in modo affidabile. Sono abbastanza sicuro che non dovresti.

C'è un'opzione per associare un servizio . È adatto per la comunicazione in tempo reale?

Intendo inviare piccoli aggiornamenti interi circa 20 (modificati) volte al secondo.

Sto guardando nella direzione giusta?

Per restringere l'ambito di questa domanda:

La mia applicazione è un audio MediaPlayer. Ho bisogno del servizio per ospitare MediaPlayer. Vorrei che il servizio MediaPlayer inviasse aggiornamenti alla mia GUI che consistono principalmente nella posizione corrente dell'audio in riproduzione.

La mia domanda è: i servizi associati sono adatti per questo compito? In caso contrario, quali alternative ci sono?

    
posta David 28.12.2015 - 10:29
fonte

2 risposte

2

In Android, un servizio viene utilizzato per eseguire alcune attività in background anche quando l'elemento dell'interfaccia utente che ha avviato quell'attività non è più in primo piano.

Ad esempio: in un'app di social networking in cui l'utente desidera caricare un video sul server, il video dovrebbe continuare a essere caricato in background anche quando l'applicazione che ha richiesto il caricamento del video non è più in primo piano (ad es. l'utente riceve una chiamata nel frattempo).

Suppongo che nel tuo caso tu voglia che il brano continui a suonare anche quando l'elemento dell'interfaccia utente (l'app musicale) non è in primo piano.

Quindi sicuramente il servizio è la strada da percorrere.

In Android ci sono due tipi di servizi ( link )

  • Servizio avviato: utilizzato per attività di lunga durata in cui non sono richiesti aggiornamenti intermedi. Ad esempio, se vuoi caricare un video in background e intendere solo l'utente che il caricamento ha avuto esito positivo o negativo, utilizza un servizio avviato e utilizza le notifiche per informare l'utente dello stato (esito positivo o negativo)
  • Servizio associato: utilizzato per attività di lunga durata in cui esiste una relazione client / server tra l'invoker (in questo caso l'app) e il servizio.

In Android puoi creare un servizio che è avviato e associato allo stesso tempo. Il mio suggerimento sarebbe quello di creare un tale servizio. La parte inizia del servizio riprodurrà il brano in background e la parte associata del servizio fornirà aggiornamenti sulla posizione corrente della canzone in riproduzione.

Nel frattempo, se l'app viene visualizzata in background, poiché il servizio è avviato , la canzone continuerà a essere riprodotta senza fornire aggiornamenti della posizione corrente della canzone.

    
risposta data 13.01.2016 - 12:59
fonte
3

Puoi anche utilizzare In attesa, Bus eventi o Messenger per le comunicazioni in tempo reale dal servizio all'attività. Controlla il mio post sul blog sotto link che copre tutti questi approcci con l'esempio -

link

Pending Intent

Communication between service and Activity can be done using PendingIntent.For that we can use createPendingResult() which creates a new PendingIntent object which you can hand to service to use and to send result data back to your activity inside onActivityResult(int, int, Intent) callback.Since a PendingIntent is Parcelable , and can therefore be put into an Intent extra,your activity can pass this PendingIntent to the service.The service, in turn, can call send() method on the PendingIntent to notify the activity via onActivityResult of an event.

Event Bus

You can have the service raise events which activities or fragments can listen for and respond to using Event Bus.Event Bus can be integrated using this library which is explained here.

Messenger

Messenger references to a Handler, which others can use to send messages to it.Messenger is parcelable ,and can therefore be put into an Intent extra,so your activity can pass this Messenger to the service.Service will populate Message object with whatever data needs to be send.Whenever an event needs to be send to the activity,we need to call send() on Messenger supplying the Message object as parameter.The Handler inside activity will receive the message via handleMessage() , on the main application thread, and so can update the UI or perform necessary operation.

    
risposta data 24.04.2018 - 12:11
fonte

Leggi altre domande sui tag