Главная » Разработка для Android » Трансляция «липких» и упорядоченных Намерений

0

Если Намерение транслируется с помощью метода sendBroadcast, оно будет принято всеми Широковещательными приемниками, при этом вы не мо- жете контролировать порядок распространения результатов.

В случаях, когда порядок  получения Намерений Приемниками играет важ- ную роль или когда нужно, чтобы Приемники получили возможность влиять на транслируемое Намерение, можете использовать метод sendOrderedBroadcast:

sendOrderedBroadcast(intent, null);

С помощью этого метода ваше Намерение получат все зарегистрирован- ные Приемники в порядке,  основанном  на заданном  приоритете.  При не- обходимости вы также можете назначить собственный Широковещательный приемник, который будет получать Намерение уже после того, как оно обра- ботается (и, возможно, модифицируется) всеми другими Приемниками:

sendOrderedBroadcast(intent, null, myBroadcastReceiver, null, Activity.RESULT_OK, null, null);

Для  большей  эффективности некоторые  трансляции делаются  «лип- кими»  (Sticky). Когда вы вызываете  метод registerReceiver и передаете ему Фильтр намерений, отслеживающий такие трансляции, в качестве воз- вращаемого  значения  получите  «липкое»  Широковещательное намерение. Чтобы  транслировать его, ваше приложение должно  иметь полномочие BROADCAST_STICKY:

sendStickyBroadcast(intent);

Чтобы убрать «липкое» Намерение, передайте его в виде параметра в ме- тод removeStickyBroadcast:

removeStickyBroadcast(intent);

Стандартные широковещательные действия в Android

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

В следующем перечне описываются некоторые стандартные  действия, хранящиеся в виде констант в классе Intent. Эти действия в основном пред- назначены  для отслеживания состояния устройства.

ACTION_BOOT_COMPLETED. Срабатывает, как только устрой- ство завершило запуск. Чтобы получать это действие, приложение должно иметь полномочие RECEIVE_BOOT_COMPLETED.

ACTION_CAMERA_BUTTON. Срабатывает при нажатии  кнопки камеры.

ACTION_DATE_CHANGED и ACTION_TIME_CHANGED. Эти действия транслируются, если настройки даты или времени на устрой- стве изменены  вручную (в отличие от изменений,  связанных с есте- ственным течением времени).

ACTION_MEDIA_BUTTON.  Срабатывает, если нажата мультиме- дийная кнопка.

ACTION_MEDIA_EJECT. Если пользователь инициировал извлече- ние внешнего накопителя, это событие сработает  в первую очередь. Когда приложение взаимодействует с внешним носителем данных, вы должны отслеживать это событие, чтобы сохранить и закрыть любой открытый  файл.

ACTION_MEDIA_MOUNTED и ACTION_MEDIA_UNMOUNTED.

Эти два события транслируются каждый раз при добавлении или из- влечении внешнего накопителя.

ACTION_NEW_OUTGOING_CALL.  Транслируется перед осу- ществлением исходящего звонка. Отслеживайте это событие для перехвата таких звонков. Номер, на который пойдет вызов, хранится в дополнительном параметре с ключом EXTRA_PHONE_NUMBER, а параметр  resultData, содержащийся в возвращенном Намерении, указывает на номер, который действительно был вызван. Чтобы зарегистрировать Широковещательный приемник для этого действия, приложение должно содержать тег uses-permission с полномочием PROCESS_OUTGOING_CALL.

ACTION_SCREEN_OFF и ACTION_SCREEN_ON. Передаются при выключении и включении  экрана соответственно.

ACTION_TIMEZONE_CHANGED. Это действие  транслируется каждый  раз, когда изменяется текущая  временная  зона в телефоне. Намерение содержит дополнительный параметр time-zone, в котором хранится  идентификатор новой зоны из класса java.util.TimeZone.

Полный  список транслируемых действий,  используемых и передава- емых в Android, чтобы уведомлять  приложения об изменениях состояния системы, находится по адресу http://developer.android.com/reference/android/content/ Intent.html.

Android также использует Широковещательные намерения для оповещения о прикладных событиях, таких как получение  входящих  SMS-сообщений. Действия и Намерения, связанные с этими событиями,  более подробно рас- смотрены в следующих главах, из них вы узнаете больше о соответствующих Сервисах.

Знакомство с Ожидающими намерениями

Класс PendingIntent предоставляет механизм для создания  Намерений, которые могут быть запущены сторонними приложениями спустя некото- рое время.

Объекты PendingIntent, как правило, используются для упаковки таких Намерений, что должны сработать в ответ на будущее событие, такое как на- жатие виджета или выбор элемента из панели уведомлений.

ПРИМЕЧАНИЕ

Ожидающие намерения (Pending Intents) запускают упакованные объ- екты Intent с теми же полномочиями, которые имеют сами, как будто вы делаете это из собственного приложения.

Как показано в листинге 5.22, класс PendingIntent предоставляет стати- ческие методы для создания Ожидающих намерений, которые используются для трансляции объектов Intent, а также для запуска Активностей или Сер- висов.

Листинг 5.22. Создание новых Ожидающих намерений

// Запустите Активность

Intent startActivityIntent = new Intent(this, MyOtherActivity.class); PendingIntent.getActivity(this, 0, startActivityIntent, 0);

// Транслируйте Намерение

Intent broadcastIntent = new Intent(NEW_LIFEFORM_DETECTED); PendingIntent.getBroadcast(this, 0, broadcastIntent, 0);

Больше об Ожидающих намерениях вы узнаете в следующих главах, где они применяются для поддержки  работы других Сервисов, таких как виджеты или уведомления.

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

По теме:

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