Activity (Активность, Деятельность)
Термин Activity еще не устоялся в русском языке у разработчиков. Некоторые используют слово Активность, другие — Деятельность. Чтобы не путаться в названиях, я буду использовать термин Активность (смотри примечание).
Разработчики со стажем могут воспринимать Активность как форму. Простые приложения состоят из одной активности. Более сложные приложения могут иметь несколько окон, т.е. они состоят из нескольких активностей, которыми надо уметь управлять и которые могут взаимодействовать между собой.
Активность, которая запускается первой, считается главной. Из нее можно запустить другую активность. Причем не только ту, которая относится к нашему приложению, но и другого приложения. Пользователю будет казаться, что все запускаемые им активности являются частями одного приложения, хотя на самом деле они могут быть определены в разных приложениях и работают в разных процессах. Попробуйте воспринимать активности как страницы разных сайтов, открываемых в браузерах по ссылке.
Примечание: Если у слова activity взять первые три символа и перемешать, то получим cat, впрочем из слова активность тоже можно получить кота.
Обычно активность занимает весь экран устройства, но это не является обязательным требованием. Вы можете создавать полупрозрачные и плавающие окна активностей. И с развитием Android такой подход набирает обороты.
Чтобы создать активность, нужно унаследоваться от класса Activity и вызвать метод onCreate(). В результате мы получим пустой экран. Толку от такого экрана никакого. Поэтому в активность добавляют компоненты, фрагменты с помощью разметки.
Жизненный цикл активности
Активность имеет жизненный цикл — начало, когда Android создает экземпляр активности, промежуточное состояние, и конец, когда экземпляр уничтожается системой и освобождает ресурсы. Активность может находиться в трех состояниях:
- активная (active или running) — активность находится на переднем плане экрана. Пользователь может взаимодействовать с активным окном;
- приостановленная (paused) — активность потеряла фокус, но все еще видима пользователю. То есть активность находится сверху и частично перекрывает данную активность. Приостановленная активность может быть уничтожена системой в критических ситуациях при нехватке памяти;
- остановленная (stopped) — если данная активность полностью закрыта другой активностью. Она больше не видима пользователю и может быть уничтожена системой, если память необходима для более важного процесса.
Если активность, которая была уничтожена системой, нужно снова показать на экране, она должна быть полностью перезапущена и восстановлена в своем предыдущем состоянии.
Активность в виде диалогового окна
Помните, изучая темы, мы создали вторую активность в виде диалогового окна. С таким же успехом вы можете создать окно и для основной активности. Добавим в манифесте для активности строчку:
Напишем код для запуска:
@Override public void onCreate(Bundle savedInstanceState)
Обратите внимание, что в данном примере мы не используем разметку, а программно создаём экземпляр класса TextView с необходимыми свойствами (текст, отступы) и передаём его в метод setContentView().

