Подтвердить что ты не робот

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

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

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

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

public class SmsReceiver extends BroadcastReceiver {

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Этот код предназначен для 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));

Ссылка для прикрепления fooobar.com/questions/105629/.../Tutorial

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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