2010-07-18 18 views
24

Cuando tengo un broadcastReceiver digo android.intent.action.MEDIA_BUTTON y quiero actualizar la interfaz de usuario de la actividad actual sin crear una nueva actividad, ¿hay alguna buena práctica en ¿éste?Android Best Practice on Actualización de la interfaz de usuario de BroadcastReceiver a una determinada actividad

lo que sé (podría no ser correcta)

1) Puedo poner el BroadcastReceiver en la misma clase que la actividad y llamar a la función updateUI después de cierta actividad

2) Crear un ContentObserver?

3) Comuníquese a un servicio creado por la actividad, use aidl. (No sé cómo obtener el servicio actual si está registrado en una actividad)

4) Cree un filtro personalizado en el receptor de difusión ubicado en la misma clase que la actividad, y use context.sendBroadcast (msg de filtro personalizado) y en el filtro personalizado llamar updateUI (igual que uno, pero más genérico?)

el flujo final es que provendría de un BroadcastReceiver y termina la actualización de la interfaz de usuario sin renovar la actividad (a menos que la actividad está muerto?)

Sírvase proporcionar enlaces/código fuente sobre cómo abordar este tipo de problema. un montón de antemano :)

Respuesta

36

La manera más sencilla de proporcionar esta funcionalidad gracias es poner el receptor de radiodifusión en el que se unen la actividad y/desvincularla usando registerReceiver y unregisterreceiver:

public class MyActivity extends Activity { 
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      MyActivity.this.receivedBroadcast(intent); 
     } 
    }; 
    @Override 
    public void onResume() { 
     super.onResume(); 
     IntentFilter iff = new IntentFilter(); 
     iff.addAction("android.intent.action.MEDIA_BUTTON"); 
     // Put whatever message you want to receive as the action 
     this.registerReceiver(this.mBroadcastReceiver,iff); 
    } 
    @Override 
    public void onPause() { 
     super.onPause(); 
     this.unregisterReceiver(this.mBroadcastReceiver); 
    } 
    private void receivedBroadcast(Intent i) { 
     // Put your receive handling code here 
    } 
} 

Dependiendo la intención que desea recibir, puede necesitar agregar los permisos apropiados a su AndroidManifest.xml archivo.

+0

Ten en cuenta también la información dada aquí: [BroadcastReceiver.html # OnReceive (android.content.Context, android.content.Intent)] (http://developer.android.com/reference/android/content/ BroadcastReceiver.html # onReceive% 28android.content.Context,% 20android.content.Intent% 29) –

0

Lo que recientemente tuve que hacer para cambiar el texto de un Botón después de recibir datos de un LocalBroadcastManager es almacenar el valor en un campo privado y luego hacer las cosas de la interfaz de usuario en mi método onResume().

public class myClass extends Activity { 

    private String myString; 

    @Override 
    public void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);   
     // register to receive data 
     LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receiver, new IntentFilter("myAction"));  
    } 

    private BroadcastReceiver receiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      // get the extra data included in the intent 
      myString = intent.getStringExtra("myString"); 
     } 
    }; 

    @Override 
    public void onResume() { 
     super.onResume(); 
     System.out.println("onResume"); 
     // do something to the UI 
     myButton.setText(myString != null ? myString : "Default"); 
    } 
} 
Cuestiones relacionadas