Програмнное создание активности
В основном мы пользуемся XML-разметкой для формирования внешнего вида активности. Это рекомендованный способ и в 99% вы будете использовать именно его. Но в некоторых случаях возможно вам понадобится создать активность программно. Сложного там ничего нет, для общего развития пригодится.
Если в стандартном случае мы подключаем XML-файл в методе setContentView(R.layout.activity_main), то при программном создании данный метод нам не понадобится. Удаляем его и пишем код:
package ru.alexanderklimov.test; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.TextView; import android.widget.Toast; public class TestActivity extends Activity < /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); // этот метод нам не нужен // setContentView(R.layout.activity_test); LinearLayout layout = new LinearLayout(TestActivity.this); layout.setId(R.id.layout_id); LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); layout.setLayoutParams(layoutParams); layout.setOrientation(LinearLayout.VERTICAL); ImageView imageView = new ImageView(TestActivity.this); imageView.setId(R.id.image_id); imageView.setImageResource(R.drawable.ic_launcher); LayoutParams imageViewLayoutParams = new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); imageView.setLayoutParams(imageViewLayoutParams); layout.addView(imageView); setContentView(layout); layout.setOnClickListener(onViewClickListener); imageView.setOnClickListener(onViewClickListener); >OnClickListener onViewClickListener = new OnClickListener() < @Override public void onClick(View v) < int myId = v.getId(); Toast.makeText(TestActivity.this, "ID: " + String.valueOf(myId) + " clicked", Toast.LENGTH_LONG).show(); >>; >
Принцип формирования следующий — создаем объект LinearLayout (или другой контейнер) и настраиваем необходимые свойства. Далее создаём необходимые дочерние элементы и также настраиваем их свойства. Не забываем подключить дочерний элемент к родительскому через метод addView().
В данном примере мы также присваиваем компонентам идентификаторы через метод setId(), хотя необходимости в этом не было. В примере эта возможность показана для демонстрации. Если вы используете идентификаторы, то в файле res/values/stings.xml добавьте строчки:
Обычно опытные программисты создают отдельный файл для идентификаторов, например, res/values/ids.xml.
Классы Activity в Android
Android SDK включает набор классов, наследованных от Activity. Они предназначены для упрощения работы с виджетами, которые часто встречаются в обычном пользовательском интерфейсе. Перечислим некоторые из них (наиболее полезные).
- MapActivity. Инкапсулирует обработку ресурсов, необходимых для поддержки элемента MapView внутри Активности.
- ListActivity. Обертка для класса Activity, главная особенность которой — виджет ListView, привязанный к источнику данных, и обработчики, срабатывающие при выборе элемента из списка.
- ExpandableListActivity. То же самое, что и ListActivity, но вместо ListView поддерживает ExpandableListView.
- TabActivity. Позволяет разместить несколько Активностей или Представлений в рамках одного экрана, используя вкладки для переключения между элементами.
Activity: определение и его жизненный цикл в Android

