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

#android #broadcastreceiver #listener #intentservice

#Android #приемник широковещательной передачи #слушатель #intentservice

Вопрос:

Обычно для одного IntentService вы можете определить прослушиватель широковещательного приемника следующим образом в методе onCreate() действия (например)

 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);
 

В файле манифеста вы добавляете для своей службы:

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

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

Нужен ли вам один приемник для каждого IntentService? Например, если я создаю n IntentServices, нужно ли мне регистрировать n получателей, создавать n прослушиватель и отменять n регистрацию получателей в onDestroy?

Ответ №1:

Способ фильтрации нескольких 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
        }
    }
};
 

Ответ №2:

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