2015-06-11 6 views
5

Das ist, ich habe diesen BroadcastReceiver ich on-the-fly erstellen, um für einen Broadast zu hören, nach dem ich möchte, dass es sich selbst abmeldet.Ist es in Ordnung, den 'dynamischen' BroadcastReceiver von der eigenen onReceive() Methode des Empfängers zu entfernen?

Ich habe keinen Beispielcode gefunden, der es so macht, aber ich habe auch keine Regel in den Android Online-Dokumenten gefunden, die dies verbietet. Aber ich kann es nicht so lange herumhängen lassen wie die Aktivität, und es ist sowieso in einer anonymen Klasse, daher kennt die enthaltende Klasse nicht einmal den Variablennamen.

Das heißt, sieht der Code so etwas wie dieses:

myInfoReceiver = new BroadcastReceiver() { 
onReceive(Context ctx, Intent intt) { 
    // do some Notification when I get here 
    nm.notify("I got here") // obvious pseudo code 
    ctx.unregisterReceiver(myInfoReceiver); 
} // end onReceive 
ctx.registerReceiver),uInfoReceiver, new IntentFilter(...)); 
}; // end BroadcastReceiver 

Aber wenn ich dies ausführen, klagt Android, wenn es austragen nennt, bestand darauf, dass der Empfänger nicht da ist (ich den genauen Wortlaut vergessen abzumelden, aber es warf IllegalArgumentException).

Ich habe auch versucht, den Code zu ändern, um zu überprüfen, dass die Aktion in 'intt' ist die gleiche wie erwartet - aber dann führt es noch onReceive aus, aber meldet nicht automatisch die Registrierung.

+0

Was Ziel, du wollen erreichen? Ich nehme an, "BroadcastReceiver" könnte die falsche Wahl für Ihr Problem sein. Wenn Sie eine Operation einmal ausführen möchten und sie unabhängig vom Aktivitätslebenszyklus machen möchten, sollten Sie 'IntentService' oder' Service' mit Event-Bus (z. B. Otto) in Betracht ziehen. –

+0

Ich hätte IntentService usw. nicht verwendet, weil das größere System, das Teil dieser ist, bereits eine Broadcast-Absicht hat, die genau die Information darstellt, die ich möchte. Außerdem brauche ich nicht so viel Unabhängigkeit vom Lebenszyklus. Ich bin bereits auf dem UI-Thread, der auf diese Absicht wartet, und zeigt nichts als einen Fortschrittsdialog. –

Antwort

5

Die Antwort auf Ihre Frage ist "Ja". Jedoch ...

... müssen Sie unregisterReceiver() auf der gleichen Context anrufen, die Sie registerReceiver() angerufen haben. In dem von Ihnen geposteten Code rufen Sie unregisterReceiver() auf dem Context an, der als Argument an onReceive() übergeben wird. Dies ist nicht das gleiche Context weshalb Sie die Ausnahme bekommen.

+0

Ich habe den Kontext für einige Zeit verdächtig gewesen. Danke für Ihre Sicherheit. –

+0

Ich stehe jetzt vor diesem Problem. Gibt es eine gute Arbeit? – user2892437

0

Ich würde einfach JA sagen, überhaupt kein Problem.

Ich verwende es für eine einmalige Ortung zum Beispiel, und kann auch in anderen Logiken verwendet werden, ohne dass ich irgendein Problem damit sehe.

Plus Ich habe es schon oft gesehen.

+0

hätte ich auch "kein Problem" gedacht. Aber ich bekomme IllegalArgumentException. Irgendeine Idee warum? Wie kann es nicht noch in einer eigenen onReceive() Methode registriert werden? –

+0

Übergeben Sie das richtige Empfängerobjekt, während Sie den Empfänger abmelden, da ich eine Abweichung in dem obigen Code sehen konnte, den Sie veröffentlicht haben – 7383

+0

Sie müssen es nur auf dem gleichen 'Kontext' aufrufen. Verwenden Sie so etwas wie 'MyActivity.this' zum Beispiel für eine' Aktivität'. Andernfalls poste den Stacktrace bitte. – shkschneider

0

Ich habe verschiedene Lösungen versucht, endlich das so ich tue:

Registrierung:

MyApplication.getInstance().getApplicationContext().registerReceiver(sentReceiver, new IntentFilter(SENT)); 

SentReceiver:

public class SentReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent arg1) { 
     switch (getResultCode()) { 
      case Activity.RESULT_OK: 
       Toast.makeText(context, 
         context.getString(R.string.sms_envoye), Toast.LENGTH_SHORT) 
         .show(); 
       break; 
      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
       Toast.makeText(context, 
         context.getString(R.string.sms_defaillance_generique), 
         Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_NO_SERVICE: 
       Toast.makeText(context, 
         context.getString(R.string.sms_pas_de_service), 
         Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_NULL_PDU: 
       Toast.makeText(context, 
         context.getString(R.string.sms_pas_de_pdu), 
         Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_RADIO_OFF: 
       Toast.makeText(context, 
         context.getString(R.string.sms_radio_desactivee), 
         Toast.LENGTH_SHORT).show(); 
       break; 
     } 
     MyApplication.getInstance().getApplicationContext().unregisterReceiver(this); 
    } 

Mit MyApplication:

public class MyApplication extends Application { 
    private static MyApplication mInstance; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mInstance = this; 
    } 

    public static synchronized MyApplication getInstance() { 
     return mInstance; 
    }   
} 
Verwandte Themen