Unregistering Android Broadcast Receiver в onReceive выбрасывает «Получатель не зарегистрирован»

У меня есть BroadcastReceiver для одноразового использования.

Я регистрирую его в Activity. Я не могу поместить onPause unregisterReceiver() в onPause потому что он должен оставаться onPause даже если действие приостановлено или уничтожено.

Я хочу, чтобы BroadcastReceiver отменил регистрацию, когда это будет сделано, примерно так:

 public class SmsReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { // do some code.. context.unregisterReceiver(this) } } 

Но это вызывает исключение: Receiver not registered.

BroadcastReceiver существует только во время выполнения его onReceive() . Таким образом, это оценивается в случае выброса при каждом запуске / приеме в эфир. См. Жизненный цикл вещательного приемника . Для динамической регистрации / отмены регистрации BroadcastReceiver s вы должны помнить экземпляр вашего приемника в onPause() чтобы зарегистрировать его снова во время onResume() .

Я знаю, что у этого вопроса уже есть ответ. Но попробуйте этот код

Этот код предназначен для BatteryInfo . И это сработало.

 private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() { @Override public void onReceive(Context arg0, Intent intent) { // TODO Auto-generated method stub int level = intent.getIntExtra("level", 0); Log.i("Battery", String.valueOf(level) + "%"); arg0.unregisterReceiver(mBatInfoReceiver); } }; //Below code is the Code which attaches the reciever put this code in which ever place you want. this.registerReceiver(this.mBatInfoReceiver, new IntentFilter( Intent.ACTION_BATTERY_CHANGED)); 

Ссылка для прикрепления StackOverFlow / Tutorial

Просто добавьте вызов метода к Activity, в котором вы его зарегистрировали, и в этом методе отмените регистрацию получателя. Таким образом, вы знаете, что его работа выполнена.

Однако приемник не будет работать, если действие приостановлено или будет приостановлено. Вы должны объявить его в манифесте или зарегистрировать его в долговременном сервисе, чтобы он работал вне жизни. Насколько я знаю, вы не можете отменить регистрацию получателя, объявленного в манифесте, потому что вы не получаете экземпляр, с которым он зарегистрирован. Но вызов метода в Службу, чтобы отменить регистрацию, должен работать.

Если вам просто нужен рабочий для разового использования, объявите экспортированный IntentService в манифесте с действием, которое вы передаете. Этот IntentService будет запущен, когда будет получено намерение, и будет дано намерение, которое его запустило, а затем, когда это будет выполнено, оно прекратится само по себе.

Я столкнулся с одной и той же проблемой, на самом деле правильным ответом является LocalBroadcastManager.getInstance(context).unregisterReceiver(this); Но не context.unregisterReceiver(this)

Вы пробовали отменить регистрацию получателя из Службы / Действия? Может быть, есть проблема, если вы позвоните от приемника, чтобы отменить регистрацию.

Возможно, вы уже зарегистрировали его в другом месте в своей программе, но вряд ли это может звучать. Может быть, где-то перед вашим context.unregisterReceiver , но в методе onReceive вы вызываете действие, которое приводит к неосуществлению получателя до достижения context.unregisterReceiver .

Просто убедитесь, что вы не регистрируете приемник как можно меньше мест, предпочтительно – ровно один.

Возможно, проблема заключается в том, что вы пытаетесь отменить регистрацию получателя из контекста получателя , а не в контексте, где он был первоначально зарегистрирован.