Можно ли использовать один 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
}
}
};