2011-11-05 1 views
8

Quindi, sto cercando di ottenere un handle su BroadcastReceivers e filtri Intent. Ho una finestra di dialogo personalizzata che creo in MyActivity. Nella finestra di dialogo, ho un pulsante. Quando si fa clic sul pulsante, voglio inviare una trasmissione che il ricevitore di MyActivity rileverà. Ecco cosa ho adesso:Come invio sendBroadcast (intent) da myDialog e ricevo in myActivity?

//MyActivity.java 
class myActivity extends Activity { 

    //MyDialog dialog initialized in onCreate 

    ... 

    private class MyReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      //toast "Broadcast received" 
     } 
    } 
} 

//MyDialog.java 
class MyDialog extends Dialog { 

    //m_context = incoming context from MyActivity 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     Button button1 = (Button)findViewById(R.id.button1); 
     button1.setOnClickListener(new View.OnCLickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(); 
       intent.setAction("android.intent.action.RUN"); 
       m_context.sendBroadcast(intent); 
      } 

     }); 

    } 

} 


//AndroidManifest.xml 
<activity android:name=".MyActivity" /> 
<receiver android:name="MyReceiver" android:enabled="true"> 
    <intent-filter > 
     <action android:name="android.intent.action.RUN"/> 
    </intent-filter> 
</receiver> 

Quando si preme button1, l'app si arresta in modo anomalo. Qualcuno può guidarmi nella giusta direzione?

risposta

12

in MyActivity fare qualcosa di simile:

private BroadcastReceiver _refreshReceiver = new MyReceiver(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 
    IntentFilter filter = new IntentFilter("SOMEACTION"); 
    this.registerReceiver(_refreshReceiver, filter); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    this.unregisterReceiver(this._refreshReceiver); 
} 

e per invocare trasmissione

Intent in = new Intent("SOMEACTION"); 
sendBroadcast(in); 
+0

Sei rock. Grazie per il consiglio! – Brianide

+0

Ehi, l'ho fatto funzionare, ma ora funziona solo raramente e sporadicamente. Conosci qualcosa che possa interferire con le trasmissioni? – Brianide

+0

Quindi ora sto cercando di rimbalzare su alcune trasmissioni e ricevitori, e funziona solo raramente. Voglio che la trasmissione del Dialog sia selezionata da Activity1. Activity1 esegue alcune operazioni e quindi invia una trasmissione per Activity2 da raccogliere. Tuttavia, quando provo questo, nessuna delle attività sta ricevendo la sua trasmissione. Penso che pubblicherò il codice in una nuova domanda. – Brianide

0

Probabilmente sarebbe molto più semplice registrare il ricevitore in codice nel metodo onResume dell'attività (e annullare la registrazione in onPause).

BroadcastReceiver rec = new BroadcastReceiver() 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     //Do stuff 
    } 
}; 
IntentFilter filter = new IntentFilter("android.intent.action.RUN"); 

registerReceiver(rec, filter); 
+0

Quindi questo pezzo sarebbero tutti andare in onResume, e avrei bisogno di un corrispondente annullare la registrazione in la onPause? – Brianide

+0

Arresta in modo anomalo quando viene caricato MyActivity quando lo si imposta su OnResume e onPause. – Brianide

+0

Traccia stack? Questo metodo funziona bene. Lo uso nella maggior parte delle mie app. –