Что такое жизненный цикл Activity? Для того чтобы попытаться ответить на этот вопрос, необходимо понимать , что такое Activity в Android , — тогда ответ на этот вопрос появится сам по себе.
Activity — это фундаментальный компонент каждого Android-приложения. Через этот компонент происходит взаимодействие между пользователем и приложением. При помощи него пользователь телефона может «путешествовать» между окнами приложения или между разными приложениями.
Фактическ и к омпонент Activity — это окно , которое открывается пользователю при запуске приложения. В этом компоненте создается интерфейс приложения, который виден пользователю со всеми кнопками, меню, формами и др. У одного Android-приложения может быть несколько окон Activity, н о о бычн о р еализуют только одно-единственное. При многокомпонентном Activity всегда определяют «главный экран», который запускается при активации приложения ; остальные экраны активируются по необходимости. Если провести аналоги ю с веб-сайтами, тогда можно сказать, что Activity в Андроид-приложениях — это главная страница на веб-сайтах, с которой посетитель сайта начинает знакомит ь ся с ресурсом.
Жизненный цикл Activity
Каждое запущенное Андроид-прило же ние имеет жизненный цикл, который ему определяет операционная система. Пр и активации приложени я о но получает самый высокий приоритет, а операционная система выделяет ему отдельный процесс. Именно поэтому ОС и может определять приоритетность приложений, потому что она контролирует процессы. «Приоритет» приложений означает, что активному приложению предоставляют максимальное количество ресурсов телефона, однако другие приложения также работают. Например, открыв любое приложение на телефоне, всегда можно принять звонок, получить SMS или получить сообщение в мессенджер е .
Поясняем , пр и ч ем здесь жизненный цикл Activity. Activity — это «экран взаимодействия» с приложением. Соответственно, если активно приложение, значит , будет актив на и Activity ; если нет — тогда нет. На практике это выглядит так : к огда запущено приложение, пользователь видит его Activity. Если запускается новое приложение, тогда его Activity выводится на экран, а старая «скрывается». Когда новая Activity прекращает работу, тогда она удаляется из стека, а старая Activity появляется на экране.
Жизненный цикл А ктивити связан с рядом событий, которые определяют его длительность.
Жизненный цикл А ктивити: события
- «onCreate()». Это первое событие, которое активируется при запуске приложения , и с него начинает свой жизненный цикл А ктивити. Он определяет первоначальную настройку «экрана», например, создает визуальные компоненты интерфейса приложения. После завершения работы этого состояни я п риложение переходит в следующее.
- «onStart()». Во время выполнения этого события приложение готовит ся показать Activity на экране устройства. После окончания этого событи я р абота приложения переходит к следующему событию.
- «onResume()». Это событие , во время которого Activity появляется на экране устройства и пользователь начинает взаимодействовать с интерфейсом приложения. Это «рабочее» состояние Activity, которое останется таким, пока пользователь взаимодействует с приложением и не закрывает его или не переходит в другое приложение.
- «onPause()». Это событие включается в том случае, если пользователь открыл другое приложение, не закрывая предыдущее. То ест ь п риложение не закрывается полностью, а лишь приостанавливает свою деятельность, чтобы освободить ресурсы телефона для работы другого приложения. Еще это состояние называют «фоновой» работой приложения. Приложение может оставаться в таком состоянии до тех пор , пока пользователь его не закроет или система сама его не закроет. Система может самостоятельно закрыть приложение в том случае, если им давно не пользовались, а в «фоне» работа е т слишком большое количество приложений и телефону не хватает ресурсов их поддерживать.
- «onStop()». Это событие , при котором Activity и приложение полностью останавливают свою работу и ее вообще не видно на экране. В о время этого события происходит полное высвобождение ресурсов телефона , о днако в памяти телефона во время этого события еще остаются настройки интерфейса. То есть, если во время этого события пользователь возобновит работу приложения, тогда на экране Activity отразятся настройки и работа пользователя с интерфейсом. К примеру, пользователь начал заполнять поля формы, но не закончил. Такие моменты пока еще сохраняются памяти. По окончани и этого события приложение переходит к следующему.
- «onDestroy()». Этим событием приложение завершает собственную деятельность. Оно возникает тогда, когда приложение было закрыто пользователем или операционной системой. Во время этого события высвобождаются все ресурсы системы, которые не были высвобождены в предыдущих этапах. Жизненный цикл Activity на этом этапе заканчивается.
Заключение
- пользователю поступил звонок на телефон , или он переключился на другое приложение, а в вашем случился сбой;
- пользователь не пользуется вашим приложением активно , а оно потребляет много ресурсов устройства;
- пользователь временно переключился на другое приложение, а по возвращени и все , что он делал в вашем приложении, удалилось;
- пользователь сменил положение экрана, а все , что он делал в вашем приложении , удалилось;
- и др.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Activity
Ключевым компонентом для создания визуального интерфейса в приложении Android является activity (активность). Нередко activity ассоциируется с отдельным экраном или окном приложения, а переключение между окнами будет происходить как перемещение от одной activity к другой. Приложение может иметь одну или несколько activity. Например, при создании проекта с пустой Activity в проект по умолчанию добавляется один класс Activity — MainActivity, с которого и начинается работа приложения:
public class MainActivity extends AppCompatActivity < // содержимое класса >
Все объекты activity представляют собой объекты класса android.app.Activity , которая содержит базовую функциональность для всех activity. В приложении из прошлой темы мы напрямую с этим классом не работали, а MainActivity наследовалась от класса AppCompatActivity . Однако сам класс AppCompatActivity, хоть и не напрямую, наследуется от базового класса Activity.
Жизненный цикл приложения
Все приложения Android имеют строго определенный системой жизненный цикл. При запуске пользователем приложения система дает этому приложению высокий приоритет. Каждое приложение запускается в виде отдельного процесса, что позволяет системе давать одним процессам более высокой приоритет, в отличие от других. Благодаря этому, например, при работе с одними приложениями Android позволяет не блокировать входящие звонки. После прекращения работы с приложением, система освобождает все связанные ресурсы и переводит приложение в разряд низкоприоритетного и закрывает его.
Все объекты activity, которые есть в приложении, управляются системой в виде стека activity, который называется back stack . При запуске новой activity она помещается поверх стека и выводится на экран устройства, пока не появится новая activity. Когда текущая activity заканчивает свою работу (например, пользователь уходит из приложения), то она удаляется из стека, и возобновляет работу та activity, которая ранее была второй в стеке.
После запуска activity проходит через ряд событий, которые обрабатываются системой и для обработки которых существует ряд обратных вызовов:
protected void onCreate(Bundle saveInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy();
Схематично взаимосвязь между всеми этими обратными вызовами можно представить следующим образом

onCreate()
onCreate — первый метод, с которого начинается выполнение activity. В этом методе activity переходит в состояние Created. Этот метод обязательно должен быть определен в классе activity. В нем производится первоначальная настройка activity. В частности, создаются объекты визуального интерфейса. Этот метод получает объект Bundle , который содержит прежнее состояние activity, если оно было сохранено. Если activity заново создается, то данный объект имеет значение null. Если же activity уже ранее была создана, но находилась в приостановленном состоянии, то bundle содержит связанную с activity информацию.
После того, как метод onCreate() завершил выполнение, activity переходит в состояние Started , и и система вызывает метод onStart()
onStart
В методе onStart() осуществляется подготовка к выводу activity на экран устройства. Как правило, этот метод не требует переопределения, а всю работу производит встроенный код. После завершения работы метода activity отображается на экране, вызывается метод onResume , а activity переходит в состояние Resumed.
onResume
При вызове метода onResume activity переходит в состояние Resumed и отображается на экране устройства, и пользователь может с ней взаимодействовать. И собственно activity остается в этом состоянии, пока она не потеряет фокус, например, вследствии переключения на другую activity или просто из-за выключения экрана устройства.
onPause
Если пользователь решит перейти к другой activity, то система вызывает метод onPause , а activity переходит в состояние Paused . В этом методе можно освобождать используемые ресурсы, приостанавливать процессы, например, воспроизведение аудио, анимаций, останавливать работу камеры (если она используется) и т.д., чтобы они меньше сказывались на производительность системы.
Но надо учитывать, что в этот состоянии activity по прежнему остается видимой на экране, и на работу данного метода отводится очень мало времени, поэтому не стоит здесь сохранять какие-то данные, особенно если при этом требуется обращение к сети, например, отправка данных по интернету, или обращение к базе данных — подобные действия лучше выполнять в методе onStop() .
После выполнения этого метода activity становится невидимой, не отображается на экране, но она все еще активна. И если пользователь решит вернуться к этой activity, то система вызовет снова метод onResume , и activity снова появится на экране.
Другой вариант работы может возникнуть, если вдруг система видит, что для работы активных приложений необходимо больше памяти. И система может сама завершить полностью работу activity, которая невидима и находится в фоне. Либо пользователь может нажать на кнопку Back (Назад). В этом случае у activity вызывается метод onStop .
onStop
В этом методе activity переходит в состояние Stopped. В этом состоянии activity полностью невидима. В методе onStop следует особождать используемые ресурсы, которые не нужны пользователю, когда он не взаимодействует с activity. Здесь также можно сохранять данные, например, в базу данных.
При этом во время состояния Stopped activity остается в памяти устройства, сохраняется состояние всех элементов интерфейса. К примеру, если в текстовое поле EditText был введен какой-то текст, то после возобновления работы activity и перехода ее в состояние Resumed мы вновь увидим в текстовом поле ранее введенный текст.
Если после вызова метода onStop пользователь решит вернуться к прежней activity, тогда система вызовет метод onRestart . Если же activity вовсе завершила свою работу, например, из-за закрытия приложения, то вызывается метод onDestroy() .
onDestroy
Ну и завершается работа activity вызовом метода onDestroy , который возникает либо, если система решит убить activity в силу конфигурационных причин (например, поворот экрана или при многоконном режиме), либо при вызове метода finish() .
Также следует отметить, что при изменении ориентации экрана система завершает activity и затем создает ее заново, вызывая метод onCreate .
В целом переход между состояниями activity можно выразить следующей схемой:

Расмотрим несколько ситуаций. Если мы работаем с Activity и затем переключаемся на другое приложение, либо нажимаем на кнопку Home, то у Activity вызывается следующая цепочка методов: onPause -> onStop . Activity оказывается в состоянии Stopped. Если пользователь решит вернуться к Activity, то вызывается следующая цепочка методов: onRestart -> onStart -> onResume .
Другая ситуация, если пользователь нажимает на кнопку Back (Назад), то вызывается следующая цепочка onPause -> onStop -> onDestroy . В результате Activity уничтожается. Если мы вдруг захотим вернуться к Activity через диспетчер задач или заново открыв приложение, то activity будет заново пересоздаваться через методы onCreate -> onStart -> onResume
Управление жизненным циклом
Мы можем управлять этими событиями жизненного цикла, переопределив соответствующие методы. Для этого возьмем из прошлой главы класс MainActivity и изменим его следующим образом:
package com.example.viewapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity < private final static String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, "onCreate"); >@Override protected void onDestroy() < super.onDestroy(); Log.d(TAG, "onDestroy"); >@Override protected void onStop() < super.onStop(); Log.d(TAG, "onStop"); >@Override protected void onStart() < super.onStart(); Log.d(TAG, "onStart"); >@Override protected void onPause() < super.onPause(); Log.d(TAG, "onPause"); >@Override protected void onResume() < super.onResume(); Log.d(TAG, "onResume"); >@Override protected void onRestart() < super.onRestart(); Log.d(TAG, "onRestart"); >>
Для логгирования событий здесь используется класс android.util.Log .
В данном случае обрабатываются все ключевые методы жизненного цикла. Вся обработка сведена к вызову метода Log.d() , в который передается TAG — случайное строковое значение и строка, которая выводится в консоли Logcat в нижней части Android Studio, выполняя роль отладочной информации. Если эта консоль по умолчанию скрыта, то мы можем перейти к ней через пункт меню View -> Tool Windows -> Logcat .
И при запуске приложения мы сможем увидеть в окне Logcat отладочную информацию, которая определяется в методах жизненного цикла activity:
Жизненный цикл Activity
Основным компонентом Android-приложения является Activity, определяющая интерфейс окна. Пользователи выполняют определенные действия в приложении через Activity : делают фото/видео, отправляют письмо, отвечают на звонок и т.д. Для каждой активности создается окно с соответствующим пользовательским интерфейсом. Как правило, окно занимает весь экран, но может быть и меньше.
Но прежде чем говорить об активности, необходимо пару слов сказать об операциях. Система Android работает с операциями. Каждой операции соответствует определенное окно (активность) для представления пользовательского интерфейса.
Операции
Android приложение может включать несколько слабо связанных друг с другом операций, одна из которых является «главной» и выполняется при первом старте приложения. Любая из операций может стартовать другую для выполнения определенных действий. Каждый раз, когда запускается какая-либо операция, предыдущая останавливается, и система сохраняет новую операцию в стеке типа FIFO («first-in-first-out»), т.е. «последним пришел — первым вышел». После завершения пользователем определенных действий или нажатии кнопки «Назад», текущая операция удаляется из стека и уничтожается, а предыдущая операция возобновляет своё функционирование.
Операция может даже стартовать операции в других приложениях на устройстве. Например, работу с почтой могут выполнять несколько приложений. Одно из приложений подготавливает информацию для отправки и определяет адресата/ов. При выполнении команды отправки стартует операция другого приложения. При этом действие отправляемой операции приостанавливается. После отправки сообщения первое приложение возобновляет работу операции, и все выглядит так, будто операция отправки электронной почты является частью первого приложения.
Несмотря на то, что операции могут относится к разным приложениям, Android поддерживает удобство работы пользователя, сохраняя обе операции в одной задаче. Задача — это коллекция операций, с которыми взаимодействует пользователь при выполнении определенного задания. Начальным местом для большинства задач является главный экран устройства. Когда пользователь нажимает на иконку главного экрана, то эта задача переходит на передний план. Если у приложения нет задач, т.е. приложение не использовалось, то создается новая задача и открывается «основная» операция этого приложения в качестве корневой операции в стеке. Операции упорядочены в стеке (стек переходов назад), в том порядке, в котором они открывались.
Стек
Каждая стартуемая операция помещается на вершину стека и получает фокус. Предыдущая операция остается в стеке, но её выполнение приостанавливается, и система «сохраняет» её текущее состояние (интерфейс). При нажатии кнопки «Назад», текущая операция удаляется из вершины стека (операция уничтожается) и возобновляется работа предыдущей операции с восстановлением предыдущего состояния её пользовательского интерфейса. Операции в стеке никогда не переупорядочиваются; выполняется только добавление операций в стек и удаление из него. Т.е. при запуске новой операции, она добавляются в стек, и удаляется из стека, когда пользователь выходит из неё. Таким образом, стек переходов работает по принципу «последним пришел — первым вышел».
Callback методы
Когда Android останавливает операцию по какой-либо причине (например, запуск новой операции), или возобновляет её работу, для уведомления об изменении состояния операции используются callback-методы обратного вызова жизненного цикла операции. Чтобы создать операцию, необходимо сначала создать активность Activity (или её подкласс). В активности можно переопределить (override) методы обратного вызова, которые вызывает система при переходе операции из одного состояния своего жизненного цикла в другое, например при создании, остановке, возобновлении или уничтожении операции. В callback-методах можно выполнить определенные действия, связанные с чтением и освобождением ресурсов.
Класс Activity имплементирует Callback-методы представленные в следующей таблице :
Методы обратного вызова Activity
| Метод | Описание |
|---|---|
| onCreate() | метод вызывается при первом создании Activity |
| onStart() | метод вызывается перед тем, как интерфейс Activity будет открыт пользователю |
| onResume() | метод вызывается перед предоставлением доступа пользователю к активности |
| onPause() | метод вызывается перед открытием другой Activity |
| onStop() | метод вызывается после удаления интерфейс Activity с экрана устройства |
| onDestroy() | метод вызывается перед уничтожением Activity |
Как видно из описания в таблице callback-методы не вызывают смену состояния активности. Наоборот, при смене состояния Activity система вызывает эти методы, чтобы можно было бы во-время реагировать на это программным способом. Схематично жизненный цикл операции представлен на следующем рисунке, который позаимствован со страницы описания Операций android-приложений.

