В моей консоли разработчика люди продолжают сообщать об ошибке, которую я не могу воспроизвести на любом своем телефоне. Один человек оставил сообщение о том, что он получает его, когда пытается открыть экран настроек моей службы аккумуляторов. Как видно из ошибки, там написано, что получатель не зарегистрирован.
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)
Я регистрируюсь в моем 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);
}
Отмените регистрацию в onDestroy, а также с предпочтительным слушателем
@Override
public void onDestroy(){
super.onDestroy();
unregisterReceiver(batteryNotifyReceiver);
}
а это мой ресивер в сервисе
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);
}
}
есть идеи, почему они получают эту ошибку?
LocalBroadcastManager.getInstance(context).unregisterReceiver()
илиcontext.unregisterReceiver()
Будьте осторожны, когда вы регистрируетесь
вы не можете отменить регистрацию
вы должны использовать
или приложение выйдет из строя, зарегистрируйтесь следующим образом:
источник
Используйте этот код везде для unregisterReceiver:
источник
Как упоминалось в других ответах, создается исключение, потому что каждый вызов
registerReceiver
не соответствует ровно одному вызовуunregisterReceiver
. Почему нет?Activity
Не всегда имеет соответствующийonDestroy
вызов для каждогоonCreate
вызова. Если системе не хватает памяти, ваше приложение удаляется без вызоваonDestroy
.Правильное место для
registerReceiver
звонка - этоonResume
звонок иunregisterReceiver
входonPause
. Эта пара вызовов всегда совпадает. См. Схему жизненного цикла Activity для получения более подробной информации. http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycleВаш код изменится на:
источник
РЕДАКТИРОВАТЬ: Это ответ на иназарук и электрическую головку ... Я столкнулся с аналогичной проблемой и обнаружил следующее ...
Здесь есть давняя ошибка для этой проблемы: http://code.google.com/p/android/issues/detail?id=6191
Похоже, это началось с Android 2.1 и с тех пор присутствует во всех выпусках Android 2.x. Я не уверен, что проблема в Android 3.x или 4.x.
В любом случае, этот пост StackOverflow объясняет, как правильно решить проблему (это не выглядит актуальным по URL-адресу, но я обещаю, что это так)
Почему при скольжении клавиатуры происходит сбой моего приложения?
источник
Я использовал блок try - catch, чтобы временно решить проблему.
источник
Объявите получателя как null и затем поместите методы регистрации и отмены регистрации в onResume () и onPause () действия соответственно.
источник
Когда компонент пользовательского интерфейса, регистрирующий BR, уничтожается, BR также уничтожается. Следовательно, когда код отменяет регистрацию, возможно, BR уже был уничтожен.
источник
Для всех, кто столкнется с этой проблемой, и они попробовали все, что было предложено, и ничего не работает, вот как я отсортировал свою проблему, вместо того, чтобы
LocalBroadcastManager.getInstance(this).registerReceiver(...)
сначала создать локальную переменную типа LocalBroadcastManager,И использовал эту переменную для выполнения регистрации и отмены регистрации на широковещательном приемнике, то есть
и
источник
Предположим, ваш
broadcastReceiver
определяется следующим образом:Если вы используете
LocalBroadcast
Activity, то отмените регистрацию следующим образом:Если вы используете
LocalBroadcast
фрагмент, то отмените регистрацию следующим образом:Если вы используете обычную трансляцию в Activity, вы отмените регистрацию следующим образом:
Если вы используете обычную трансляцию во фрагменте, то отмените регистрацию следующим образом:
источник