Android - Можно ли объявить получателя Local Broadcast в файле манифеста?
Я объявил мой получатель в моем манифесте:
<receiver
android:name=".MyTestReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.ACTION_TEST"/>
</intent-filter>
</receiver>
А вот мой класс MyTestReceiver:
public class MyTestReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if ("com.example.ACTION_TEST".equals(action)) {
Toast.makeText(context, "Test!", Toast.LENGTH_SHORT).show();
}
}
}
Но когда я выполняю этот код из другого места в моем приложении:
Intent intent = new Intent("com.example.ACTION_TEST");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
... местная трансляция не получена (т. е. тост не показан).
Вопросы:
- Можно ли зарегистрировать локальный приемник вещания в манифесте?
- Если да, правильно ли я объявил свой местный приемник?
- Если в манифесте невозможно объявить локального широковещательного получателя, а я его
Application
вместо этого подкласс, будет ли он иметь ту же "область видимости", что и получатель, объявленный в манифесте? (Я имею в виду, будет ли он получать трансляции в тех же условиях / ситуациях, как если бы он был объявлен в манифесте?) - Если есть разница между указанием получателя в манифесте, чем в моем
Application
подкласс, нужно ли мне использовать обычные (не локальные) трансляции, а не локальные трансляции? (В настоящем приложении локальная широковещательная рассылка будет отправлена, когда мой IntentService завершит свою работу. IntentService будет вызвано push-сообщением FCM.)
NB. Все, что я могу найти об этом в документации:
Примечание: чтобы зарегистрироваться для местных трансляций, позвоните
LocalBroadcastManager.registerReceiver(BroadcastReceiver, IntentFilter)
вместо.
... которая не решает основной вопрос о том, можете ли вы указать получателя в манифесте.
1 ответ
Можно ли зарегистрировать локальный приемник вещания в манифесте?
Нет.
и вместо этого я объявляю его в моем подклассе Application, будет ли он иметь ту же "область видимости", что и получатель, объявленный в манифесте? (Я имею в виду, будет ли он получать трансляции в тех же условиях / ситуациях, как если бы он был объявлен в манифесте?)
Ну нет. Зарегистрированный манифест получатель предназначен для системных трансляций, происходящих из любого процесса. LocalBroadcastManager
локально, для "трансляций" внутри вашего собственного процесса.
Вы можете зарегистрировать получателя на LocalBroadcastManager
в вашем Application
(например, в его onCreate()
), но я подозреваю, что есть лучшие решения для любой проблемы, которую вы пытаетесь решить.
В реальном приложении локальная трансляция будет отправлена, когда мой In tentService завершит свою работу.
Затем получатель должен быть зарегистрирован в деятельности или фрагменте, который должен знать о том, что эта работа завершена. Ваш Application
вряд ли нужно знать о том, что работа завершена, как если бы она IntentService
можно просто вызвать метод на Application
и обойти все эти вещательные вещи.