» F.A.Q.

Почему не стоит пользоваться TaskKiller’ами на Android-коммуникаторах

Всем привет! Сегодня мы рассмотрим крайне спорную и интересную тему – использование таск киллеров на вашем андрофоне. Данный вопрос поднимается снова и снова – люди говорят, что программы выполняются в фоновом режиме и искренне считают, что они тратят заряд их батареи или сжирают всю память. Вполне естественным здесь будет желание установки программы, которая может убивать задачи. Тем не менее, здесь появляется один момент. Скорее всего вам придется нанести больше вреда, чем пользы, так как вы убиваете задачи, которые не готовы к завершению.

Я тоже сталкивался с данной проблемой, при покупке своего первого Android-смартфона. На нем работали многие программы и мне это не нравилось – поэтому я постоянно пытался их убить. Через несколько недель стало ясно, что если я перестану использовать таск киллер и полностью его удалю, то мой телефон сможет работать гораздо лучше и быстрее! В результате, я дал возможность приложениям закрываться самостоятельно и появилось впечатление, что все работает лучше. Конечно же, возможно есть краткосрочные выгоды от удаления таска, тем не менее, я советую вам все же найти время и прочесть данную статью полностью.

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

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

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

  • Активность может быть завершена, если вы вызовете ее метод finish(). Одна активность может завершать другую (порожденную первой с помощью метода startActivityForResult()), посредством вызова метода finishActivity() последней.
  • Сервис может быть остановлен, если вы вызовете его метод stopSelf() или же Context.stopService().

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

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

Отметим также, что активность, по сути, имеет собственный жизненный цикл и может иметь три состояния:

  • Активное или выполняемое – когда находится на экране на первом плане (в верхней части стека активностей текущего приложения). Именно в данной активности пользователем и выполняются действия.
  • Будучи приостановленной, если с нее ушел фокус, тем не менее, она по-прежнему отображается пользователям. Это происходит в том случае, когда сверху будет находиться другая активность, которая либо прозрачна, либо нуждается не во всем экране, так что приостановленные активности из-под нее частично видны. Приостановленные активности являются полностью действующими (в них содержится вся информация о своем состоянии и содержащихся элементах и связана с менеджером окон), тем не менее, ее может убить систему в ситуации, когда ощущается жесткая нехватка памяти.
  • В остановленном виде, если ее полностью закрывает другая активность. В ней все еще будет храниться информация про состояние и содержащиеся элементы. Тем не менее, она больше не отображается пользователям и чаще всего ее уничтожает система, когда память потребуется еще для чего-то.

Если активность вы приостановили или остановили, система имеет право ее выгружать из памяти  или указанием к завершению (вызвав ее метод finish()), или просто убивая сам процесс. Когда потребуется ее снова показать пользователю, процесс будет перезапущен и система полностью восстановит предыдущее состояние.

Активность получает приоритет в промежуток времени между вызовом метода onResume() и соответствующим вызовом метода в onPause(). В это время активность повышается и именно с ней пользователь будет взаимодействовать. Активность может часто переходить между возобновленными и приостановленными состояниями – к примеру, метод onPause() будет вызван в тот момент, когда девайс перейдет в состояние ждущего режима или когда начнется старт новой активности, метод onResume() вызывается тогда, когда приходит результат активности или новые Intent. Именно поэтому в данные два метода не требуется помещение действий, которые могут занимать много времени.

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

