Главная » Разработка для Android » Трансляция событий с помощью Намерений

0

Трансляция Намерений  — процесс  простой.  Создайте  внутри  своего приложения Намерение, которое  хотите передать,  и используйте метод sendBroadcast для отправки.

Укажите действие, данные и категорию для вашего Намерения таким об- разом, чтобы Широковещательные приемники смогли без труда его распознать. В данном случае строка  action  нужна для определения транслируемого события, поэтому она должна быть уникальной. Такие строки принято  со- ставлять по тому же принципу, что и имена для пакетов в Java:

public static final String NEW_LIFEFORM_DETECTED = "com.paad.action.NEW_LIFEFORM";

Если вы захотите включить какие-либо данные в Намерение, то можете указать  путь URI,  используя свойство  data. Вы также вправе добавлять дополнительные параметры  для простых значений. Согласно событийной парадигме, содержимое  extras приравнивается к необязательным параме- трам и передается в обработчик события.

В листинге 5.17 показаны основные этапы создания Широковещательного намерения с использованием описанного ранее действия и включением до- полнительной информации, которая хранится  в виде параметра extras.

Листинг 5.17. Трансляция Намерения

Intent intent = new Intent(NEW_LIFEFORM_DETECTED); intent.putExtra("lifeformName", lifeformType); intent.putExtra("longitude", currentLongitude); intent.putExtra("latitude", currentLatitude); sendBroadcast(intent);

Отслеживание трансляций с помощью Приемников широковещательных намерений

Широковещательные приемники используются для отслеживания трансли- руемых Намерений. Чтобы Приемник включить, его нужно зарегистрировать либо в коде, либо в манифесте  приложения. При регистрации Широкове- щательного приемника нужно использовать Фильтр намерений для указания объекта Intent, за которым требуется следить.

Чтобы  создать новый Широковещательный приемник, наследуйте  класс BroadcastReceiver и переопределите обработчик  событий  onReceive,  как показано в листинге 5.18.

Листинг 5.18. Каркас для реализации BroadcastReceiver

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

public class MyBroadcastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

//TODO: Реакция на полученное Намерение.

}

}

Метод onReceive  будет выполняться, если полученное  Намерение со- ответствует  Фильтру, который  использовался для регистрации Приемника. Этот метод должен быть завершен в течение пяти секунд, иначе появится диалоговое окно с информацией о принудительном закрытии.

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

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

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

Листинг 5.19. Реализация BroadcastReceiver

public class LifeformDetectedBroadcastReceiver extends BroadcastReceiver {

public static final String BURN = "com.paad.alien.action.BURN_IT_WITH_ FIRE";

@Override

public void onReceive(Context context, Intent intent) {

// Получите подробные данные из Намерения. Uri data = intent.getData();

String type = intent.getStringExtra("type");

double lat = intent.getDoubleExtra("latitude", 0); double lng = intent.getDoubleExtra("longitude", 0); Location loc = new Location("gps"); loc.setLatitude(lat);

loc.setLongitude(lng);

if (type.equals("alien")) {

Intent startIntent = new Intent(BURN, data); startIntent.putExtra("latitude", lat); startIntent.putExtra("longitude", lng);

context.startActivity(startIntent);

}

}

}

Регистрация Широковещательных приемников внутри манифеста приложения. Чтобы  включить  Широковещательный приемник в манифест приложения, добавьте тег receiver внутрь узла application, указав со- ответствующее имя класса. Узел получателя должен содержать тег intent- filter, в нем нужно задать действие (в виде строки), которое необходимо отслеживать.  Пример показан в листинге 5.20.

Листинг 5.20. Регистрация Широковещательного приемника с помощью XML

<receiver android:name=".LifeformDetectedBroadcastReceiver">

<intent-filter>

<action android:name="com.paad.action.NEW_LIFEFORM"/>

</intent-filter>

</receiver>

Приемники, зарегистрированные таким образом, всегда остаются актив- ными и будут получать  Широковещательные намерения даже тогда, когда приложение не работает или преждевременно завершилось.

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

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

В листинге 5.21 показано, как зарегистрировать Широковещательный при- емник внутри программного кода, используя класс IntentFilter.

Листинг 5.21. Регистрация Широковещательного приемника внутри кода программы

// Создайте и зарегистрируйте Широковещательный приемник. IntentFilter filter = new IntentFilter(NEW_LIFEFORM_DETECTED); LifeformDetectedBroadcastReceiver r = new LifeformDetectedBroadcastReceiver();

registerReceiver(r, filter);

Чтобы  отменить  регистрацию,  используйте метод unregisterReceiver в контексте  приложения, передавая  ему в качестве  параметра  экземпляр Широковещательного приемника, как показано ниже:

unregisterReceiver(receiver);

Другие примеры можно найти в главе 9. Там же вы узнаете, как создавать свои фоновые Сервисы и использовать Намерения, чтобы транслировать со- бытия для собственных  Активностей.

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

По теме:

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