Главная » Разработка для Android » Назначение приоритетов для фоновых Сервисов

0

Как вы уже узнали из главы 3, Android применяет динамический подход к управлению ресурсами, что может привести к преждевременному завер- шению работы ваших приложений, Активностей и Сервисов практически без предупреждения.

При определении, какие приложения и компоненты приложений долж- ны быть закрыты,  Android  присваивает запущенным Сервисам второй по значимости приоритет. Только Активности, работающие на переднем плане, имеют более высокий приоритет с точки зрения системных ресурсов.

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

Ожидается, что Сервис, работающий  на переднем плане, будет напря- мую взаимодействовать с пользователем (например, проигрывая музыку). В связи с этим клиент всегда должен знать о работе таких Сервисов. Чтобы это обеспечить, вызов startForeground должен сопровождаться появлением текущих уведомлений (которые более подробно описываются далее в этой главе), как показано в листинге 9.7. Эти уведомления будут работать до тех пор, пока Сервис на переднем плане.

ПРИМЕЧАНИЕ

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

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

Листинг 9.7. Повышение приоритета  для Сервиса

int NOTIFICATION_ID = 1;

Intent intent = new Intent(this, MyActivity.class);

PendingIntent pi = PendingIntent.getActivity(this, 1, intent, 0));

Notification notification = new Notification(R.drawable.icon, "Running in the Foreground", System.currentTimeMillis());

notification.setLatestEventInfo(this, "Title", "Text", pi);

notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;

startForeground(NOTIFICATION_ID, notification);

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

Когда Сервис больше не нуждается  в повышенном  приоритете,  можете вернуть  его в фоновый  режим и, если необходимо,  убрать уведомления с помощью метода stopForeground, как показано в листинге 9.8. Уведомле- ния будут отменены автоматически при остановке или завершении работы Сервиса.

Листинг 9.8. Возвращение Сервиса в фоновый  режим

// Переход в фоновый режим и удаление уведомлений stopForeground(true);

ПРИМЕЧАНИЕ

В версиях Android, предшествовавших 2.0, была возможность вывести Сервис на передний план с помощью метода setForeground. Этот метод сейчас считается устаревшим, его вызов ни к чему не приведет.

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

По теме:

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