Можно ли использовать один BroadcastReceiver для нескольких IntentServices?

Обычно для одного IntentService вы можете определить приемник широковещательного приемника, например, в методе onCreate() Activity (например)

broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        //get stuff from the intent and do whatever you want  
    }
};

И вы регистрируете получателя следующим образом (также в onCreate()):

LocalBroadcastManager.getInstance(this)
    .registerReceiver(broadcastReceiver, new IntentFilter("my_intent_service"));

И тогда вы запускаете IntentService с:

Intent intent = new Intent(this, MyIntentService.class);
startService(intent);

А в IntentService вы отправляете сообщения обратно получателю с помощью:

Intent broadcastIntent = new Intent("my_intent_service");
broadcastIntent.putExtra("whateverData", whateverData);
LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent);

который вызывает onReceive метод, описанный ранее.

А затем, чтобы отменить регистрацию получателей, в методе onDestroy вы можете сделать:

  LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver);

В файле Manifest вы добавляете для своего сервиса:

<service
    android:name=".MyIntentService"
    android:exported="false" />

Я хочу получать трансляции от нескольких IntentServices в одной и той же деятельности.

Вам нужен один приемник для IntentService? Как, если я сделаю n IntentServices мне нужно зарегистрироваться n приемники, сделать n слушатель и незарегистрированный n ресиверы в онДестрой?

2 ответа

Решение

Да, вы можете использовать один широковещательный приемник в одном действии, которое будет обрабатывать несколько целей для разных служб. Я бы порекомендовал добавить несколько intentFilter в ваш приемник вещания, чтобы отличить, от какой службы вы получаете вещание.

Способ фильтрации нескольких actions с одним BroadcastReceiver это добавить их в IntentFilter:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("my_intent_service1"); // Action1 to filter
intentFilter.addAction("my_intent_service2"); // Action2 to filter
LocalBroadcastManager.getInstance(this).registerReceiver(mBroadcastReceiver, intentFilter);

И в твоем BroadcastReceiver:

private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("my_intent_service1")) {
            // Action 1
        } else if (intent.getAction().equals("my_intent_service2")) {
            // Action 2
        }
    }
};
Другие вопросы по тегам