Динамически зарегистрированный метод ловушки onReceive () получателя широковещания не вызывается

1

Это часть необязательного задания. У меня есть Activity, динамически регистрирующая широковещательный приемник, а также запускающая IntentService. Предполагается, что получатель вещания получает намерение от IntentService после того, как он выполнит свою работу. Однако после того, как IntentService отправил широковещательную рассылку, onReceive не вызывается.

Я регистрировал выходные данные, и последний журнал, который я получаю, от IntentService после того, как это передает широковещательную рассылку. После этого я понятия не имею, как продолжить отладку.

Пожалуйста посоветуй.

Что не так с моим кодом, что метод onReceive() не вызывается?


РЕДАКТИРОВАТЬ: ОТВЕТ (от HeyAlex)

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


Скачать AtomFeedService (расширение IntentService)

  @Override
public void onHandleIntent(Intent intent) {
    List<Entry> entries = downloadAtomFeed(uri.toString());

    int requestCode = intent.getExtras().getInt(REQUEST_CODE);

    sendEntries((ArrayList<Entry>) entries,uri,requestCode);
    Log.d(TAG, "onHandleIntent: returning to MainActivity");
}


private void sendEntries(ArrayList<Entry> entries,
                         Uri url,
                         int requestCode) {

    Bundle bundle = makeReplyBundle(entries,url,requestCode);

    Intent intent = new MainActivity().makeBroadcastReceiverIntent();
    intent.putExtras(bundle);
    LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
    Log.d(TAG, "sendEntries: SENT BROADCAST");
}

private Bundle makeReplyBundle(ArrayList<Entry> entries,
                               Uri url,
                               int requestCode) {

    Bundle data = new Bundle();

    data.putParcelableArrayList(ENTRY_ARRAY_KEY,entries);

    data.putInt(REQUEST_CODE,requestCode);

    data.putString(FEED_URL,url.toString());

    if(entries == null){
        data.putInt(DOWNLOAD_RESULTS,Activity.RESULT_CANCELED);
    }else data.putInt(DOWNLOAD_RESULTS,Activity.RESULT_OK);

    return data;
}

Основная деятельность

@Override
protected void onResume() {
    super.onResume();

    IntentFilter intentFilter = new IntentFilter(DownloadStateReceiver.BROADCAST_ACTION);

    DownloadStateReceiver mDownloadStateReceiver = new DownloadStateReceiver();

    registerReceiver(mDownloadStateReceiver,intentFilter);
    android.util.Log.d(TAG, "onResume: downloadstatereceiver registered");
}

@Override
protected void onPause() {
    LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(mDownloadStateReceiver);

    super.onPause();
}


public static Intent makeBroadcastReceiverIntent() {

    Intent intent = new Intent().setAction(DownloadStateReceiver.BROADCAST_ACTION);
    return intent;
}


public class DownloadStateReceiver extends BroadcastReceiver {
   public static final String BROADCAST_ACTION =
            "myassignment.activities.BROADCAST";

    public DownloadStateReceiver() {
        android.util.Log.d(TAG, "DownloadStateReceiver: ");
    }

public void onReceive(Context context, Intent intent) {

        MainActivity.this.serviceIntentReceived(intent.getExtras());
        android.util.Log.d(TAG, "onReceive: BroadcastReceived");
    }
}   
Теги:
android-studio
broadcastreceiver
debugging
android-service

1 ответ

1
Лучший ответ

Проблема в том, что вы регистрируете BroadcastReceiver не с помощью LocalBroadcastManager. Просто сделайте свой onResume как:

 @Override
 protected void onResume() {
    super.onResume();
    IntentFilter intentFilter = new IntentFilter(DownloadStateReceiver.BROADCAST_ACTION);
    mDownloadStateReceiver = new DownloadStateReceiver();
    LocalBroadcastManager.getInstance(this).registerReceiver(mDownloadStateReceiver,intentFilter);
    android.util.Log.d(TAG, "onResume: downloadstatereceiver registered");
}
  • 0
    Оно работает! Вы спасатель!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню