Android-приемник для нескольких действий?

Простой вопрос - могу ли я зарегистрировать один BroadcastReceiver для нескольких действий по намерению? Вот что я рассматриваю:

<receiver android:name=".myReceiver">
    <intent-filter android:priority="1000000">
        <action android:name="android.intent.action.MEDIA_BUTTON" />
        <action android:name="android.intent.action.ACTION_HEADSET_PLUG" />
    </intent-filter>
</receiver>

Итак, в myReceiver классе onReceive, могу ли я проверить intent.getAction() для ACTION_MEDIA_BUTTON and ACTION_HEADSET_PLUG?

Спасибо.

Ответ 1

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

<receiver android:name=".myReceiver">
     <intent-filter android:priority="1000000">
         <action android:name="android.intent.action.ACTION_HEADSET_PLUG" />
     </intent-filter>

     <intent-filter android:priority="1000000">
         <action android:name="android.intent.action.MEDIA_BUTTON" />
     </intent-filter>
</receiver>

И затем проверьте действие Intent в onReceive получателя.

Ответ 2

Да, один BroadcastReceiver может принимать намерения с несколькими действиями. И ваш пример действителен. У вас может быть несколько "действий" в одном фильтре. Более того, в этом случае он более подходит, чем кажется более безопасным способом: создание нескольких фильтров с одним действием (как это предлагается в ответе @advantej). Несколько действий в фильтре ясно сообщают, что вы ожидаете одно из нескольких действий (логическое "или" ).

Эти слова из Фильтры Intent и Intent" объясняют выбор между одним и несколькими фильтрами намерений для более сложных случаев:

Хорошо создать фильтр, который включает в себя более одного экземпляра < действие > , < данные > , или <category> . Если вы это сделаете, вам просто нужно быть что компонент может обрабатывать любые и все комбинации эти фильтрующие элементы.

Если вы хотите обрабатывать несколько видов намерений, но только в конкретные комбинации действий, данных и типа категории, то вы необходимо создать несколько целевых фильтров.

Здесь приведены различные примеры фильтров Intent: AndroidManifest.xml

Ответ 3

Да, вы можете иметь несколько действий для того же BroadcastReceiver. Фактически, то, что вы сделали, просто правильно:

<receiver android:name=".myReceiver">
     <intent-filter android:priority="1000000">
         <action android:name="android.intent.action.ACTION_HEADSET_PLUG"/>
         <action android:name="android.intent.action.MEDIA_BUTTON" />
     </intent-filter>
</receiver>

Я уже использовал этот подход в проекте, и он сработал.

Ответ 4

о приоритете, который вы установили:

https://developer.android.com/guide/topics/manifest/intent-filter-element.html

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

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

Он контролирует порядок выполнения широковещательных приемников для приема широковещательных сообщений. Те, у которых более высокие значения приоритета, вызываются перед теми, у кого более низкие значения. (Заказ применяется только к синхронным сообщениям, он игнорируется для асинхронных сообщений.)

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

Значение должно быть целым числом, например "100". Более высокие числа имеют более высокий приоритет. Значение по умолчанию равно 0. Значение должно быть больше чем -1000 и менее 1000.