redox sparrow-hawk blog

Многозадачность в Android OS

android evolution

android evolution

Приложения для Android состоят из нескольких компонентов. Выделяют четыре типа компонентов: Activities, Services, Broadcast receivers и Content providers.
Activities представляют собой графический пользовательский интерфейс для определенной задачи. К примеру, приложение для SMS может иметь одно activity для вывода списка контактов, одно для создания сообщения и т.д.Activity может находиться в одном из трех состояний:

Active или running – в этом состоянии он находится на переднем плане и взаимодействует с пользователем;
Paused – находится на втором плане, но виден пользователю, например, частично перекрыт новым activity;
Stopped – полностью перекрыт другим activity. Но он по-прежнему сохраняет своё состояние, хотя и полностью скрыт от пользователя.

В состояниях Paused и Stopped – activity может быть выгружен из памяти. Может возникнуть ситуация, когда пользователь, возвращаясь к выгруженному activity, хотел бы его увидеть в том состоянии, в котором его оставил. Это возможно, если перед выгрузкой activity вызвать метод onSaveInstanceState(), а во время восстановления или создания activity вызвать метод onRestoreInstanceState(). В этом случае возможно сохранение текущего (на момент выгрузки) состояния activity. Здесь можно провести аналогию с режимом гибернации в ОС для ПК.

Одной из основных особенностей Android является возможность одних приложений использовать элементы других приложений (если, конечно, они позволяют это делать). Чтобы обеспечить это, система должна обладать возможностью запуска приложения, когда востребована какая-либо его часть, и возможностью создания Java объектов для этой части. По этой причине, в отличие от большинства иных систем, приложения для Android имеют несколько точек входа. Точнее сказать, приложения состоят из самодостаточных компонентов, которые система может запускать по необходимости. Выделяют четыре типа компонентов:
1. Activities (представляет собой графический пользовательский интерфейс для определенной задачи; к примеру приложение для SMS может иметь одно activity для вывода списка контактов, одно для создания сообщения и т.д.);
2. Services (не имеет GUI, работает в фоновом режиме неограниченное время; например, это воспроизведение музыки);
3. Broadcast receivers (этот компонент ничего не делает, только получает и соответствующим образом реагирует на системные сообщения, такие как: низкий заряд батареи, получение изображения, смена настроек пользователем и т.д.);
4. Content providers (создает специфический набор данных приложения, доступных другим приложениям; данные могут храниться в файловой системе в базе данных SQLite, либо в ином другом подходящем виде).
Content provider активен только во время отклика на запрос от ContentResolver и нет необходимости его выгружать явным способом. А broadcast receiver функционирует внутри activity/services и его необходимо де-регистрировать, но не выгружать.
С другой стороны, activities обеспечивают пользовательский интерфейс. Они находятся в длительном взаимодействии с пользователем и могут оставаться активными даже во время простоя, до тех пор, пока взаимодействие продолжается. Таким же образом services могут функционировать продолжительное время. Поэтому в Android предусмотрена возможность выгружать activities и services стандартными методами (finish() и stopSelf()). Также компоненты могут быть выгружены системой в случае их продолжительного бездействия или при нехватке свободной памяти для более активных компонентов.
Жизненный цикл activity. Activity может находиться в одном из трех состояний:
1. Active или running – в этом состоянии он находится на переднем плане и взаимодействует с пользователем;
2. Paused – находится на втором плане, но виден пользователю, например частично перекрыт новым activity;
3. Stopped – полностью перекрыт другим activity. Но он по-прежнему сохраняет своё состояние, хотя и полностью скрыт от пользователя.
В состояниях Paused и Stopped – activity может быть выгружен из памяти. Может возникнуть ситуация, когда пользователь, возвращаясь к выгруженному activity, хотел бы его увидеть в том состоянии, в котором его оставил. Это возможно, если перед выгрузкой activity вызвать метод onSaveInstanceState(), а во время восстановления или создания activity вызвать метод onRestoreInstanceState(). В этом случае возможно сохранение текущего (на момент выгрузки) состояния activity. Здесь можно провести аналогию с режимом гибернации в ОС для ПК.