2010-07-18 9 views
24

Quando ho un broadcastReceiver, ad esempio android.intent.action.MEDIA_BUTTON e voglio aggiornare l'interfaccia utente dell'attività corrente senza creare una nuova attività, ci sono buone pratiche su questo?Android Best Practice su Aggiornamento dell'interfaccia utente da BroadcastReceiver a una determinata attività

quello che so (potrebbe non essere corretta)

1) posso mettere il BroadcastReceiver nella stessa classe come l'attività e chiamare la funzione updateUI dopo certa attività

2) Creazione di un ContentObserver?

3) Comunicare a un servizio creato dall'attività, utilizzare l'aiuto. (Non so come ottenere il servizio corrente se è registrato da un'attività)

4) Creare un filtro personalizzato sul broadcastReceiver situato sulla stessa classe dell'attività e utilizzare context.sendBroadcast (msg del filtro personalizzato) e nel filtro personalizzato chiamare updateUI (uguale a uno, ma più generico?)

il flusso finale è che sarebbe venuto da un BroadcastReceiver e finisce per aggiornare l'interfaccia utente senza rinnovare l'attività (a meno che l'attività è morto?)

Gentilmente fornisci link/codice sorgente sul modo in cui affronta questo tipo di problema. Grazie mille in anticipo :)

risposta

36

Il modo più semplice per fornire questa funzionalità è quello di mettere il ricevitore di broadcast in voi attività e si legano/sciogliere utilizzando registerReceiver e 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 
    } 
} 

A seconda l'intento che desideri ricevere, potrebbe essere necessario aggiungere le autorizzazioni appropriate al tuo file AndroidManifest.xml.

+0

consideri anche le informazioni qui riportate: [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

Quello che ho dovuto fare di recente per modificare il testo di un pulsante dopo aver ricevuto i dati da un LocalBroadcastManager è quello di memorizzare il valore in un campo privato e quindi fare le cose dell'interfaccia utente nel mio metodo 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"); 
    } 
}