#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 в ваш широковещательный приемник, чтобы различать, из какой службы вы получаете трансляцию.