Ця замітка написана за мотивами подкасту Юрія Трухина і Ельдара Муртазіна, де вони не дуже коректно висловилися про те, як влаштована багатозадачність в Android і навіщо йому «таскменеджери». Багатозадачність в Android така ж, як в підготовлюваний оновленні Mango для WP7. з точністю до деталей реалізації і назв в архітектурних рішеннях. Некоректне розуміння багатозадачності в Android я зустрічаю досить часто і думаю, що багато в чому це вина Google, вони не можуть нормально пояснити звичайному користувачеві, як все всередині влаштовано, і що Task Manager'и в більшості своїй скоріше шкідливі, ніж корисні.
Почасти так, але тут є тонкий момент. Справа в тому, що всі програми для Android модульні. Тобто, програма складається з безлічі шматочків, які працюють незалежно один від одного (якщо явно не викликають інший модуль). Наявність в пам'яті програми абсолютно не означає того, що вона вся використовується в даний момент. Програма може взагалі не виконувати ніякого коду, а в пам'яті висіти просто тому, що пам'ять є, і чому б не тримати додаток в кеші, щоб подальша активація відбулася швидше. Природно, коли пам'ять буде потрібна іншим додаткам, саме непотрібне (є система пріоритетів) буде вивантажено. Це те ж саме, що і концепція «поховання» в WP7. В даному випадку «таскменеджери» просто шкідливі, так як вони вивантажують додатки, які потім будуть завантажуватися знову, витрачаючи ресурси і час.
Але все ж, певна частка істини тут є, і зараз я розповім, чому.
Дана частина технічна, що описує архітектуру програм на Android. Але хочеться розповісти про внутрішній устрій, щоб у читачів склалося розуміння пристрою даної операційної системи.
В Android все модулі в програмі поділяються на три основні типи:
Розгляну їх докладніше на віртуальному прикладі музичного плеєра.
Це вікна нашого застосування. Одне вікно - одна активують. У нашому уявному музичному плеєрі вікно з назвою пісні, вікна з елементами управління і картинкою альбому - це активують. Їх час життя дуже коротке, коли ви переключаєтеся на інше вікно (навіть в межах однієї програми), то все ставиться на паузу, а через деякий час звільняються всі ресурси, і активують побивається. Тобто, в тлі нічого не малюється і не може малюватися. Як тільки ви переключилися з нашого плеєра, де був красивий еквалайзер, можна не турбуватися, що цей еквалайзер продовжуватиме отрісовиваться десь у фоновому режимі, його більше немає. Ця частина програми не працює зовсім.
Якщо програма містить тільки з активують (наприклад, калькулятор), то коли ми з нього переключилися - воно більше не їсть ніяких ресурсів. Просто сидить тихо - мирно в кеші, чекаючи, що ви повернетеся.
Broadcast Receivers
Тут у мене вийшла складність з нормальним перекладом цієї фрази російською, оскільки дослівний "приймачі широкомовних повідомлень" виглядає вельми кострубато, буду викручуватися по ситуації.
Даний модуль живе рівно стільки, скільки потрібно на обробку повідомлення від системи. Додаток залишається висіти в пам'яті на випадок, якщо система пошле ще одне таке ж повідомлення, і замість запуску програми заново воно буде вже в пам'яті, готове до обробки.
Але ось тут вже починаються хитрощі зі споживанням ресурсів. Якщо додаток зареєструвало себе на отримання повідомлень глобально (в маніфесті), то система буде запускати його завжди і вбивати його «таскменеджером» - шкідливо і марно. Але додаток може зареєструвати себе на отримання подій програмно, тоді воно буде їх отримувати, поки запущено. Наприклад, музичний плеєр повинен отримувати події від гарнітури для управління відтворенням і ставитися на паузу в разі дзвінка. Якщо він не запущений - йому ці події не важливі, він на них не реагує.
Ось ми і підійшли до найголовнішого споживачеві ресурсів. Сервіси, ця частина програми, яка повинна працювати у фоновому режимі, і вона призначена рівно для цього і ні для чого більше. Це ось ті найменші блоки, які працюють при багатозадачності і в Android, і в iOS, і в WP7 Mango.
Це сервіси синхронізації, оновлення, завантаження. Для музичного плеєра грати музику повинен саме сервіс! Навіть під час дзвінка частина програми, що відповідає за розмову - це сервіс, який потрібен, щоб розмова йшла, а користувач міг грати в Angry Birds в цей час.
Власне, це і є основні споживачі ресурсів, але таскменеджери їх дуже погано визначають, краще на них дивитися в стандартних настройках додатків (Running Services).
Але Android може вбивати сервіси при нестачі пам'яті теж, хоч вони і мають пріоритет по часу життя, що дивно, він потім їх постарається запустити заново, щоб повернути все як було. Найвищий пріоритет у сервісів з іконкою в статусбаре, як це нерозумно звучить. Просто ці сервіси своїм виглядом демонструють користувачеві, що вони існують і працюють, і Android їх береже до останнього. Саме тому більшість музичних плеєрів малюють іконку в статус барі, такий ось архітектурний фінт вухами.
Загалом, якщо з WP7 вдаватися в деталі, то там реалізація виглядає відрізняється, але якщо дивитися очима користувача, то завдання буде вирішуватися одна і та ж: невелика частина програми, яка робить конкретну частину роботи.
висновок
Важливо розуміти, що у додатків можуть працювати різні частини, з різними властивостями, і вбиваючи додаток, ви можете просто змусити систему заново завантажити його. Вбивати варто тільки кострубато написані програми (так, в маркеті з відсутністю модерації таких вистачає). При цьому працюють тільки маленькі шматочки програм, всі інші частини сплять хорошим сном і ніяк не впливають на роботу системи.