2012-06-18 11 views
14

Soy nuevo en la programación de Android, así que estoy enfrentando algunos problemas generales sobre cómo elegir la mejor manera de diseñar mi aplicación.¿Cómo puede el servicio Android actualizar la interfaz de usuario de la actividad que lo inició?

Lo que quiero hacer es básicamente un reproductor multimedia. Quiero que el reproductor multimedia se ejecute en un servicio porque también quiero que se reproduzca cuando la actividad no se muestra.

Mi pregunta es, ¿cómo puedo actualizar la interfaz de usuario en mi actividad dependiendo del flujo de trabajo del servicio (por ejemplo, la canción cambia y quiero que se muestre su nombre)?

Creo que podría utilizar una difusión Local Manager con el fin de enviar las intenciones de mi servicio a mi actividad e invocar las actualizaciones de la interfaz de usuario (qué parece correcto?)

PERO ... me va a querer hacer mi servicio algunas cosas mientras se reproduce música (como consultar/actualizar la base de datos). Por esta razón, estaba pensando en ejecutar el servicio en un proceso diferente (¿o hilo?).

SO ... Supongo que, al ejecutar el servicio en un proceso diferente, no podré usar el administrador de transmisión local (¿es correcto?).

Espero haber explicado cuáles son mis dudas ... ¿Alguien puede ayudar?

muchas gracias!

Respuesta

15

Use una tarea asíncrona en su servicio para manejar el trabajo que necesita hacer en segundo plano. Cuando necesite actualizar la IU, use el método progressUpdate de la tarea asíncrona para enviar de nuevo una transmisión a cualquier actividad interesada.

Pseudo ejemplo.

Actividad

onCreate -> StartService y crear nuevos BroadcastReceiver. Asegúrese de anular el método onReceive y probar el intento específico.

mLocalBroadcastManager = LocalBroadcastManager.getInstance(this); 

    broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if(intent.getAction().equals(yourActionType)) { 
       //do work here 
      } 
     } 
    }; 

onResume -> registrarse como un receptor de radiodifusión

IntentFilter filter = new IntentFilter(); 
    filter.addAction(yourActionType); 
    mLocalBroadcastManager.registerReceiver(broadcastReceiver, filter); 

Servicio

onCreate -> crear gestor de emisión.

mLocalBroadcastManager = LocalBroadcastManager.getInstance(this); 

onStartCommand -> crear y ejecutar una nueva tarea asíncrona si es necesario. (OnStart podría ser llamado varias veces)

asíncrono de tareas

doInBackground -> Iniciar cualquier tarea de fondo que necesita. En este caso, reproducir música. Hacer llamadas periódicas a publishProgress

onProgressUpdate -> sendBroadcast que indica el estado actualizado

Intent broadcastIntent = new Intent(yourActionType); 
    broadcastIntent.putExtra(whateverExtraData you need to pass back); 
    mLocalBroadcastManager.sendBroadcast(broadcastIntent); 

onPostExecute -> sendBroadcast tarea que indica terminó

+0

muchas gracias.pero ¿qué pasa con los mensajes de difusión? ¿No son poco convenientes para ser usados ​​localmente? – super

+0

@super He editado mi respuesta para incluir un ejemplo de cómo se utilizan las transmisiones locales. Asegúrate de incluir android-support-v4.jar en tus bibliotecas si estás apuntando a una versión anterior. – Mike

+0

muchas gracias. Le dejaré saber cómo va;) – super

Cuestiones relacionadas