Android: Contect-Record Creadcast Createvers экспортированы?
-
12-12-2019 - |
Вопрос
Если я зарегистрирую широковещательный приемник, скажем, в моей деятельности, как это,
@Override
protected void onResume() {
super.onResume();
myReceiver = new BroadcastReceiver() { ... };
IntentFilter filter = new IntentFilter("com.example.MY_ACTION");
registerReceiver(myReceiver, filter);
}
.
Это ресивер экспортируется?Если еще одно приложение транслирует com.example.MY_ACTION
, будет получено myReceiver
?
Если это так, я предполагаю, что мне нужно использовать форму registerReceiver()
, который принимает разрешение на строку, а затем определить это разрешение в моем манифесте, придавая ему высокий уровень защиты (например, подпись).Это верно?Есть ли более проще?
спасибо.
Решение
из документов API на API BroadCastreceiver:
Если вам не нужно отправлять трансляции через приложения, рассмотрим Используя этот класс с localbroadcastmanager вместо более Общие сооружения, описанные ниже.Это даст вам гораздо больше эффективное осуществление (не требуется перекрестная связь) и позволяют избежать думать о любых вопросах безопасности, связанных с другими Приложения могут получать или отправлять ваши вещания.
Таким образом, по крайней мере, вы можете держать приемник только внутри вашего приложения.
Другие советы
Чтобы понять другие работы и для моих собственных целей архивации: да, контекстно-зарегистрированные приемники
Там, кажется, не так много Документация Можно быстро подтвердить это, запустив отдельное приложение, отправляющее пользовательскую трансляцию. Я проверял это на APIS 16-29, трансляция будет получена, и поэтому каждый пакет сможет отправить на ваш приемник (который может быть ошибочным недостатком).
Чтобы решить проблему без использования локальных вещаний ( Следует использоваться везде, где это возможно ) Вы находитесь на правильном пути в определении пользовательской разрешения и ограничивая трансляции к приложениям, которые запросили разрешение . Ради полноты:
Определить и использовать пользовательское разрешение в манифесте:
<permission android:name="com.example.bcrtest.BROADCAST_PERMISSION"
android:protectionLevel="signature"/>
<uses-permission android:name="com.example.bcrtest.BROADCAST_PERMISSION" />
.
Регистрация рецепта с разрешениями:
registerReceiver(mReceiver, new IntentFilter(MY_INTENT_ACTION), "com.example.bcrtest.BROADCAST_PERMISSION", null );
.