YouTube

Got a YouTube account?

New: enable viewer-created translations and captions on your YouTube channel!

Russian subtitles

← Жизненный цикл и службы приложения

Get Embed Code
10 Languages

Showing Revision 12 created 01/13/2015 by Natalia Savvidi.

  1. В уроке номер четыре мы выяснили,
  2. что Android полностью останавливает
    приложения без видимых активностей,
  3. чтобы высвободить ресурсы, требуемые
    для приложения на переднем плане.
  4. Но что, если у вашего приложения
  5. есть задачи, которые должны
    продолжать выполняться,
  6. когда приложение не видно?
  7. Например, скачивание файлов,
    закачка в сеть фотографий
  8. или проигрывание музыки.
  9. Для этого есть специальный компонент:
    Services (Службы).
  10. Мы уже познакомили вас
    с активностями, контент-провайдерами,
  11. приёмниками передач и интентами.
  12. Службы –- это последняя часть пазла
    среди компонентов приложения Android.
  13. Службы запускают примерно так же,
    как и активности,
  14. передачей интента вызову startService.
  15. И останавливают их так же:
  16. вызовом stopService
    с передачей ему названия службы,
  17. которую надо остановить.
  18. В отличие от активностей
    у компонента Службы
  19. нет пользовательского интерфейса,
  20. и приоритет у них выше,
    чем у фоновых активностей.
  21. Это значит, что приложение
    с работающей службой
  22. будет реже закрываться
    во время работы
  23. с целью высвобождения ресурсов
    для приложения на переднем плане.
  24. По умолчанию система будет даже
    пытаться перезапускать службы,
  25. приостановленные до того,
  26. как они были остановлены
    самим приложением.
  27. Это изображено здесь
    в упрощённом жизненном цикле.
  28. По сравнению с активностями
  29. службы должны выполнять
    более длительные задачи,
  30. которые нельзя прерывать.
  31. Обычно достаточно переопределить
    обработчик onStartCommand.
  32. Именно здесь вы начинаете фоновую задачу,
  33. которую вам необходимо выполнить.
  34. Но заметьте, что здесь нет обработчиков,
    отслеживающих изменение состояния,
  35. когда приложение становится фоновым,
  36. потому что работающая служба
  37. сама посылает ядру сигнал,
  38. что содержащему её приложению
    надо дать больший приоритет,
  39. чем остальным фоновым приложениям
    без работающих служб.
  40. В некоторых случаях
    служба может выполнять задачу,
  41. не имеющую интерфейса,
    которую нельзя прервать так,
  42. чтобы пользователь этого не заметил.
  43. Например, проигрывание музыки
    или помощь в управлении машиной.
  44. В таких случаях необходимо обозначить,
  45. что службу надо рассматривать
    как работающую на переднем плане,
  46. вызывая startForeground.
  47. Заметьте, что метод требует
    уведомление в качестве аргумента.
  48. Оно будет показано на экране
    и останется там,
  49. пока служба не остановлена
    или не вызван stopForeground.
  50. Дэн расскажет вам попозже
    подробнее об уведомлениях.
  51. Пока заметьте, что активная служба
    имеет тот же приоритет,
  52. что и активность переднего плана.
  53. В результате её почти невозможно
    остановить полностью
  54. с целью высвобождения ресурсов.
  55. У вас могла появиться мысль:
  56. многих проблем,
    связанных с жизненными циклами,
  57. можно было бы избежать,
  58. просто создавая длительные
    или даже активные службы.
  59. Я вырос на побережье Австралии,
  60. и рано понял,
    что плыть против течения утомительно
  61. и, в конце концов, бесполезно.
  62. В данном случае это усложнило бы
    управление ресурсами для системы
  63. и в результате ухудшило бы
    работу системы для пользователя.
  64. Плывите по течению.
  65. Используйте активные службы только тогда,
  66. когда это реально необходимо.
  67. И останавливайте службы
    при первой же возможности.
  68. Важно также заметить, что,
    как и активности с приёмниками,
  69. службы работают в главном потоке.
  70. Поэтому придётся использовать
    фоновый поток или асинхронную задачу,
  71. чтобы выполнять длительные задачи
    внутри вашей службы.
  72. Чтобы сделать жизнь легче,
    можно использовать класс IntentService,
  73. который реализует
    самую распространённую и практичную схему
  74. для использования интентов,
    исполняемых внутри службы.
  75. Он создаёт очередь входящих интентов,
    передаваемых при вызове startService.
  76. Затем они обрабатываются
    последовательно в фоновом потоке
  77. внутри обработчика onHandleIntent
    внутри реализации вашей службы интента.
  78. Когда очередь пуста,
    служба останавливается.
  79. Когда приходит новый интент,
    процесс начинается снова.
  80. Службы -- очень мощный инструмент.
  81. Важно понять, как вы можете
    их использовать.
  82. Но на практике часто лучше
    использовать готовое решение
  83. вместо разработки
    собственной реализации службы,
  84. будь то служба интентов
    для выполнения фоновых задач
  85. или синхронный адаптер,
    о котором вы узнаете позже в этом уроке,
  86. идеальный для выполнения
    фоновой синхронизации данных.