onCreate
Метод приложения onCreate необходимо переопределить, поскольку система вызывает его при создании активности. В этом методе вызывается setContentView(), определяющий шаблон layout пользовательского интерфейса активности. В реализации метода необходимо инициализировать переменные и загрузить ресурсы, связать данные с элементами управления. Длительные инициализации следует выполнять в фоновом процессе, а не в методе onCreate, поскольку система может вызвать диалоговое окно ANR (Application Not Responding, приложение не отвечает).
В качестве параметра метод onCreate принимает объект Bundle, содержащий состояние пользовательского интерфейса последнего вызова обработчика onSaveInstanceState. Для восстановления интерфейса в его предыдущем состоянии необходимо использовать эту переменную внутри onCreate() или переопределить метод onRestoreInstanceState().
onStart
Метод onStart вызывается либо при создании активности, либо перед возобновлением работы приостановленного приложения. При вызове данного метода интерфейс приложения еще не виден на экране.
onResume
Метод onResume() вызывается после метода onStart(), когда пользователь взаимодействует с окном и приложение получает монопольные ресурсы. Помните, что система вызывает данный метод каждый раз, когда активность переходит на передний план. Таким образом, метод onResume() можно использовать для инициализации компонентов, регистрации любых процессов, которые были освобождены/приостановлены в методе onPause() и выполнить любые другие инициализации, когда Activity вновь активна.
Старайтесь фомрировать относительно быстрый и легковесный код, чтобы приложение было «отзывчивым» при скрытии или появлении на экране.
onPause
При открытии/восстановлении новой/другой активности вызывется метод onPause текущей активности. По сути, если вызывается метод onPause, то происходит свёртывание текущей активности. И поскольку пользователь может назад не вернуться, то обычно именно в этом методе следует сохранить изменения, деактивировать и отпустить монопольные ресурсы, остановить воспроизведение видео, аудио, анимацию и обработку данных от GPS. Исходя из архитектуры своего приложения, можно также приостановить выполнение потоков пока активность вновь не появится на переднем плане.
Старайтесь формировать относительно быстрый и легковесный код, чтобы приложение оставалось отзывчивым при скрытии с экрана или выходе на передний план.
onStop
Когда окно становится невидимым на устройстве вызывается метод onStop. Это может произойти при удалении активности или при старте другой активности, перекрывающей окно текущей. При остановке активности её объекты сохраняются в памяти. Система отслеживает текущее состояние для каждого компонента (View). Поэтому, если пользователь ввёл какой-либо текст в текстовое поле, то его содержание не потеряется и, при восстановлении работы активности, этот текст будет восстанавлен.
Примечание: при закрытии/останове активности состояние объектов хранится в специальном объекте типа Bundle в виде ключ-значение; значения компонентов восстанавливаются при восстановлении состояния активности.
В методе onStop() можно выполнить тяжеловесные операции, связанные с сохранением данных при приостановке сложной анимации, отслеживании показаний датчиков, запросов к GPS, таймеров, сервисов или других процессов, которые нужны исключительно для восстановления пользовательского интерфейса.
При нехватке памяти система может уничтожить скрытую активность вызовом метода onDestroy(), игнорируя метод onStop().
onDestroy
Метод onDestroy вызывается перед завершением работы активности. Это последний вызов системой метода активности перед ее уничтожением. В данном методе, при необходимости, следует проверить сохранение и освобожение используемых ресурсов.
Пример
Для наглядности вышеизложенного создадим пример с переопределением Callback-методов, в которых выведем в журнал Logcat соответствующие сообщения с тегом STATE.
package com.test; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class MainActivity extends Activity < final String TAG = "STATE"; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, "onCreate"); >@Override protected void onStart() < super.onStart(); Log.d(TAG, "onStart"); >@Override protected void onResume() < super.onResume(); Log.d(TAG, "onResume"); >@Override protected void onPause() < super.onPause(); Log.d(TAG, "onPause"); >@Override protected void onStop() < super.onStop(); Log.d(TAG, "onStop"); >@Override protected void onDestroy() < super.onDestroy(); Log.d(TAG, "onDestroy"); >>
Стартуйте пример и следите за сообщениями. Они будут представлены в определенной последовательности вызовов Сallback-методов в виде сообщений на вкладке Logcat.
Протоколирование
Ниже представлены выполнения определенных действий, сопровождаемых выводом соответствующих сообщений в Logcat.
Старт приложения
onCreate() → onStart() → onResume()
02-20 07:48:41.761 25895-25895/com.test D/STATE: onCreate 02-20 07:48:41.762 25895-25895/com.test D/STATE: onStart 02-20 07:48:41.767 25895-25895/com.test D/STATE: onResume
Нажатие кнопки Домой
02-20 07:54:09.945 25895-25895/com.test D/STATE: onPause 02-20 07:54:10.304 25895-25895/com.test D/STATE: onStop
Восстановление приложения после нажатия Домой
02-20 07:55:23.953 25895-25895/com.test D/STATE: onStart 02-20 07:55:23.954 25895-25895/com.test D/STATE: onResume
Запуск другого приложения
Для запуска другого приложения можно нажать кнопку «Overview» – просмотр списка запущенных приложений.
02-20 08:00:24.898 25895-25895/com.test D/STATE: onPause 02-20 08:00:24.943 25895-25895/com.test D/STATE: onStop
Восстановление приложения после останова другого приложения
После старта другого приложения нажмите кнопку «Назад», чтобы завершить его работу и восстановить функционирование примера.
02-20 08:03:15.649 25895-25895/com.test D/STATE: onStart 02-20 08:03:15.651 25895-25895/com.test D/STATE: onResume
Изменение ориентации устройства
При изменении ориентации устройства с portrait на landscape и обратно активность проходит через последовательность смены состояний, т.е. выполняется несколько последовательных операций. Если внимательно присмтореться к последовательности операци, то Activity полностью уничтожается и снова создается. При этом обычно выполняются процедуры сохранения и восстановления данных, чтобы данные не потерялись и приложение сохранило свой вид.
onPause() → onStop() → onDestroy() → onCreate() → onStart() → onResume()
02-20 08:06:20.841 25895-25895/com.test D/STATE: onPause 02-20 08:06:20.851 25895-25895/com.test D/STATE: onStop onDestroy 02-20 08:06:20.902 25895-25895/com.test D/STATE: onCreate 02-20 08:06:20.903 25895-25895/com.test D/STATE: onStart 02-20 08:06:20.906 25895-25895/com.test D/STATE: onResume
Выход из приложения
Нажимаем кнопку «Назад» для выхода из приложения.
onPause() → onStop() → onDestroy()
02-20 08:17:39.463 25895-25895/com.test D/STATE: onPause 02-20 08:17:39.892 25895-25895/com.test D/STATE: onStop 02-20 08:17:39.897 25895-25895/com.test D/STATE: onDestroy