Главная » Разработка для Android » Добавление анонимных действий в приложения

0

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

Фильтры намерений описывают выполняемые действия и данные для них. Именно  данные будут задействованы в процессе утверждения Намерений для определения, когда должно стать доступым конкретное  действие. Тег category нужно установить либо в ALTERNATIVE, либо в SELECTED_

ALTERNATIVE (может  присутствовать сразу два тега с обоими  значе- ниями).  Текст, используемый в элементах  меню, указывается с помощью атрибута android:label.

В листинге 5.10 показан пример Фильтра намерений, который декларирует способность Активности сбивать с орбиты лунные базы с помощью ядерных ракет.

Листинг 5.10. Объявление о действиях, поддерживаемых Активностью

<activity android:name=".NostromoController">

<intent-filter

android:label="Nuke From Orbit">

<action android:name="com.pad.nostromo.NUKE_FROM_ORBIT" />

<data android:mimeType="vnd.moonbase.cursor.item/*"/>

<category android:name="android.intent.category.ALTERNATIVE" />

<category android:name="android.intent.category.SELECTED_ALTERNATIVE" />

</intent-filter>

</activity>

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

Добавление анонимных действий в меню вашей Активности

Чтобы динамически, во время выполнения программы, добавить экзем- пляры  MenuItem в меню, используйте метод addIntentOptions из объекта Menu (передайте Намерение, определяющее данные, для которых вы хотите предоставить  действия). Как правило,  все эти манипуляции происходят внутри обработчиков onCreateOptionsMenu и onCreateContextMenu вашей Активности.

Созданное Намерение послужит для нахождения компонентов, содержа- щих теги intent-filter, которые поддерживают действия с указанными вами данными. В связи с этим Намерение не должно содержать собственных действий, только данные для них. Необходимо также указать категорию для действия:  CATEGORY_ALTERNATIVE или CATEGORY_SELECTED_ ALTERNATIVE.

Процесс создания Намерения для меню следующий:

Intent intent = new Intent(); intent.setData(MyProvider.CONTENT_URI); intent.addCategory(Intent.CATEGORY_ALTERNATIVE);

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

Из листинга 5.11 вы можете получить представление о том, как динами- чески формировать меню для Активности, добавляя туда действие NUKE_ FROM_ORBIT, описанное в предыдущем листинге.

Листинг 5.11. Динамическое формирование меню с помощью действий Активности

@Override

public boolean onCreateOptionsMenu(Menu menu) {

super.onCreateOptionsMenu(menu);

// Создайте Намерение, с помощью которого будут получены

// действия, необходимые для формирования меню. Intent intent = new Intent(); intent.setData(MoonBaseProvider.CONTENT_URI); intent.addCategory(Intent.CATEGORY_SELECTED_ALTERNATIVE);

// Стандартные свойства меню, позволяющие вам задать группу и

// идентификатор для пунктов, которые вы хотите добавить. int menuGroup = 0;

int menuItemId = 0;

int menuItemOrder = Menu.NONE;

// Предоставьте имя компонента, который вызывает действие -

// как правило, это текущая Активность. ComponentName caller = getComponentName();

// Сперва определите Намерения, которые должны быть добавлены. Intent[] specificIntents = null;

// Пункты меню, созданные из предыдущих Намерений,

// заполнят этот массив.

MenuItem[] outSpecificItems = null;

// Установите опциональные флаги.

int flags = Menu.FLAG_APPEND_TO_GROUP;

// Сформируйте меню menu.addIntentOptions(menuGroup,

menuItemId, menuItemOrder, caller, specificIntents, intent,

flags,

outSpecificItems);

return true;

}

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии