Жизненный цикл фрагментов
У фрагментов есть жизненный цикл, который во многом совпадает с жизненным циклом активности, внутри которой они находятся.

Список дополнительных методов жизненного цикла фрагментов, которых нет у активности:
onAttach(Activity) Вызывается, когда фрагмент связывается с активностью. С этого момента мы можем получить ссылку на активность через метод getActivity() onCreate() В этом методе можно сделать работу, не связанную с интерфейсом. Например, подготовить адаптер. onCreateView(LayoutInflater, ViewGroup, Bundle) Вызывается для создания компонентов внутри фрагмента onViewCreated() Вызывается сразу после onCreateView() onActivityCreated(Bundle) Вызывается, когда отработает метод активности onCreate(), а значит фрагмент может обратиться к компонентам активности onStart() Вызывается, когда фрагмент видим для пользователя и сразу же срабатывает onStart() активности onDestroyView() onResume() Вызываем после onResume() активности Вызывается, когда набор компонентов удаляется из фрагмента onDetach() Вызывается, когда фрагмент отвязывается от активности
Одноимённые с методами активности методы фрагментов выполняют аналогичные функции. К примеру, метод onResume() вызывается, когда фрагмент вновь становится видимым.
Метод onStart() вызывается, когда фрагмент становится видимым после запуска такого же метода в родительской активности.
Фрагмент всегда связан с активностью. Отдельно фрагмент от активности существовать не может.
Если активность останавливается, то её фрагменты также останавливаются. Если активность уничтожается, то её фрагменты также уничтожаются.
Метод onCreateView() вызывается один раз, когда фрагмент должен загрузить на экран свой интерфейс. В этом методе вы можете «надуть» (inflate) разметку фрагмента через метод inflate() объекта Inflater, который задан в параметре метода. В фрагментах без интерфейса вы можете пропустить надувание.
Метод onActivityCreated() вызывается после метода onCreateView(), когда создаётся активность-хозяйка для фрагмента. Здесь можно объявить объекты, необходимые для Context.
Фрагменты не являются подклассами Context, вам следует использовать метод getActivity(), чтобы получить родительскую активность.
Создадим несколько фрагментов и с помощью логов посмотрим на срабатывание методов. Первоначально пример писался на Java, будет приведён аналог на Kotlin только для первого фрагмента, остальное придётся написать самостоятельно.
FirstFragment
// Kotlin package ru.alexanderklimov.fragmentdemo import android.content.Context import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment class Fragment1 : Fragment() < override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) Log.d("Fragment1", "onCreate") >override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? < val rootView = inflater.inflate(R.layout.fragment1, container, false) Log.d("Fragment1", "onCreateView") return rootView >override fun onAttach(context: Context) < super.onAttach(context) Log.d("Fragment1", "onAttach") >override fun onStart() < super.onStart() Log.d("Fragment1", "onStart") >override fun onResume() < super.onResume() Log.d("Fragment1", "onResume") >override fun onStop() < Log.d("Fragment1", "onStop") super.onStop() >override fun onDestroyView() < Log.d("Fragment1", "onDestroyView") super.onDestroyView() >override fun onDestroy() < Log.d("Fragment1", "onDestroy") super.onDestroy() >override fun onDetach() < Log.d("Fragment1", "onDetach") super.onDetach() >>
// Java package ru.alexanderklimov.fragmentdemo; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class FirstFragment extends Fragment < public static FirstFragment newInstance(String param1, String param2) < FirstFragment fragment = new FirstFragment(); // Bundle args = new Bundle(); return fragment; >public FirstFragment() < // Required empty public constructor >@Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); Log.d("Fragment 1", "onCreate"); >@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) < View rootView = inflater.inflate(R.layout.fragment_first, container, false); Log.d("Fragment 1", "onCreateView"); return rootView; >@Override public void onAttach(Activity activity) < super.onAttach(activity); Log.d("Fragment 1", "onAttach"); >@Override public void onActivityCreated(Bundle savedInstanceState) < super.onActivityCreated(savedInstanceState); Log.d("Fragment 1", "onActivityCreated"); >@Override public void onStart() < super.onStart(); Log.d("Fragment 1", "onStart"); >@Override public void onResume() < super.onResume(); Log.d("Fragment 1", "onResume"); >@Override public void onPause() < super.onPause(); Log.d("Fragment 1", "onPause"); >@Override public void onStop() < super.onStop(); Log.d("Fragment 1", "onStop"); >@Override public void onDestroyView() < super.onDestroyView(); Log.d("Fragment 1", "onDestroyView"); >@Override public void onDestroy() < super.onDestroy(); Log.d("Fragment 1", "onDestroy"); >@Override public void onDetach() < super.onDetach(); //mListener = null; Log.d("Fragment 1", "onDetach"); >>
Разметка для первого фрагмента
По аналогии создайте второй фрагмент SecondFragment, заменив тексты и названия идентификаторов там, где это нужно.
Создадим разметку для главной активности с двумя кнопками для переключения между фрагментами.
activity_main.xml
MainActivity.java
В главной активности можно переключаться между фрагментами при нажатии на кнопку, а также через кнопку BACK, чтобы увидеть транзакции фрагментов.
package ru.alexanderklimov.fragmentdemo; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; public class MainActivity extends ActionBarActivity < Button fragment1Button, fragment2Button; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragment1Button = (Button) findViewById(R.id.buttonFragment1); fragment2Button = (Button) findViewById(R.id.buttonFragment2); // get an instance of FragmentTransaction from your Activity FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); //add a fragment FirstFragment firstFragment = new FirstFragment(); fragmentTransaction.add(R.id.container, firstFragment); fragmentTransaction.commit(); fragment1Button.setOnClickListener(onButtonClickListener); fragment2Button.setOnClickListener(onButtonClickListener); >Button.OnClickListener onButtonClickListener = new Button.OnClickListener() < @Override public void onClick(View v) < // TODO Auto-generated method stub Fragment newFragment = null; // Create new fragment if (v == fragment1Button) < newFragment = new FirstFragment(); >else < newFragment = new SecondFragment(); >// Create new transaction FragmentTransaction transaction = getFragmentManager().beginTransaction(); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack transaction.replace(R.id.container, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit(); > >; >
Смотрим сообщения. При запуске приложения запускается первый фрагмент, который загружается в контейнер. Последовательность следующая.
onAttach
onCreate
onCreateView
onActivityCreated
onStart
onResume
Метод onActivityCreated() теперь считается устаревшим.
Нажимаем на кнопку «Home»:
Запустим из списка недавно запущенных программ:
Выходим из программы через кнопку «Back»:
onPause
onStop
onDestroyView
onDestroy
onDetach
При замещении первого фрагмента вторым почти как при закрытии, только нет методов onDestroy и onDetach, а затем повторяются те же методы при старте фрагмента:
// Первый фрагмент onPause
onStop
onDestroyView
// Второй фрагмент onAttach
onCreate
onCreateView
onActivityCreated
onStart
onResume
Дополнительное чтение
xxv/android-lifecycle — схема жизненного цикла в SVG, PDF, PNG.
Кто вызывает public методы в Activity?
Скажите, пожалуйста, каким образом вызываются public методы в Android? Мне не понятно. Если читать литературу по java, то метод должен вызываться через объект, например «объект.метод». Но в андройде же достаточно только описать public метод и он будет вызываться сам по себе, как указано в примере ниже. Скажите пожалуйста кто вызвал метод onCreateOptionsMenu ? Где указан вызов данного метода? Почему он вызвался? Где про это почитать?
public class MainActivity extends Activity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.main); >public boolean onCreateOptionsMenu(Menu menu) < // TODO Auto-generated method stub menu.add("menu1"); menu.add("menu2"); menu.add("menu3"); menu.add("menu4"); return super.onCreateOptionsMenu(menu); >>
Отслеживать
51.4k 86 86 золотых знаков 267 267 серебряных знаков 505 505 бронзовых знаков
задан 16 ноя 2016 в 7:22
243 2 2 серебряных знака 13 13 бронзовых знаков
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
На самом деле хороший вопрос, потому что это не совсем очевидно, даже если прочтете про жизненный цикл Activity .
Итак, вкратце: Первое что происходит это создается объект Activity . При этом отрабатывает только его конструктор и ничего больше:
Activity activity = new Activity();
Но обычно никто не создает объект в таком виде. Вместо этого все идет через Intent :
Intent intent = new Intent(previousActivity, Activity.class); startActivity(intent);
Если предыдущего Activity (в данном случае previousActivity ) нет, то система просто запускает выбранный Activity.class, по сути также через intent.
Только после startActivity(intent) отрабатывает метод onCreate(Bundle savedInstanceState) , т.е. иначе говоря именно этот startActivity его и запускает по сути. На самом деле цепочка чуть длиннее:
По сути у разработчика нет доступа к методу create(), он даже называться может по другому, в любом случае этот метод создает Activity и запускет callback onCreate ;
Далее как только onCreate отрабатывает он запускает callback, который в свою очередь запускает метод start(), тот запускает callback onStart , onStart в свою очередь запускает callback , запускающий resume() ну и дальше запусается callback onResume .
Насчет onCreateOptionsMenu все не так очевидно, так как в различных версиях Android запуск выглядел по разному. Намеренно опуская старые версии можно точно сказать, что с Android 3.0+ согласно документации запускается при старте Activity, т.е. в методе start() в порядке отображения элементов app bar (обычно в качестве app bar используется саппортовский Toolbar )
Отслеживать
ответ дан 16 ноя 2016 в 7:59
597 6 6 серебряных знаков 14 14 бронзовых знаков
Это системные методы-колбэки (методы обратного вызова, о чем, как правило, говорит приставка on- в имени метода). Их вызывает система при наступлении определенных системных событий.
Например, onCreateOptionsMenu() вызывается системой, когда в приложении необходимо создать меню (которое вызывается при нажатии системной кнопки «меню»).
Происходит следующее: когда в приложении требуется отобразить меню, система начинает выполнять определенные манипуляции, в одном из этапов которых происходит срабатывание колбэка onCreateOptionsMenu() , здесь программист приложения может внести свой код, который будет выполнен наравне с системным, при создании меню и который, как правило, определяет, что это меню будет в себе содержать (пункты)
Смотрите так же этот ответ по системным колбэкам. Так же можете прочитать все, что найдете поро жизненный цикл активити, системные колбэки и любую книжку по андроид-разработке, где обо всем этом говорится довольно подробно. Могу порекомендовать книгу Б.Харди «Android.Программирование для профессионалов» — 2016г, 2-е издание
Урок 30. Подробнее про onActivityResult. Зачем нужны requestCode и resultCode
На прошлом уроке мы поверхностно рассмотрели, как вызвать Activity, и как сделать так, чтобы она вернула результат. Рассмотрим немного подробней этот механизм. Создадим приложение, которое будет вызывать два разных Activity и получать от них результат. Как мы помним, результат приходит в метод onActivityResult. И requestCode используется, чтобы отличать друг от друга пришедшие результаты. А resultCode – позволяет определить успешно прошел вызов или нет.
Project name: P0301_ActivityResult
Build Target: Android 2.3.3
Application name: ActivityResult
Package name: ru.startandroid.develop.p0301activityresult
Create Activity: MainActivity
Нарисуем экран в main.xml:
На экране TextView с текстом. И две кнопки для выбора цвета шрифта и выравнивания текста в TextView. Нажатие на кнопку будет вызывать Activity для выбора и получать обратно результат.
Давайте начнем кодить в MainActivity.java:
package ru.startandroid.develop.p0301activityresult; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity implements OnClickListener < TextView tvText; Button btnColor; Button btnAlign; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.main); tvText = (TextView) findViewById(R.id.tvText); btnColor = (Button) findViewById(R.id.btnColor); btnAlign = (Button) findViewById(R.id.btnAlign); btnColor.setOnClickListener(this); btnAlign.setOnClickListener(this); >@Override public void onClick(View v) < // TODO Auto-generated method stub >>
Определили экранные элементы, прописали обработчик кнопкам и пока остановимся на этом.
Создадим два других Activity. Начнем с Activity для выбора цвета. Создадим layout-файл color.xml:
Создаем класс ColorActivity. ColorActivity.java:
package ru.startandroid.develop.p0301activityresult; import android.app.Activity; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class ColorActivity extends Activity implements OnClickListener < Button btnRed; Button btnGreen; Button btnBlue; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.color); btnRed = (Button) findViewById(R.id.btnRed); btnGreen = (Button) findViewById(R.id.btnGreen); btnBlue = (Button) findViewById(R.id.btnBlue); btnRed.setOnClickListener(this); btnGreen.setOnClickListener(this); btnBlue.setOnClickListener(this); >@Override public void onClick(View v) < Intent intent = new Intent(); switch (v.getId()) < case R.id.btnRed: intent.putExtra("color", Color.RED); break; case R.id.btnGreen: intent.putExtra("color", Color.GREEN); break; case R.id.btnBlue: intent.putExtra("color", Color.BLUE); break; >setResult(RESULT_OK, intent); finish(); > >
Как обычно определяем элементы, присваиваем обработчик кнопкам и реализуем onClick. В onClick мы создаем Intent, затем определяем, кнопка с каким цветом была нажата и помещаем в Intent объект с именем color и значением цвета. Ставим статус RESULT_OK, указываем, что надо вернуть объект intent в качестве результата и закрываем Activity. Для значения цветов используем системные константы.
Аналогично создаем Activity для выбора выравнивания.
Layout-файл align.xml:
AlignActivity.java:
package ru.startandroid.develop.p0301activityresult; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class AlignActivity extends Activity implements OnClickListener < Button btnLeft; Button btnCenter; Button btnRight; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.align); btnLeft = (Button) findViewById(R.id.btnLeft); btnCenter = (Button) findViewById(R.id.btnCenter); btnRight = (Button) findViewById(R.id.btnRight); btnLeft.setOnClickListener(this); btnCenter.setOnClickListener(this); btnRight.setOnClickListener(this); >@Override public void onClick(View v) < Intent intent = new Intent(); switch (v.getId()) < case R.id.btnLeft: intent.putExtra("alignment", Gravity.LEFT); break; case R.id.btnCenter: intent.putExtra("alignment", Gravity.CENTER); break; case R.id.btnRight: intent.putExtra("alignment", Gravity.RIGHT); break; >setResult(RESULT_OK, intent); finish(); > >
Здесь все аналогично, как и в ColorActivity. Только работаем не с цветами, а с выравниванием. Не забудьте прописать оба Activity в манифесте.
Теперь можем завершить код в MainActivity.java. Добавим пару своих констант в класс для удобства:
final int REQUEST_CODE_COLOR = 1; final int REQUEST_CODE_ALIGN = 2;
Эти константы далее будем использовать в качестве requestCode.
Допишем метод onClick:
@Override public void onClick(View v) < Intent intent; switch (v.getId()) < case R.id.btnColor: intent = new Intent(this, ColorActivity.class); startActivityForResult(intent, REQUEST_CODE_COLOR); break; case R.id.btnAlign: intent = new Intent(this, AlignActivity.class); startActivityForResult(intent, REQUEST_CODE_ALIGN); break; >>
Мы определяем, какая кнопка была нажата и посылаем Intent с ожиданием возврата результата. Два вызова отличаются классом вызываемого Activity и параметром requestCode в методе startActivityForResult. При вызове ColorActivity используем константу REQUEST_CODE_COLOR, а при вызове AlignActivity — REQUEST_CODE_ALIGN. Эту константу мы обратно получим в методе обработки результата – onActivityResult, и по ней сможем определить из какого именно Activity пришел результат.
Давайте реализуем метод onActivityResult в MainActivity.java:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) < // запишем в лог значения requestCode и resultCode Log.d("myLogs", "requestCode = " + requestCode + ", resultCode = " + resultCode); // если пришло ОК if (resultCode == RESULT_OK) < switch (requestCode) < case REQUEST_CODE_COLOR: int color = data.getIntExtra("color", Color.WHITE); tvText.setTextColor(color); break; case REQUEST_CODE_ALIGN: int align = data.getIntExtra("alignment", Gravity.LEFT); tvText.setGravity(align); break; >// если вернулось не ОК > else < Toast.makeText(this, "Wrong result", Toast.LENGTH_SHORT).show(); >>
Для наглядности пишем в лог значения переменных.
Вспоминаем, что в ColorActivity и AlignActivity в методе setResult мы ставили статус RESULT_OK при отправке результата. Значит в onActivityResult нам надо ожидать этот статус, как обозначение успешного окончания вызова.
Если вызов прошел успешно (resultCode = RESULT_OK), то мы смотрим значение requestCode. Если оно равно константе REQUEST_CODE_COLOR, то вспоминаем, что мы использовали эту константу в методе startActivityForResult, когда отправляли запрос на выбор цвета. Значит, нам пришел результат этого выбора. Мы берем Intent (data) и извлекаем из него значение объекта с именем color и присваиваем это значение цвету текста в TextView. Константа Color.WHITE в методе getIntExtra означает значение по умолчанию. Т.е. если в Intent не найдется объекта с именем color, то метод вернет белый (white) цвет.
Аналогично для REQUEST_CODE_ALIGN. Эту константу мы использовали для запроса выбора выравнивания. И если в методе onActivityResult параметр requestCode = этой константе, значит пришел ответ на запрос выравнивания. И мы считываем это значение из Intent и присваиваем его атрибуту Gravity для TextView.
Если resultCode не равен RESULT_OK, значит что-то пошло не так. Выводим на экран соответствующее сообщение. Этот случай может наступить, например, если на экране выбора не делать выбор, а нажать кнопку Назад.
Давайте все сохраним и запустим приложение.


