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

... местная трансляция не получена (т. е. тост не показан).

Вопросы:

  1. Можно ли зарегистрировать локальный приемник вещания в манифесте?
  2. Если да, правильно ли я объявил свой местный приемник?
  3. Если в манифесте невозможно объявить локального широковещательного получателя, а я его Application вместо этого подкласс, будет ли он иметь ту же "область видимости", что и получатель, объявленный в манифесте? (Я имею в виду, будет ли он получать трансляции в тех же условиях / ситуациях, как если бы он был объявлен в манифесте?)
  4. Если есть разница между указанием получателя в манифесте, чем в моем Application подкласс, нужно ли мне использовать обычные (не локальные) трансляции, а не локальные трансляции? (В настоящем приложении локальная широковещательная рассылка будет отправлена, когда мой IntentService завершит свою работу. IntentService будет вызвано push-сообщением FCM.)

NB. Все, что я могу найти об этом в документации:

Примечание: чтобы зарегистрироваться для местных трансляций, позвоните LocalBroadcastManager.registerReceiver(BroadcastReceiver, IntentFilter) вместо.

... которая не решает основной вопрос о том, можете ли вы указать получателя в манифесте.

1 ответ

Можно ли зарегистрировать локальный приемник вещания в манифесте?

Нет.

и вместо этого я объявляю его в моем подклассе Application, будет ли он иметь ту же "область видимости", что и получатель, объявленный в манифесте? (Я имею в виду, будет ли он получать трансляции в тех же условиях / ситуациях, как если бы он был объявлен в манифесте?)

Ну нет. Зарегистрированный манифест получатель предназначен для системных трансляций, происходящих из любого процесса. LocalBroadcastManager локально, для "трансляций" внутри вашего собственного процесса.

Вы можете зарегистрировать получателя на LocalBroadcastManager в вашем Application (например, в его onCreate()), но я подозреваю, что есть лучшие решения для любой проблемы, которую вы пытаетесь решить.

В реальном приложении локальная трансляция будет отправлена, когда мой In tentService завершит свою работу.

Затем получатель должен быть зарегистрирован в деятельности или фрагменте, который должен знать о том, что эта работа завершена. Ваш Application вряд ли нужно знать о том, что работа завершена, как если бы она IntentService можно просто вызвать метод на Application и обойти все эти вещательные вещи.