Итак, опишем все еще раз и покороче:

  • В системе Android есть автоматическое удаление задач, когда ощущается нехватка памяти.
  • В системе есть автоматическое удаление задач, которые закончили свое выполнение.
  • В системе есть автоматическое удаление задач, с которыми длительное время не велось общение.
  • Большая часть сервисов, которые вполне возможно выполняются в фоне, пользуются крайне малым количеством памяти в том случае, если ими не выполняются какие-то трудоемкие задачи.
  • Поставщики содержимого ведут интенсивную работу только тогда, когда получают сообщение по поводу необходимости предоставления своего содержимого. Во все остальные времена они требуют крайне мало памяти.
  • Уничтожение процессов, не готовых к этому приводит только к тому, что он заново подгрузится и начнет все с самого начала, когда снова потребуется.
  • Из-за того, что задача, скорее всего, будет выполняться в фоне не без причины, ее уничтожение приводит только к ее перезапуску, когда активность, которая ее использует снова станет к ней обращаться. И ей не останется ничего другого кроме как начинать все с самого начала.
  • Уничтожение определенных процессов может обладать нежелательными побочными эффектами. Неполученная СМС, непрозвонивший будильник и вылетающая программа становятся только небольшой их частью.
  • Единственным верным способом запрета чему-то выполняться становится их деинсталляция .apk.
  • Большая часть приложения сама завершит работу, если вы покинете их нажимая кнопку «назад» до того момента, пока оно не закроется, а не кнопку «домой». Но даже если вы нажмете «домой», Android все равно в итоге выгрузит приложение, если оно весьма длительный период будет находиться в фоне.

 

У вас остались какие-нибудь сомнения и вопросы? Вам кажется, что я неправ? Тогда читаем дальше.

Есть еще одна вещь, о которой я не упоминал в данной статье – это то, что механизм работы памяти в линуксе очень различается с таковым в Windows. В общем случае нам требуется ровно столько памяти, сколько будет занято. Поэтому если в целом, все выполняющиеся программы нуждаются в 100 мегабайтах, то 150 мегабайт памяти будет более чем достаточно. И нет необходимости удалять из памяти что-либо до того момента, пока вы не заполните 150 мегабайт. Система Windows  в свою очередь работает немного лучше в тот момент, когда у нее имеется больше незанятой памяти, даже если не всю память занимали изначально. Несомненно, те кто давно успели сродниться с компьютером, помнят, что существовали программы для того чтобы очистить память под данную ОС.

Но у Linux`а такого поведения нет. Признаться, мне неизвестен точный механизм и причины этого,… тем не менее, Linux работает одинаково независимо от того, располагает он 20 или 200 мегабайтами свободной памяти. И как уже было упомянуто выше, Android автоматически будет выгружать приложения именно тогда, когда количество памяти будет снижено. Попробуем процитировать Криса Джонстона «Чистить буферы и кеши в ОЗУ довольно-таки глупо. Представьте себе учителя, который вместо того, чтоб писать на всю длину классной доски, как только заканчивает предложение тут же его стирает и СНОВА и СНОВА пишет, начиная с верхнего левого края доски. Или, представьте, вам понравилась песня. Вы записываете ее в начало кассеты. Когда вам хочется записать еще одну, вы пишете поверх первой или все-таки после нее?».

Также, мне приходилось встречать немало людей, которые по ошибке предполагают, что чем больше памяти используется, тем сильнее будет разряжаться аккумулятор. В реальности, это гораздо больше зависит от количества проделанных процессором циклов, а не от количества памяти, которую занимает какая-либо программа. Тем не менее, все это будет наталкивать на мысль! Когда таск менеджер может приносить пользу? Когда требуется определение, что именно заставляет ваш телефон тормозить, из-за чего батарейка быстрее садится. Именно такой способ помог нам выяснить, что, оказывается, существует недоработка, которая остается еще с версии 1.5 и которая сильно тормозит наши телефоны и по сегодняшний день. И в тот момент, как программа, которая занимает память, не будет приносить никакого вреда, приложение, что приносит нагрузку на процессор, абсолютно точно станет это делать. И все равно мы не рекомендуем пользоваться TaskKiller`ами для того чтобы уничтожить программу, нагружающую ваш процессор (если только это не разбушевавшиеся процессы-зомби, но в этом случае вообще лучше будет если вы перезагрузитесь). Но вместе с тем, они могут сильно помочь вам разобраться, что, же происходит с вашим устройством.

Очень надеюсь, что моя статья кому-нибудь помогла. Отмечу также, что вместе со всем, что было сказано выше – я всегда приветствую эксперименты. Это ваш телефон, и вы можете делать с ним все, что заблагорассудится. Если вы можете быть уверенными в том, что таск киллер сделает ваш телефон конфеткой – пользуйтесь ими! Спасибо за внимание.