Отмена регистрации Android Broadcast Receiver в onReceive выдает сообщение «Приемник не зарегистрирован» - PullRequest
22 голосов
/ 10 февраля 2011

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

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

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

public class SmsReceiver extends BroadcastReceiver {

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

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

Ответы [ 7 ]

25 голосов
/ 13 февраля 2011

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

10 голосов
/ 24 декабря 2012

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

Этот код предназначен для 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 / Учебное пособие

3 голосов
/ 05 ноября 2012

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

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

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

2 голосов
/ 07 ноября 2013

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

0 голосов
/ 24 октября 2012

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

0 голосов
/ 10 февраля 2011

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

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

0 голосов
/ 10 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...