En mi consola de desarrollador, la gente sigue informando un error que no puedo reproducir en ningún teléfono que tenga. Una persona dejó un mensaje diciendo que lo entendió cuando intentaron abrir la pantalla de configuración de mi servicio de batería. Como puede ver en el error, dice que el receptor no está registrado.
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)
Me registro está en mi 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);
}
Anular el registro en onDestroy y también con un oyente de preferencia
@Override
public void onDestroy(){
super.onDestroy();
unregisterReceiver(batteryNotifyReceiver);
}
y este es mi receptor en el servicio
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);
}
}
¿Alguna idea de por qué obtendrían ese error?
LocalBroadcastManager.getInstance(context).unregisterReceiver()
ocontext.unregisterReceiver()
Tenga cuidado, cuando se registre por
no puedes cancelar el registro por
debes usar
o la aplicación se bloqueará, inicie sesión de la siguiente manera:
fuente
Utilice este código en todas partes para unregisterReceiver:
fuente
Como se mencionó en otras respuestas, la excepción se lanza porque cada llamada a
registerReceiver
no coincide exactamente con una llamada aunregisterReceiver
. Por qué no?An
Activity
no siempre tiene unaonDestroy
llamada coincidente para cadaonCreate
llamada. Si el sistema se queda sin memoria, su aplicación se desaloja sin llamaronDestroy
.El lugar correcto para poner una
registerReceiver
llamada en laonResume
llamada, yunregisterReceiver
enonPause
. Este par de llamadas siempre coincide. Consulte el diagrama del ciclo de vida de la actividad para obtener más detalles. http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycleTu código cambiaría a:
fuente
EDITAR: Esta es la respuesta para inazaruk y electrichead ... Me encontré con un problema similar y descubrí lo siguiente ...
Hay un error de larga data para este problema aquí: http://code.google.com/p/android/issues/detail?id=6191
Parece que comenzó alrededor de Android 2.1 y ha estado presente en todas las versiones de Android 2.x desde entonces. Sin embargo, no estoy seguro de si sigue siendo un problema en Android 3.xo 4.x.
De todos modos, esta publicación de StackOverflow explica cómo solucionar el problema correctamente (no parece relevante por la URL, pero prometo que lo es)
¿Por qué el deslizamiento del teclado bloquea mi aplicación?
fuente
Usé un bloque try - catch para resolver el problema temporalmente.
fuente
Declare el receptor como nulo y luego coloque los métodos register y unregister en onResume () y onPause () de la actividad respectivamente.
fuente
Cuando se destruye el componente de la interfaz de usuario que registra el BR, también se destruye el BR. Por lo tanto, cuando el código se cancela, es posible que el BR ya haya sido destruido.
fuente
Para cualquiera que se encuentre con este problema y haya intentado todo lo que se sugirió y nada todavía funciona, así es como solucioné mi problema, en lugar de hacerlo
LocalBroadcastManager.getInstance(this).registerReceiver(...)
, primero creé una variable local de tipo LocalBroadcastManager,Y usé esta variable para llevar a cabo el registro y la cancelación del registro en el receptor de transmisión, es decir
y
fuente
Supongamos que tu
broadcastReceiver
se define así:Si está utilizando
LocalBroadcast
en una actividad, así es como anulará el registro:Si está usando
LocalBroadcast
en un Fragmento, entonces así es como anulará el registro:Si está utilizando la transmisión normal en una actividad, así es como anulará el registro:
Si está utilizando la transmisión normal en un fragmento, así es como anulará el registro:
fuente