и выберем, например Red

requestCode = 1, resultCode = -1
requestCode пришедший в метод onActivityResult равен 1. Все верно, это значение константы REQUEST_CODE_COLOR, которое мы использовали при вызове.
resultCode = -1 – это значение системной константы RESULT_OK
Т.е. все верно, пришел ответ на запрос цвета, и его статус = RESULT_OK.
Теперь жмем Alignment и выбираем Right, получаем выравнивание вправо:

requestCode = 2, resultCode = -1
requestCode = 2, что равно константе REQUEST_CODE_ALIGN. Значит пришел ответ на запрос выравнивания.
resultCode = -1, т.е. RESULT_OK.
Теперь снова жмем Color

но вместо того, чтобы выбрать цвет нажмем кнопку назад

Отобразилось наше сообщение об ошибке. Смотрим логи:
requestCode = 1, resultCode = 0
requestCode = 1 – все верно, мы запрашивали цвет (REQUEST_CODE_COLOR)
resultCode = 0, это значение константы RESULT_CANCELED, значит вызов прошел неудачно
Ограничений на значение статуса в методе setResult нет. RESULT_OK и RESULT_CANCELED – системные общепринятые константы. Но вы можете свободно использовать свои значения, если в этом есть необходимость.
Итак, подведем итог.
requestCode – это в некотором роде ID запроса. Задается в методе startActivityForResult, и проверяется потом в onActivityResult, чтобы точно знать, на какой вызов пришел ответ.
resultCode – статус вызова. Задается в методе setResult, и проверяется в onActivityResult, чтобы понять насколько успешно прошел вызов. Если при вызове что-то пошло не так, то вернется системная константа RESULT_CANCELED.
Полный код MainActivity.java:
package ru.startandroid.develop.p0301activityresult; import android.app.Activity; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener < final int REQUEST_CODE_COLOR = 1; final int REQUEST_CODE_ALIGN = 2; TextView tvText; Button btnColor; Button btnAlign; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.main); tvText = (TextView) findViewById(R.id.tvText); btnColor = (Button) findViewById(R.id.btnColor); btnAlign = (Button) findViewById(R.id.btnAlign); btnColor.setOnClickListener(this); btnAlign.setOnClickListener(this); >@Override public void onClick(View v) < Intent intent; switch (v.getId()) < case R.id.btnColor: intent = new Intent(this, ColorActivity.class); startActivityForResult(intent, REQUEST_CODE_COLOR); break; case R.id.btnAlign: intent = new Intent(this, AlignActivity.class); startActivityForResult(intent, REQUEST_CODE_ALIGN); break; >> @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) < // запишем в лог значения requestCode и resultCode Log.d("myLogs", "requestCode = " + requestCode + ", resultCode = " + resultCode); // если пришло ОК if (resultCode == RESULT_OK) < switch (requestCode) < case REQUEST_CODE_COLOR: int color = data.getIntExtra("color", Color.WHITE); tvText.setTextColor(color); break; case REQUEST_CODE_ALIGN: int align = data.getIntExtra("alignment", Gravity.LEFT); tvText.setGravity(align); break; >// если вернулось не ОК > else < Toast.makeText(this, "Wrong result", Toast.LENGTH_SHORT).show(); >> >
На следующем уроке:
— узнаем что такое URI
— вызываем системные приложения (браузер, звонилка, карта)
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Compose, Kotlin, RxJava, Dagger, Тестирование, Performance
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
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 на этом этапе заканчивается.
Заключение
- пользователю поступил звонок на телефон , или он переключился на другое приложение, а в вашем случился сбой;
- пользователь не пользуется вашим приложением активно , а оно потребляет много ресурсов устройства;
- пользователь временно переключился на другое приложение, а по возвращени и все , что он делал в вашем приложении, удалилось;
- пользователь сменил положение экрана, а все , что он делал в вашем приложении , удалилось;
- и др.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.