Статьи

Android SDK: деятельность и жизненный цикл

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


Жизненный цикл Activity не просто вступает в игру, когда пользователь запускает ваше приложение, он также влияет на то, что происходит, когда пользователь переключается на ваше приложение и обратно. Когда вы разрабатываете приложение, вы должны помнить, что пользователь обычно перемещается между ним и другими приложениями во время выполнения. Приложение может быть на переднем плане или на заднем плане в зависимости от того, что делает пользователь. Ваши приложения должны быть в состоянии справиться с этим, сохраняя и восстанавливая данные при необходимости. Имейте в виду, что процесс немного отличается для некоторых приложений, таких как виджеты.


Чтобы контролировать, что происходит, когда ваша активность находится в разных состояниях, например, когда пользователь перемещается от нее или обратно, вы можете реализовать различные методы. Это методы обратного вызова жизненного цикла Activity. Android вызывает эти методы, когда ваша активность входит в каждое состояние, поэтому вы можете принять меры, чтобы приложение продолжало функционировать, не потеряло данные и не использовало ненужные ресурсы, когда пользователь не взаимодействует с ним. Каждый метод обратного вызова переводит ваше приложение в одно из возможных состояний.

Если вы когда-либо программировали Java-приложения, вы знаете, что приложения для Android запускаются по-другому. Вместо использования метода main, когда ваше приложение запускается, выполняется метод onCreate основного класса Activity. Помните, что мы указали класс в манифесте в качестве основного средства запуска Activity. Метод onCreate является первым из обратных вызовов Activity, который выполняется, когда пользователь запускает ваше приложение. Метод onCreate переводит ваше приложение в состояние « Создано» .

Диаграмма в Руководстве разработчика предоставляет интуитивно понятное представление жизненного цикла, методов обратного вызова и состояний. Состояние « Возобновлено» , которое представляет ваше приложение, работающее при взаимодействии с ним пользователя, следует методу onResume . Различные методы обратного вызова переводят ваше приложение в состояние « Возобновлено» и обратно , запуская и останавливая его.

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

Приложение может находиться в пяти состояниях: создано , запущено , возобновлено , приостановлено и остановлено . Семь методов обратного вызова переходят в эти состояния и выходят из них: onCreate , onStart , onRestart , onResume , onPause , onStop и onDestroy . Эти методы переносят ваше приложение между возможными состояниями, в некоторых случаях очень быстро. В целом, вы можете думать о том, что ваше приложение либо возобновляется, либо приостанавливается, либо останавливается в любое время, поскольку другие состояния являются временными.

Когда ваше приложение работает и пользователь взаимодействует с ним, оно находится в состоянии « Возобновлено» . Ваше приложение переходит в состояние « Приостановлено», когда другое действие находится на переднем плане, но скрывает его лишь частично; пользователь не может взаимодействовать с вашим приложением в этом состоянии. Когда ваше приложение полностью в фоновом режиме и пользователь вообще не может видеть или взаимодействовать с ним, оно находится в состоянии « Остановлено» . Здесь Activity может сохранять данные в этом состоянии, но не может выполняться.


Как мы знаем, основная активность запускается при запуске приложения, при этом выполняется метод onCreate , позволяющий вам подготовить пользовательский интерфейс действия и любые элементы данных, которые вам нужны в классе. В большинстве создаваемых вами приложений будет более одного действия, а остальные действия будут запущены при взаимодействии пользователя с приложением. Вы можете запустить одно действие из другого, используя класс Intent, как в следующем примере кода:

1
2
Intent aboutIntent = new Intent(this, About.class);
startActivity(aboutIntent);

Это представляет другой класс Activity с именем «About» в вашем пакете приложения. Вы можете создать новое действие в Eclipse, выбрав исходный пакет и выбрав «Файл», «Новый», «Класс», и выбрав класс Android-активности в качестве суперкласса. Помните, что каждое действие должно быть указано в вашем манифесте. Вы также можете передавать данные между операциями, используя класс Intent.

Когда выполняется любое действие, выполняется метод onCreate , поэтому вы можете относиться к другим классам активности в своих приложениях аналогично основному действию, за исключением того, как вы перечисляете их в манифесте. Вы можете создать файл макета для каждого действия и установить его, используя тот же метод, который вы использовали для основного действия.

После выполнения метода onCreate для Activity выполняются методы onStart и onResume, переводя Activity в состояние Resumed , проходя через Created и Started по пути.

Ваши действия могут достигать возобновленного состояния несколькими способами, а не только при запуске приложения. Если ваша активность приостановлена или остановлена , ее можно вернуть на передний план без повторного вызова метода onCreate . Если ваше приложение возвращается в состояние « Возобновлено» из состояния « Приостановлено» , выполняется метод Activity onResume . Если приложение возвращается из состояния Stopped , выполняется onRestart , затем onStart и onResume .


