In meiner Entwicklerkonsole wird ständig ein Fehler gemeldet, den ich auf keinem Telefon reproduzieren kann. Eine Person hat eine Nachricht hinterlassen, dass sie diese erhält, wenn sie versucht, den Einstellungsbildschirm meines Batteriedienstes zu öffnen. Wie Sie dem Fehler entnehmen können, heißt es, dass der Empfänger nicht registriert ist.
java.lang.RuntimeException: Unable to stop service .BatteryService@4616d688: java.lang.IllegalArgumentException: Receiver not registered: com.app.notifyme.BatteryService$BatteryNotifyReceiver@4616d9d0
at android.app.ActivityThread.handleStopService(ActivityThread.java:3164)
at android.app.ActivityThread.access$3900(ActivityThread.java:129)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2173)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4701)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: Receiver not registered:com..BatteryService$BatteryNotifyReceiver@4616d9d0
at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:805)
at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:859)
at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331)
at com.app.notifyme.BatteryService.onDestroy(BatteryService.java:128)
at android.app.ActivityThread.handleStopService(ActivityThread.java:3150)
Ich registriere mich in meinem onCreate
@Override
public void onCreate(){
super.onCreate();
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_POWER_CONNECTED);
filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
registerReceiver(batteryNotifyReceiver,filter);
pref.registerOnSharedPreferenceChangeListener(this);
}
Heben Sie die Registrierung in onDestroy und auch bei einem bevorzugten Listener auf
@Override
public void onDestroy(){
super.onDestroy();
unregisterReceiver(batteryNotifyReceiver);
}
und das ist mein empfänger im service
private final class BatteryNotifyReceiver extends BroadcastReceiver {
boolean connected;
@Override
public void onReceive(Context context, Intent intent) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor edit = prefs.edit();
updatePreferences(prefs);
level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
if(intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)){
connected = true;
}else if(intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)){
connected = false;
}else if(intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)){
if(level < lastLevel){
if(level > 40){
edit.putBoolean("first", false).commit();
edit.putBoolean("second", false).commit();
edit.putBoolean("third", false).commit();
edit.putBoolean("fourth",false).commit();
edit.putBoolean("fifth", false).commit();
}
if(level == 40){
if(!first){
notification(context,battColor,battBlink,battVib,battSound);
edit.putBoolean("first", true).commit();
}
}else if(level == 30){
if(!second){
notification(context,battColor,battBlink,battVib,battSound);
edit.putBoolean("second", true).commit();
}
}else if(level == 20){
if(!third){
notification(context,battColor,battBlink,battVib,battSound);
edit.putBoolean("third", true).commit();
}
}else if(level == 15){
if(!fourth){
notification(context,battColor,battBlink,battVib,battSound);
edit.putBoolean("fourth", true).commit();
}
}else if(level == 5){
if(!fifth){
notification(context,battColor,battBlink,battVib,battSound);
edit.putBoolean("fifth", true).commit();
}
}
lastLevel = temp;
}
}
Intent i = new Intent(context,BatteryNotifyReceiver.class);
context.startService(i);
}
}
Irgendeine Idee, warum sie diesen Fehler bekommen würden?
LocalBroadcastManager.getInstance(context).unregisterReceiver()
odercontext.unregisterReceiver()
Seien Sie vorsichtig, wenn Sie sich bei registrieren
Sie können sich nicht abmelden
Sie müssen verwenden
oder App stürzt ab, protokollieren Sie wie folgt:
quelle
Verwenden Sie diesen Code überall für unregisterReceiver:
quelle
Wie in anderen Antworten erwähnt, wird die Ausnahme ausgelöst, da nicht jeder Anruf an
registerReceiver
mit genau einem Anruf an übereinstimmtunregisterReceiver
. Warum nicht?An
Activity
hat nicht immeronDestroy
für jedenonCreate
Anruf einen passenden Anruf. Wenn dem System der Speicher ausgeht, wird Ihre App ohne Aufruf entferntonDestroy
.Der richtige Ort zum Tätigen eines
registerReceiver
Anrufs befindet sich imonResume
Anruf undunregisterReceiver
inonPause
. Dieses Anrufpaar ist immer übereinstimmend. Weitere Informationen finden Sie im Aktivitätslebenszyklusdiagramm. http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycleIhr Code würde sich ändern zu:
quelle
EDIT: Dies ist die Antwort für Inazaruk und Electrichead ... Ich war auf ein ähnliches Problem gestoßen und fand Folgendes heraus ...
Hier gibt es einen langjährigen Fehler für dieses Problem: http://code.google.com/p/android/issues/detail?id=6191
Es sieht so aus, als ob es um Android 2.1 herum gestartet wurde und seitdem in allen Android 2.x-Versionen vorhanden ist. Ich bin mir nicht sicher, ob es in Android 3.x oder 4.x immer noch ein Problem ist.
Wie auch immer, dieser StackOverflow-Beitrag erklärt, wie man das Problem richtig umgeht (es sieht nach der URL nicht relevant aus, aber ich verspreche es).
Warum stürzt die Tastatur-Folie in meiner App ab?
quelle
Ich habe einen Try-Catch-Block verwendet, um das Problem vorübergehend zu lösen.
quelle
Deklarieren Sie den Empfänger als null und setzen Sie dann die Register- und Aufhebungsmethoden in onResume () bzw. onPause () der Aktivität.
quelle
Wenn die UI-Komponente, die den BR registriert, zerstört wird, wird auch der BR zerstört. Wenn der Code die Registrierung aufhebt, wurde der BR möglicherweise bereits zerstört.
quelle
Für jeden, der auf dieses Problem
LocalBroadcastManager.getInstance(this).registerReceiver(...)
stößt und alles versucht hat, was vorgeschlagen wurde und nichts funktioniert, habe ich mein Problem auf diese Weise sortiert, anstatt zuerst eine lokale Variable vom Typ LocalBroadcastManager zu erstellen.Und diese Variable verwendet, um das Registrieren und Aufheben der Registrierung auf dem Rundfunkempfänger durchzuführen, das heißt
und
quelle
Nehmen wir an, Ihr
broadcastReceiver
ist wie folgt definiert:Wenn Sie
LocalBroadcast
in einer Aktivität verwenden, können Sie die Registrierung auf folgende Weise aufheben:Wenn Sie
LocalBroadcast
in einem Fragment verwenden, heben Sie die Registrierung auf folgende Weise auf:Wenn Sie in einer Aktivität eine normale Sendung verwenden, können Sie die Registrierung auf folgende Weise aufheben:
Wenn Sie eine normale Sendung in einem Fragment verwenden, können Sie die Registrierung auf folgende Weise aufheben:
quelle