2016-07-13 2 views
5
<receiver 
     android:name="MyReceiver" 
     android:enabled="true" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

Я не понимаю, если это необходимо для уведомления. Если бы это было так, любое приложение могло бы позвонить моему получателю с этими действиями? Итак, если я делаю это ложным, система может отправлять действия моему получателю?Android: в чем смысл атрибута экспортируемого приемника?

+0

Просто прочтите [официальную документацию] (https://developer.android.com/guide/topics/manifest/receiver-element.html) – dipdipdip

+0

, например: «Будет ли широковещательный приемник получать сообщения из источников за пределами его применение ".... что это означает наружу? Связано ли это с системой? – user3290180

ответ

11

Я не понимаю, если это необходимо для уведомления. Если это правда, любое приложение может вызвать мой приемник с этими действиями? Итак, если я сделаю это ложным , система может отправить свои действия моему ресиверу?

На самом деле, другие приложения не могут «позвонить получателю». Другие приложения могут просто отправлять широковещательную рассылку Intent s. Затем система вызовет всех зарегистрированных получателей.

В общем, вы не должны беспокоиться об этом. Большинство из этих трансляций Intent s защищены, так что только системные приложения могут транслировать их в любом случае. Например, попытка другого приложения для трансляции BOOT_COMPLETED просто игнорируется. Что произойдет, если ваш BroadcastReceiver будет запущен приложением-изгоем, потому что он транслирует CONNECTIVITY_CHANGE? Наверное, ничего, потому что ваше приложение должно проверить реальное состояние подключения в onReceive() в любом случае, и если нет никаких изменений, вы можете просто проигнорировать его.

Кроме того, вам не нужно указывать android:enabled="true", потому что это состояние по умолчанию. Вам также не нужно указывать android:exported="true", потому что у вас есть <intent-filter>, прикрепленный к <receiver>, который автоматически устанавливает android:exported в true.

2

Если вы установили android: exported = "false", подразумевается, что приемник предназначен только для внутреннего использования приложения.

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

+1

Это неправильно. Если вы установите 'android: exported =" true "', приемник является общедоступным, а не внутренним. Поскольку в объявлении присутствует '<намерение-фильтр>', 'android: exported =" true "' является избыточным, потому что по умолчанию используется значение 'true', если присутствует' <намерение-фильтр> '. Если вы хотите ограничить этот приемник только приложением, вам нужно явно указать 'android: exported =" false "'. –

+1

@DavidWasser жаль мою ошибку, отредактировал мой ответ, спасибо, что заметил – SaravInfern

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

  • Нет связанных вопросов^_^