Главная » Разработка для Android » Регистрация Сервиса в манифесте

0

Создав  новый Сервис, нужно зарегистрировать его в манифесте  при- ложения.

Сделайте это, добавив тег service в узел application. Используйте атри- бут requires-permission, чтобы и другие приложения имели доступ к вашему Сервису.

Ниже показан тег service, который нужно добавить для каркаса вашего

Сервиса, созданного ранее:

<service android:enabled="true" android:name=".MyService"/>

Завершение работы Сервиса по собственной инициативе

Как только Сервис завершил  выполнение тех действий, для которых он запускался, вы должны вызвать метод stopSelf либо без передачи параметра,

чтобы ускорить  остановку  работы, либо передав значение  startId, чтобы убедиться, что задачи выполнены  для всех экземпляров, запущенных с по- мощью вызова startService, как показано в следующем фрагменте:

stopSelf(startId);

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

Запуск, управление и взаимодействие с Сервисами

Чтобы запустить Сервис, вызовите метод startService. Вы можете произ- вести запуск неявно, в итоге зарегистрируется соответствующий Приемник намерений, или сделать это явно, указав класс Сервиса. Если Сервис требует полномочий,  которыми  ваше приложение не располагает,  вызов  метода startService приведет к выбросу исключения типа SecurityException.

В обоих случаях можно передавать значения в обработчик onStart, при- надлежащий объекту Service, с помощью дополнительных параметров для Намерения. В листинге 9.3 демонстрируются оба способа запуска Сервиса.

Листинг 9.3. Запуск  Сервиса

// Неявный запуск Сервиса

Intent myIntent = new Intent(MyService.ORDER_PIZZA); myIntent.putExtra("TOPPING", "Margherita"); startService(myIntent);

// Явный запуск Сервиса

startService(new Intent(this, MyService.class));

ПРИМЕЧАНИЕ

Чтобы использовать этот пример, необходимо добавить константу MY_ACTION к классу MyService и использовать Фильтр намерений для регистрации Сервиса в качестве поставщика поля MY_ACTION.

Для  остановки  работы используйте метод stopService,  передавая  ему объект Intent, определяющий нужный Сервис. В листинге 9.4 Сервис сперва запускается и останавливается явным образом, а затем делается то же самое, но с указанием имени компонента, возвращаемого методом startService.

Листинг 9.4. Остановка Сервиса

ComponentName service = startService(new Intent(this, BaseballWatch. class));

Продолжение ?

Листинг 9.4 (продолжение)

// Остановите Сервис, используя его имя.

stopService(new Intent(this, service.getClass()));

// Остановите Сервис явно. try {

Class serviceClass = Class.forName(service.getClassName());

stopService(new Intent(this, serviceClass));

} catch (ClassNotFoundException e) {}

Если метод startService вызывается для Сервиса, который уже работает, обработчик onStartCommand, принадлежащий объекту Service, будет вызван повторно.  Вызовы  startService не накапливаются, поэтому единственный вызов метода stopService завершит  работу Сервиса, неважно,  сколько  раз производился вызов startService.

Пример Сервиса для отслеживания землетрясений

В этой главе вы модифицируете приложение Earthquake, работу над которым  начали  в главе 5 и продолжили в главах 6, 7 и 8. В данном при- мере1  перенесете процесс обновления списка землетрясений и обработку полученной информации в отдельный  компонент  типа Service.

ПРИМЕЧАНИЕ

Позже в данной главе вы снабдите этот Сервис дополнительной функ- циональностью, начав с переноса сетевых запросов и обработки XML в фоновый поток. Далее задействуете уведомления Toast и Notification для оповещения пользователя о новых землетрясениях.

1. Начните  с создания  нового класса EarthquakeService, наследующего

Service.

package com.paad.earthquake;

import android.app.Service; import android.content.Intent; import android.os.IBinder; import java.util.Timer;

import java.util.TimerTask;

public class EarthquakeService extends Service {

@Override

public void onCreate() {

// TODO: Инициализируйте переменные, получите ссылки на элементы GUI

}

@Override

public IBinder onBind(Intent intent) {

return null;

}

}

ПРИМЕЧАНИЕ

В этой главе вы продолжите дополнять и улучшать Earthquake Service, сперва используя уведомления типа Toast, а затем Notification и Сиг- нализацию.

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

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

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

По теме:

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