Проблема с BroadcastReceiver (ошибка зарегистрированного приемника)

Возможный дубликат:
Ошибка регистрации зарегистрированного получателя?

У меня есть TabActivity, а «content» каждого TabSpec – мой собственный класс GuideListActivity.

Есть семь вкладок (по одному для каждого дня недели), и каждый GuideListActivity показывает информацию о TV Guide для одного ТВ-канала / один день недели.

TabActivity поддерживает номер канала, на котором пользователь просматривает информацию о руководстве, и когда пользователь меняет информацию о другом канале, TabActivity использует sendStickyBroadcast () с Intent, определяющим информацию о канале для отображения (сначала удалив любую предыдущую липкую трансляцию, которая может существовать ).

Это работает, но я получаю кажущиеся случайными проблемы с BroadcastReceiver GuideListActivity, которые слишком часто игнорируются (даже в коде уровня «Beta»). Ошибка, которую я вижу, это …

java.lang.RuntimeException: Unable to pause activity {com.mycompany.mypackage/com.mycompany.mypackage.GuideListActivity}: java.lang.IllegalArgumentException: Receiver not registered: com.mycompany.mypackage.GuideListActivity$ChannelChangeListener@462ebe20 

Каждый GuideListActivity поддерживает собственный пример BroadcastReceiver (очевидно) …

 public class GuideListActivity extends ListActivity { private ChannelChangeListener listener = null; private Intent ChannelChangeListenerIntent = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); listener = new ChannelChangeListener(); } @Override protected void onResume(){ super.onResume(); if (ChannelChangeListenerIntent == null) ChannelChangeListenerIntent = registerReceiver(listener, new IntentFilter(packageName + ".GUIDE_UPDATE")); } @Override protected void onPause() { super.onPause(); if (ChannelChangeListenerIntent != null) unregisterReceiver(listener); // <== EXCEPTION THROWN HERE } // Nested 'listener' class public class ChannelChangeListener extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Handle intent } } } 

Поскольку я сказал, что это кажется случайным – я могу придерживаться одного канала и нажимать 1, 2, возможно, 3 или даже все 7 вкладок, затем следующий клик, исключение будет выбрано. В других случаях это происходит при втором щелчке.

Любая помощь, чтобы объяснить это и как я мог бы это исправить, был бы очень оценен.

Установите ChannelChangeListenerIntent в null в onPause :

 if (ChannelChangeListenerIntent != null) { unregisterReceiver(listener); ChannelChangeListenerIntent = null; } 

Активность может быть возобновлена ​​после паузы, поэтому активность может не регистрировать слушателя во втором вызове onResume .

Войдите в свой манифест и зарегистрируйте широковещательный приемник. И вместе с этим убедитесь, что вам разрешено получать эту «конкретную» трансляцию в вашем списке разрешений.

Еще одна вещь, которую нужно проверить, – убедиться, что ваша логика включения и выключения приемника (регистрация / отмена регистрации) протекает правильно.