2012-01-30 5 views
12

я сталкивался что-то вроде этого в AndroidManifest.xml:Android BroadcastReceiver без намерения фильтра

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

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

UPDATE: Я понял это с помощью этой ссылки Trying to have a Broadcast Receiver with No filter

Вместо вызова радиопередачи с обычным идентификатором Струнного, вы можете установить строку действий намерению, а затем транслировать его. Код примера для справки:

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

Обращение с BroadcastReceiver одинаково.

+0

Кто бы ни написал этот код, скажите им, что их стиль действия не соответствует стандарту. Он должен следовать за com.packagename.intent.messagehere, это стандарт, который был помещен и как таковой должен соблюдаться. – JoxTraex

ответ

6

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

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

Эй, Алекс, было время. Я получил быстрый ответ на ваш ответ. Когда вы говорите неявное, означает ли это, когда может потребоваться несколько разных действий? – Andy

+0

Неявные намерения - это намерения, в которых мы не указываем целевой компонент явно, целевой компонент определяется фильтрами системы через целевые фильтры. – jeet

2

Из documentation:

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

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

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

0

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

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

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

0

<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, что я принимаю, и я перечисляю событие загрузки.Поэтому, когда пользователь перезагрузит свой телефон, этот бранд-приемник будет вызван.

Смежные вопросы