Подтвердить что ты не робот

Android BroadcastReceiver без фильтра намерения

Я встретил что-то подобное в AndroidManifest.xml:

<receiver android:name="com.testco.test.TestReceiver"/>

Вышеупомянутый TestReceiver расширяет класс BroadcastReceiver. Я думал, что получатель получит все намерения, но, по-видимому, это не так, и это не сработает, если я не добавлю в него теги фильтра намерения. Итак, что он делает, если у него нет фильтра намерения? Это опечатка или она действительно что-то делает?

UPDATE: я понял это с помощью этой ссылки Попытка иметь широковещательный приемник без фильтра

Вместо вызова широковещательной передачи с обычным идентификатором String вы можете установить строку действия в намерение, а затем передать ее. Пример кода для справки:

Intent notifyIntent = new Intent(getApplicationContext(), TestReceiver.class);
notifyIntent.setAction("RECEIVE");
sendBroadcast(notifyIntent);

Обработка в BroadcastReceiver одинакова.

4b9b3361

Ответ 1

Фильтр Intent необходим в случае неявных намерений, и если фильтр намерения не указан, он должен быть явно вызван. Чтобы вызвать этот приемник, вам нужно вызвать:

Intent intent = new Intent(getApplicationContext(), com.testco.test.TestReceiver.class);
sendBroadcast(intent);`

Ответ 2

Из документации:

android: экспортировано: может ли приемник вещания принимать сообщения из источников за пределами его приложения - "правда", если это возможно, и "false" , если нет. Если "false" , единственные сообщения, получаемые широковещательным приемником могут получать те, которые отправляются компонентами одного и того же приложения или приложения с тем же идентификатором пользователя.

Значение по умолчанию зависит от того, содержит ли широковещательный приемник фильтры намерений. Отсутствие каких-либо фильтров означает, что он может быть вызван только объектами Intent, которые определяют его точное имя класса. Это означает, что приемник предназначен только для внутреннего использования приложения (так как другие обычно не знают имя класса). Поэтому в этом случае значением по умолчанию является "false" . С другой стороны, наличие по меньшей мере одного фильтра подразумевает, что широковещательный приемник предназначен для приема сигналов, транслируемых системой или другими приложениями, поэтому значение по умолчанию является "истинным".

Таким образом, получатель будет улавливать Intents, транслируемые вашим приложением.

Ответ 3

Вам необходимо зарегистрировать получателя, указав намерения, которые вы хотите получить, и если вы хотите получить все намерения, укажите его.

Intent и Intent Filter четко упоминаются в API, как они функционируют. Концепция всех намерений не поддерживается в публичном API.

Примечание. Вы можете использовать этот тип приемника в своем приложении, отправив трансляцию в своем приложении.

Ответ 4

Тег

<receiver android:name="com.testco.test.TestReceiver"/> скажет android os, что я его получаю. он не скажет, за какое событие он собирался слушать. Ваш фильтр намерений определит, для какого события вы хотите перечислить. например,

<receiver android:name="com.testco.test.TestReceiver"/>
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

этот код говорит android os, что, я получатель, и я перечисляю событие загрузки. Поэтому, когда пользователь перезагрузит свой телефон, этот бранд-приемник будет вызван.