Когда ваше приложение закрыто или закрыто, оно переходит от возобновленного к уничтоженному. Метод onPause переводит вашу активность из нормального состояния возобновления в состояние паузы . В onPause вы должны остановить любые текущие ресурсоемкие задачи, такие как анимация, обработка сенсоров и широковещательные приемники. Если onPause выполняется, есть хороший шанс, что onStop также собирается выполнить, так как пользователь, возможно, уходит от вашего приложения. Вы также можете использовать метод для сохранения данных, хотя в целом это лучше всего делать в onStop .

Как мы упоминали выше, ваша активность может вернуться из состояния « Приостановлено» в « Возобновлено» с помощью метода onResume . Это означает, что вы можете использовать onResume для восстановления всего, что вы остановили или выпустили в onPause . Однако имейте в виду, что onResume также выполняется в других случаях, например при запуске приложения.

После onPause onStop выполняется, если приложение переходит в состояние « Остановлено» . Отсюда, onRestart , onStart и onResume все еще могут вернуть его в Resumed . В onStop вы должны выполнять любые необходимые вам операции по сохранению данных, такие как запись в базы данных. Убедитесь, что вы освободили все ресурсы, которые ваше приложение использует в onStop, чтобы предотвратить любые утечки памяти, если ваше приложение уничтожено.

Система сохраняет определенные элементы данных, когда ваше приложение возобновляет работу после его остановки, например, что отображается в представлениях. Когда Activity переходит из состояния Stopped обратно в Resumed , выполняются все методы onRestart , onStart и onResume . Однако onStart и onResume выполняются в других случаях, например при запуске приложения. Метод onRestart выполняется только тогда, когда приложение возвращается из состояния Stopped , поэтому вы можете использовать его для восстановления всего, что вы делали в onStop .

Совет. Когда вы запускаете одно действие из другого в вашем приложении, первое действие переходит в состояние « Остановлено» . Если пользователь затем использует кнопку «Назад» для перехода от второго к первому действию , выполняется метод onRestart первого действия.

Если ваше приложение завершает работу полностью, как, например, с удалением экземпляра вашей текущей активности из системы, выполняется onDestroy . Хотя это последний метод, выполняемый до полного исчезновения вашей активности, обычно его не следует использовать для очистки. Вы должны обычно использовать onStop или onPause для этого. Единственное исключение — это когда фоновый поток работает, и в этом случае вы должны остановить его в onDestroy .

После выполнения onDestroy , если пользователь возвращается к вашему действию приложения, метод onCreate выполняется снова. В общем, вы можете предполагать, что onPause и onStop будут выполняться раньше onDestroy . Однако, если вы явно вызываете метод finish для завершения Activity, выполняется только onDestroy .

Во многих случаях вам вообще не нужно беспокоиться о большинстве обратных вызовов жизненного цикла в ваших приложениях, поскольку вы можете сохранять данные с помощью параметра метода onCreate . Параметр Bundle для вашего метода Activity onCreate автоматически сохраняет информацию View, как мы упоминали выше. Однако вы также можете использовать объект для сохранения дополнительных данных, таких как переменные, которые вы обновляете, когда пользователь взаимодействует с вашим приложением. Для этого вы можете реализовать метод onSaveInstanceState в классе Activity, записывая пары ключ-значение данных, которые затем можно получить в onCreate .

Совет: Когда пользователь меняет ориентацию, переключаясь между книжной и альбомной ориентацией, ваша активность фактически воссоздается, а onCreate выполняется снова. Это известно как изменение конфигурации. Система предполагает, что вам нужно воссоздать действие в случае, например, если вы используете разные макеты для каждой ориентации. Однако во многих случаях вы не захотите, чтобы это произошло. Чтобы избежать повторного создания вашей активности при изменении ориентации, вы можете либо добавить атрибут «android: configChanges» к своей активности в манифесте, либо структурировать свою активность так, чтобы использовать фрагменты, сохраняемые при изменениях конфигурации.

Различные состояния и методы обратного вызова в Android Activity могут стать источником путаницы, когда вы начнете изучать, как разрабатывать приложения для платформы. Однако в большинстве случаев вам нужно всего лишь реализовать минимальное количество методов, чтобы ваши приложения работали и вели себя так, как ожидают пользователи. В следующей части серии мы рассмотрим некоторые распространенные классы Android, которые могут оказаться полезными в ваших первых приложениях. После этого мы рассмотрим пример кода Android, что вам нужно знать о выпуске ваших приложений, а также некоторые другие предложения для дальнейшего изучения.