19

Scenario comune - Attività con uno sfondo Servizio per interrogare il server.Comunicare con Attività dal servizio (LocalService) - Best practice per Android

Il servizio verrà eseguito periodicamente tramite AlarmManager ed eseguirà anche attività per l'attività (l'utente preme un pulsante, recupera qualcosa dal server).

Mi piacerebbe conoscere le migliori pratiche qui. Credo che il miglior design sarebbe l'esempio LocalService Android: http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

Tuttavia nell'esempio l'attività riveste un riferimento all'attività mBoundService, ma non v'è alcuna connessione inversa (il servizio non ha alcun modo di chiamare l'attività) .

Qual è il modo migliore per il Servizio di chiamare l'attività?

È possibile utilizzare Intents, BroadcastReceivers, Messages? Come?

risposta

9

Penso che il miglior design sarebbe l'esempio LocalService Android: http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

non lo farei. Usa l'accoppiamento più flessibile possibile che puoi sopportare. Quindi, in media, mirare allo schema di comando con startService() invece del modello di binding con bindService(). In particolare, il binding è un po 'un problema quando si tratta di gestire le modifiche alla configurazione (ad esempio, le rotazioni dello schermo).

Qual è il modo migliore per il Servizio di chiamare l'attività? Uso Intents, BroadcastReceivers, Messages? Come?

Vedi Notify activity from service

+0

Beh, in realtà l'ho basato sul tuo tutorial: https://github.com/commonsguy/cw-andtutorials/tree/master/18-LocalService/Patchy/src/apt/tutorial C'è qualcosa di negativo in questo approccio? – paulpooch

+1

@paulpooch: Beh, diciamo che sto riscrivendo tutti i tutorial di Patchy nei prossimi due mesi. – CommonsWare

+1

Ritengo di dover fornire un collegamento qui a un altro post di @CommonsWare in cui afferma che il bind di servizi può avere meno dolore quando associato a un oggetto ** Applicazione ** anziché a ** Attività ** http://stackoverflow.com/ a/15235902/1028256)) – Mixaz

1

Se avete bisogno di accoppiamento stretto tra l'attività utilizzando bindService(), il modo di comunicare dipende da chi sono originari della comunicazione.

Se il servizio è di origine (a causa di un allarme che ha alcune nuove informazioni da condividere), in genere invia una trasmissione.

Se l'attività è originaria (a causa dell'esempio "vai a prendere qualcosa dal server"), potrebbe essere gestita in modo asincrono utilizzando AsyncTask o simili. Cioè, puoi prelevare dal server in AsyncTask.doInBackground() e postare i risultati sull'attività in AsyncTask.onPostExecute. Questo scenario è un po 'più complicato se si prevede che l'operazione richiesta richieda un tempo molto lungo - nel qual caso la disaccoppierà e invierò una trasmissione dal Servizio.

Problemi correlati