Должен ли Android BroadcastReceiver иметь тег Intent-Filter?

Мне удалось запустить мой BroadcastReceiver с помощью этого:

<receiver
        android:name=".AlarmReceiver"
        android:enabled="true"
        android:exported="false">
</receiver>

Как видите, нет <intent-filter>. Он вызывается правильно с правильными Intent дополнениями. Но я огляделся и не понимаю, нужен он мне или нет? У меня есть метод setAction(), вызываемый для моих Intent, но чтобы сделать их уникальными по сравнению с другими, чтобы обеспечить конкретную проблему с уведомлениями, фактически не используя строку этого действия. Но в чем именно корреляция? Заранее спасибо.

Intent intent = new Intent(this.getContext(), AlarmReceiver.class);
        intent.setAction("com.something"+System.currentTimeMillis());
        //... extras are here
        PendingIntent pi = PendingIntent.getBroadcast(this.getContext(), 123, intent, PendingIntent.FLAG_CANCEL_CURRENT|Intent.FILL_IN_DATA);
AlarmManager alarm = (AlarmManager)getContext().getSystemService(Activity.ALARM_SERVICE);
        alarm.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pi);

Использование этого с тем, что у меня есть в файле манифеста, работает.

ИЗМЕНИТЬ Я нашел это в блоге разработчиков Android, и в нем говорится следующее:


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

Явные намерения указывают одно явное «кому», которому они должны соответствовать, через ComponentName. Независимо от того, что еще находится в Intent, оно связано только с точным именем пакета манифеста и именем класса, указанными в его ComponentName.


Я все еще немного сбит с толку этим объяснением, но оно кажется наиболее близким к тому, что я должен делать. Поэтому я уверен, что использую неявное намерение. Вопрос в том, нормально ли, что я опускаю <intent-filter>? Я сопоставляю его с определенным классом. Может быть, не существует фактического действия, связывающего их вместе, но достаточно ли класса?


person Andy    schedule 18.07.2012    source источник


Ответы (2)


<intent-filter> требуется, когда вы хотите запустить свой приемник, используя неявные намерения, если вы всегда используете явные намерения для запуска своего широковещательного приемника, то фильтры намерений не требуются.

см. это сообщение SO.

person Eight    schedule 18.07.2012
comment
Большое спасибо за эту ссылку. Я хорошо знаю этого парня, поэтому спрошу его напрямую. - person Andy; 18.07.2012

Весь способ работы широковещательного приемника заключается в использовании фильтра намерений для улавливания определенных широковещательных намерений, которые отправляются в системе. Поэтому, если вы не дадите получателю никакого фильтра намерений, ему НИЧЕГО не будет отправлено, и его код никогда не будет выполнен.

Прочтите документацию Intent и узнайте, как Intent разрешает IPC.

Обновить

Также возможно, что без каких-либо объявлений он мог бы получать все общедоступные трансляции и то, как ваш код обрабатывает это. Он игнорирует все трансляции, кроме тех, о которых он заботится. Я никогда не делал такой реализации, потому что я следую стандарту. Который должен объявить либо динамическим прослушивателем (программным), либо статическим прослушивателем (объявление XML), где динамический прослушиватель будет иметь свой фильтр намерений, установленный в коде.

person JoxTraex    schedule 18.07.2012
comment
Это действительно странно, потому что мой работает просто отлично. Как я уже сказал, мой BroadcastReceiver правильно получает все дополнения о намерениях. Но у меня есть вышеуказанное в моем файле манифеста. О-о-о, я бы обычно поверил на слово более опытным людям, но в данном случае, похоже, это неправда. Есть идеи, почему? - person Andy; 18.07.2012
comment
Вы должны просто следовать стандарту, установленному Google, как я и сказал, если вы посмотрите на их исходный код, эта идея используется много раз. На самом деле не нужно подвергать сомнению это, все это ... IPC. - person JoxTraex; 18.07.2012
comment
Также возможно, что без каких-либо объявлений он мог бы получать все общедоступные трансляции и то, как ваш код обрабатывает это. Он игнорирует все трансляции, кроме тех, о которых он заботится. Что приводит к тому, что этот код выполняет больше, чем нужно. - person JoxTraex; 18.07.2012
comment
Хм, это интересно, и я очень ценю совет. У меня есть одна проблема. Мне нужно установить setAction() именно таким образом, если нет, то возникает проблема с настройкой уведомлений. Это означает, что действие должно быть уникальным... - person Andy; 18.07.2012
comment
Вам нужно обновить свой пост с подробностями вашей конкретной проблемы. - person JoxTraex; 18.07.2012
comment
Я только что понял другое. Как я могу получать общедоступные трансляции, если для android:exported установлено значение false. По сути, это говорит о том, что я не могу получать что-либо извне моего собственного приложения. - person Andy; 18.07.2012