2010-10-01 16 views
21

Parece que tengo una tarea clásica, pero no puedo encontrar ningún ejemplo sobre cómo hacerlo.cómo devuelve un servicio el resultado de una actividad

Quiero descargar algo. Bueno, llamo a un servicio web y recibo una respuesta ... pero es más o menos lo mismo.

Para hacer esto, tengo una actividad que inicia un servicio que genera un hilo que hace el trabajo.

Ahora me gustaría utilizar los datos que obtuve en la actividad que inició el servicio.

(supongo que a partir de otra actividad para manejar el trabajo de mostrar el resultado sería simple)

Mi problema es cómo hace el servicio de notificar una actividad (la que lo empezó u otro) de algo?

Cualquier puntero a los ejemplos son muy apreciados.

Saludos

+0

Puede utilizar receptor de radiodifusión local para este comprobar este ejemplo simple de difusión local aquí http://wiki.workassis.com/android-local-broadcast-receiver/ –

Respuesta

36

De acuerdo con la documentación de Google, si su actividad y el servicio están dentro de la misma aplicación, utilizando un LocalBroadcastManager es preferible sobre sendBroadcast (intención), ya que la información enviada no pasa por el sistema que elimina el riesgo de intercepción. http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html

Es bastante fácil de usar.

En su actividad, cree un BroadcastReceiver y añadir dinámicamente un oyente en el método onResume():

private BroadcastReceiver BReceiver = new BroadcastReceiver(){ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     //put here whaterver you want your activity to do with the intent received 
    }   
}; 

protected void onResume(){ 
super.onResume(); 
LocalBroadcastManager.getInstance(this).registerReceiver(bReceiver, new IntentFilter("message")); 
} 

protected void onPause(){ 
super.onPause(); 
LocalBroadcastManager.getInstance(this).unregisterReceiver(bReceiver); 
} 

Y en su servicio, se obtiene una instancia de LocalBroadcastManager y lo utilizan para enviar un intento. Yo suelo poner en su propio método como este:

private void sendBroadcast (boolean success){ 
    Intent intent = new Intent ("message"); //put the same message as in the filter you used in the activity when registering the receiver 
    intent.putExtra("success", success); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
} 
+0

Esto es mucho más útil que la respuesta aceptada en términos de código de trabajo –

+0

Esta debería ser la respuesta aceptada. –

4

Si necesita volver varios tipos de datos, como la clase definida por el usuario, puede intentar bindService y la devolución de llamada. Esto puede evitar implementar una interfaz parcelable que sendBroadcast.

Por favor, véase el ejemplo en mi post:

https://stackoverflow.com/a/22549709/2782538

Y más, si se utiliza IntentService, usted podría mirar en ResultReceiver. Los detalles y la muestra se podrían encontrar en este post:

Android: restful API service

espero que ayude.

+0

Gran ejemplo para el concepto 'bindService()', implementando correctamente el concepto. – Eido95

Cuestiones relacionadas