Ich muss überprüfen, ob mein registrierter Empfänger noch registriert ist. Wenn nicht, wie überprüfe ich die Methoden?
254
Ich muss überprüfen, ob mein registrierter Empfänger noch registriert ist. Wenn nicht, wie überprüfe ich die Methoden?
Antworten:
Ich bin nicht sicher, ob die API direkt eine API bereitstellt, wenn Sie diesen Thread berücksichtigen :
quelle
Es gibt keine API-Funktion, um zu überprüfen, ob ein Empfänger registriert ist. Die Problemumgehung besteht darin, Ihren Code in a zu setzen
try catch block as done below.
quelle
null
. Aber wie Sie betont haben, gehe ich mittry catch
. Lächerlich.einfachste Lösung
im Empfänger:
in Code:
ad 1
-- als Antwort auf:
- "elleganter Weg" hinzugefügt Methode im Empfänger, um zu registrieren und Flag zu setzen
@amin - siehe Lebensdauer des im Code (nicht durch Manifesteintrag registriertes System) registrierten Empfängers :)
quelle
Ich benutze diese Lösung
quelle
Sie haben mehrere Möglichkeiten
Sie können Ihrer Klasse oder Aktivität eine Flagge hinzufügen. Fügen Sie eine boolesche Variable in Ihre Klasse ein und überprüfen Sie anhand dieses Flags, ob der Empfänger registriert ist.
Erstellen Sie eine Klasse, die den Empfänger erweitert, und verwenden Sie dort:
Singleton-Muster für nur eine Instanz dieser Klasse in Ihrem Projekt.
Implementieren Sie die Methoden, um festzustellen, ob der Empfänger registriert ist.
quelle
Sie müssen try / catch verwenden:
quelle
Sie können es einfach machen ....
1) Erstellen Sie eine boolesche Variable ...
2) Wenn Sie Ihren Rundfunkempfänger registrieren, setzen Sie ihn auf TRUE
3) In der onPause () mach es ...
Nur so, und jetzt erhalten Sie keine weitere Ausnahmefehlermeldung auf onPause ().
Tipp 1: Verwenden Sie immer den unregisterReceiver () in onPause () und nicht in onDestroy (). Tipp 2: Vergessen Sie nicht, die Variable bolBroadcastRegistred auf FALSE zu setzen, wenn Sie unregisterReceive () ausführen.
Erfolg!
quelle
Wenn Sie dies auf die Methode onDestroy oder onStop setzen. Ich denke, wenn die Aktivität erneut erstellt wurde, wurde der MessageReciver nicht erstellt.
quelle
Ich habe Intent verwendet, um Broadcast Receiver über die Handler-Instanz des Hauptaktivitätsthreads zu informieren, und habe Nachricht verwendet, um eine Nachricht an die Hauptaktivität zu übergeben
Ich habe einen solchen Mechanismus verwendet, um zu überprüfen, ob der Rundfunkempfänger bereits registriert ist oder nicht. Manchmal ist dies erforderlich, wenn Sie Ihren Broadcast-Empfänger dynamisch registrieren und nicht zweimal erstellen möchten oder wenn Sie dem Benutzer präsentieren, ob der Broadcast-Empfänger ausgeführt wird.
Hauptaktivität:
Rundfunkempfänger:
quelle
Persönlich verwende ich die Methode, unregisterReceiver aufzurufen und die Ausnahme zu schlucken, wenn sie ausgelöst wird. Ich bin damit einverstanden, dass dies hässlich ist, aber die derzeit beste Methode.
Ich habe eine Funktionsanforderung ausgelöst, um eine boolesche Methode zu erhalten, mit der überprüft werden kann, ob ein Empfänger registriert ist, der der Android-API hinzugefügt wurde. Bitte unterstützen Sie es hier, wenn Sie möchten, dass es hinzugefügt wird: https://code.google.com/p/android/issues/detail?id=73718
quelle
Ich habe Ihr Problem, ich hatte das gleiche Problem in meiner Bewerbung. Ich habe registerReceiver () mehrmals in der Anwendung aufgerufen.
Eine einfache Lösung für dieses Problem besteht darin, registerReceiver () in Ihrer benutzerdefinierten Anwendungsklasse aufzurufen. Dadurch wird sichergestellt, dass Ihr Broadcast-Empfänger in Ihrem gesamten Anwendungslebenszyklus nur als einer bezeichnet wird.
quelle
So habe ich es gemacht, es ist eine modifizierte Version der Antwort von ceph3us und bearbeitet von slinden77 (unter anderem habe ich Rückgabewerte von Methoden entfernt, die ich nicht brauchte):
Dann auf einer Aktivitätsklasse:
quelle
Ich habe diesen Code in meine übergeordnete Aktivität eingefügt
List registerReceivers = new ArrayList <> ();
quelle
Für mich hat folgendes funktioniert:
quelle
Folgendes habe ich getan, um zu überprüfen, ob der Sender bereits registriert ist, auch wenn Sie Ihre Anwendung schließen (finish ()).
Wenn Sie Ihre Anwendung zum ersten Mal ausführen, senden Sie zuerst eine Sendung, die true / false zurückgibt. Dies hängt davon ab, ob Ihr Sender noch ausgeführt wird oder nicht.
Mein Sender
Meine Hauptaktivität
quelle
Sie können Dolch verwenden , um eine Referenz dieses Empfängers zu erstellen.
Stellen Sie es zuerst bereit:
Dann injizieren Sie es, wo Sie es brauchen (mit
constructor
oder Feldinjection
)und einfach weitergeben an
registerReceiver
.Legen Sie es auch in
try/catch
Block.quelle
quelle
Überprüfen Sie einfach die NullPointerException. Wenn der Empfänger nicht existiert, dann ...
quelle