3

Gibt es eine Möglichkeit, wie Sie eine Referenz für einen in Manifest.xml definierten BroadcastReceiver aus Code abrufen können?Android - erhalten Sie einen Verweis auf einen BroadcastReceiver, der in Manifest definiert ist

In meinem Fall verwenden wir einen BroadcastReceiver, der in der Manifest.xml enthalten sein muss. Es hat jedoch Funktionalität, die ich in unserem Code wiederverwenden möchte. Anstatt also einen anderen ähnlichen BroadcastReceiver zu erstellen und ihn aus dem Code zu instantiieren, möchte ich einen Verweis auf den vorhandenen erhalten.

Zusätzliche Informationen:

Mein Ziel auf ein Ereignis auf meiner BroadcastReceiver von meiner Tätigkeit abonnieren ist - ein Ereignis, das Ich mag würde wieder zu verwenden - in meiner Tätigkeit stattdessen eine andere Instanz dieses Empfängers zu schaffen, würde ich gerne einen Verweis auf den bestehenden bekommen.

+1

Eine im Manifest registrierte Empfängerklasse hat keine fortlaufend vorhandene Instanz. Eine neue Instanz wird jedes Mal erstellt, wenn eine Übertragung verarbeitet werden muss. Wenn Sie dieselbe Klasse in Ihrer Aktivität verwenden möchten, erstellen Sie einfach Ihre eigene neue Instanz und registrieren Sie sie dynamisch. –

+1

@MikeM. Könntest du das bitte als Antwort posten, genau nach was ich gesucht habe. –

Antwort

4

Beim Registrieren eines BroadcastReceiver im Manifest registrieren Sie die Klasse, keine Instanz davon. Jedes Mal, wenn eine Übertragung stattfindet, die Ihr <receiver> benötigt, wird eine neue Instanz erstellt, so dass Sie nicht wirklich einen Verweis auf einen erhalten können, wie Sie beschreiben.

Es ist vollkommen in Ordnung, eine Instanz einer Receiver-Klasse dynamisch zu instanziieren und zu registrieren, die Sie auch statisch im Manifest registriert haben. Ich würde jedoch bemerken, dass, wenn die statisch registrierte Klasse trotzdem ausgeführt wird - das heißt, wenn sie dieselben Broadcasts wie die dynamisch registrierte behandelt - könnten Sie in Betracht ziehen, einfach Ihre Activity aus der Receiver-Klasse zu benachrichtigen - zB mit LocalBroadcastManager, eine andere Event-Bus-Implementierung, etc. - anstatt im Wesentlichen Empfänger zu duplizieren.

0

Es ist nicht erforderlich, eine Referenz zu BroadcastReceiver zu erhalten, die bereits registriert ist.

Senden Sie einfach Intent, die von dieser BroadcastReceiver behandelt werden können, um ihre Aktion von einem beliebigen Punkt des Codes, wo Sie eine Context haben.

context.sendBroadcast(intent); 

Wenn Sie ‚reine Logik‘ nennen, ohne BroadcastReceiver rufen Sie Logik von ihm bis zu einem gewissen POJO Klasse zu extrahieren und rufen direkt die Klasse BroadcastReceiver weggelassen.

class LocationReceiver extends BroadcastReceiver { 

     private SomeAction action; 

     public LocationReceiver(){ 
      action = new SomeAction(); 
     } 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      action.execute(); 
     } 
    }; 

BroadcastReceiver einfach execute() nennen, aber es weiß nichts darüber, wie es funktioniert. Sie können SomeAction irgendwo in Ihrem Code wiederverwenden, ohne ein Wissen über BroadcastReceiver überhaupt zu haben.

Versuchen Sie, eine Logik in Android-Klassen zu vermeiden.

Es ist besser, Logik in POJO Java-Klassen zu haben, weil es SRP Prinzip am Leben erhält und das Testen einfacher macht.

+0

danke aber ich glaube nicht, dass ich mein Problem verstand, ich gab wahrscheinlich nicht genug Details. Ich habe meinen Beitrag bearbeitet, damit es ein bisschen klarer wird. Ich habe kein Problem mit dem Senden einer Sendung/Ausführen einer Aktion. –

+0

Wenn Sie 'SomeAction' außerhalb von' BroadcastReceiver' extrahieren, können Sie anstelle eines Empfängers 'SomeAction' abonnieren. Noch mehr werden Sie in der Lage sein, Komponententest zu schreiben :) – mklimek

+0

Ich sehe was du meinst. Ja, klingt wie eine Lösung. Ich meinte mehr wie das öffentliche Event Action OnMyAction; in meinen BR, erhalte einen Verweis auf meinen BR und abonniere dann diesen Event. –

Verwandte Themen