java.lang.IllegalArgumentException: Empfänger nicht registriert

9

Ich habe TrackingService-Komponente, um den Standort der Busse in meiner Stadt basierend auf Crowdsourcing zu verfolgen. Der TrackingService läuft im Hintergrund, dann werden die Daten an den Server übertragen. Ich habe eine Map-Aktivität, um den Standort der Busse anzuzeigen, den Benutzer, der in MainActivity (als Filter) ausgewählt wurde.

Der Hintergrund TrackingService wird beim Start der App in MainActivity gestartet.

Ich notiere die map -Aktivität über die aktualisierte Lcoation mit Hilfe des BroadcastReceivers wie im folgenden Code. Die Daten werden zu der Kartenaktivität abgerufen, aber ich habe das Problem, meine bReceiver aufzuheben. Ich möchte die Übertragung der Registrierung aufheben, wenn die App im Hintergrund ausgeführt wird oder wenn der Benutzer die Zurück-Taste drückt, aber ich erhalte den folgenden Fehler:

Wie kann ich es beheben?

Fehler:

%Vor%

TrackingService-Klasse:

%Vor%

Kartenaktivität:

%Vor%     
Mr Asker 27.08.2015, 21:05
quelle

3 Antworten

38

Wenn Sie sich in onCreate() registrieren, müssen Sie die Registrierung in onDestroy() aufheben. Wenn Sie die Registrierung in onStop() aufheben möchten, müssen Sie sich in onStart() registrieren.

Sehen Sie sich den Aktivitätslebenszyklus hier Ссылка

an

Der Grund dafür ist, dass onStop() aufgerufen wird, wenn Activity in den Hintergrund tritt, aber nicht unbedingt zerstört wird. Wenn der Activity in den Vordergrund zurückkehrt, wird onStart() aufgerufen, aber nicht onCreate() , so dass der BroadcastReceiver nicht erneut registriert wird. Wenn dann Activity wieder in den Hintergrund tritt, versucht onStop() , die Registrierung wieder aufzuheben, aber der Empfänger wurde nicht registriert.

Sie müssen auch den LocalBroadcastManager verwenden, um die Registrierung Ihres Empfängers aufzuheben, wenn Sie ihn wie folgt zur Registrierung verwendet haben:

%Vor%

LocalBroadcastManager ist eine Klasse aus der Support-Bibliothek :

  

Helfer, um Broadcasts von Intents für lokale Objekte innerhalb Ihres Prozesses zu registrieren und zu senden.

Dies unterscheidet sich von den gleichen Methoden in Context , die systemweite Broadcasts erlauben.

Siehe auch eine ähnliche Frage / Antwort hier .

    
ci_ 27.08.2015, 21:17
quelle
4

(Natürlich, wenn Sie möchten) Sie können sie in onStop() und onResume() registrieren oder die Registrierung aufheben, indem Sie sie einfach mit try-catch umbrechen:

try{ getActivity().registerReceiver(receiver,filter); } catch (Exception e){ // already registered } Oder

try{ getActivity().unregisterReceiver(receiver); } catch (Exception e){ // already unregistered }

    
FARID 10.04.2016 13:56
quelle
0
___ qstntxt ___

Ich habe TrackingService-Komponente, um den Standort der Busse in meiner Stadt basierend auf Crowdsourcing zu verfolgen. Der TrackingService läuft im Hintergrund, dann werden die Daten an den Server übertragen. Ich habe eine Map-Aktivität, um den Standort der Busse anzuzeigen, den Benutzer, der in MainActivity (als Filter) ausgewählt wurde.

Der Hintergrund TrackingService wird beim Start der App in MainActivity gestartet.

Ich notiere die onPostResume() -Aktivität über die aktualisierte Lcoation mit Hilfe des BroadcastReceivers wie im folgenden Code. Die Daten werden zu der Kartenaktivität abgerufen, aber ich habe das Problem, meine onResume() aufzuheben. Ich möchte die Übertragung der Registrierung aufheben, wenn die App im Hintergrund ausgeführt wird oder wenn der Benutzer die Zurück-Taste drückt, aber ich erhalte den folgenden Fehler:

Wie kann ich es beheben?

Fehler:

%Vor%

TrackingService-Klasse:

%Vor%

Kartenaktivität:

%Vor%     
___ tag123android ___ Android ist das mobile Betriebssystem von Google, das zum Programmieren oder Entwickeln von digitalen Geräten (Smartphones, Tablets, Automobile, Fernseher, Wear, Glass, IoT) verwendet wird. Verwenden Sie für Themen rund um Android Android-spezifische Tags wie android-intent, nicht intent, android-activity, nicht activity, android-adapter, nicht adapter usw. Bei anderen Fragen als der Entwicklung oder Programmierung, aber im Zusammenhang mit Android Framework, verwenden Sie Der Link: https://android.stackexchange.com. ___ qstnhdr ___ java.lang.IllegalArgumentException: Empfänger nicht registriert ___ answer32259587 ___

Wenn Sie sich in onPause() registrieren, müssen Sie die Registrierung in super.onPause() aufheben. Wenn Sie die Registrierung in %code% aufheben möchten, müssen Sie sich in %code% registrieren.

Sehen Sie sich den Aktivitätslebenszyklus hier Ссылка

an

Der Grund dafür ist, dass %code% aufgerufen wird, wenn %code% in den Hintergrund tritt, aber nicht unbedingt zerstört wird. Wenn der %code% in den Vordergrund zurückkehrt, wird %code% aufgerufen, aber nicht %code% , so dass der %code% nicht erneut registriert wird. Wenn dann %code% wieder in den Hintergrund tritt, versucht %code% , die Registrierung wieder aufzuheben, aber der Empfänger wurde nicht registriert.

Sie müssen auch den %code% verwenden, um die Registrierung Ihres Empfängers aufzuheben, wenn Sie ihn wie folgt zur Registrierung verwendet haben:

%Vor%

%code% ist eine Klasse aus der Support-Bibliothek :

  

Helfer, um Broadcasts von Intents für lokale Objekte innerhalb Ihres Prozesses zu registrieren und zu senden.

Dies unterscheidet sich von den gleichen Methoden in %code% , die systemweite Broadcasts erlauben.

Siehe auch eine ähnliche Frage / Antwort hier .

    
___ answer36530677 ___

(Natürlich, wenn Sie möchten) Sie können sie in %code% und %code% registrieren oder die Registrierung aufheben, indem Sie sie einfach mit try-catch umbrechen:

%code% Oder

%code%

    
___ antwort43314914 ___

Beachten Sie, dass Sie sich im selben Kontext registrieren und die Registrierung aufheben müssen. Registrieren Sie sich beispielsweise nicht mit dem Anwendungskontext und heben Sie nicht die Registrierung mit dem Aktivitätskontext auf.

Tu das nicht

%Vor%

Mach das stattdessen (innerhalb einer Aktivität)

%Vor%

Normalerweise registriere ich mich in %code% oder %code% und entferne die Registrierung in %code% nach dem %code% Aufruf.

Beispiele:

%Vor% %Vor%     
___
Markymark 10.04.2017 04:18
quelle

Tags und Links