5.2. Жизненный цикл Activity

5.2. Жизненный цикл Activity

За время жизненного цикла Activity вызываются несколько функций со стороны ОС Android и по необходимости можно написать свой код, который выполняется в нужный момент. Например, если вы написали приложение для загрузки файлов, тогда при сворачивании приложения загрузка файлов будет продолжаться но пользователь не сможет увидеть сколько загружено, но если переопределить функцию onPause можно вывести уведомление с индикатором загрузки во время сворачивания приложения и убрать уведомление при открытии приложения переопределив onResume.

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

 

Создайте проект на основе шаблона Empty Activity. Код файла activity_main.xml измените и приведите в такой вид:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/text"
        android:hint="Введите имя"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Также измените код файла MainActivity.java и если Android Studio выделит какой-либо класс красным и потребует либо импортировать класс либо нажать Alt+Enter (Option+Enter в macOS) для автоматического импорта нужного класса, нажмите Alt+Enter (Option+Enter в macOS) :

public class MainActivity extends AppCompatActivity {
    // EditText это текстовое поле куда можно вводить различный текст
    EditText text;

    // Первая функция вызываемая при старте Activity, служит для создания и присвоения макета или иерархии виджетов созданных в коде. Во время вызова этой функции объекты создаются, но ещё не размещаются на экране и само окно тоже не видно. Если в функции onCreate используется большой блок кода, тогда это может затормозить открытие окна Activity.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Получение ссылки к виджету размещенном в файле макета и присвоение полученного значения локальной переменной
        text = findViewById(R.id.text);
    }

    // Функция вызывается при повороте экрана и здесь можно сохранить в объекте класса Bundle все необходимые значения для последующего извлечения из этого объекта после поворота экрана
    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        // Экземпляр класса Bundle передаётся со стороны операционной системы и используя его сохраняется объект и указывается имя name со значением равным введенному тексту в текстовое поле EditText. Кроме данных строкового типа в объект класса Bundle можно также сохранить данные других типов используя соответствующие функции. Например putInt(key, value) для сохранения целого числа и т.д.
        savedInstanceState.putString("name", text.getText().toString());
    }

    // Функция вызывается при восстановлении состояния после поворота экрана и показа макета
    @Override
    public void onRestoreInstanceState(Bundle bundle) {
        // Получение сохраненного значения по переданному ключу в объекте Bundle и присвоение полученного значения виджету EditText используя функцию setText
        text.setText(bundle.getString("name"));
    }

    // После функции onCreate вызывается onStart
    @Override
    protected void onStart() {
        super.onStart();
        Log.i("Lifecycle", "On Start Called");
    }

    // После onStart вызывается onResume и окно становится видным
    @Override
    public void onResume() {
        super.onResume();
        Log.i("Lifecycle", "On Resume Called");
    }

    // При сворачивании окна сначала вызывается функция onPause
    @Override
    public void onPause() {
        super.onPause();
        Log.i("Lifecycle", "On Pause Called");
    }

    // После onPause вызывается onStop, тут уже Activity исчезает с экрана
    @Override
    public void onStop() {
        super.onStop();
        Log.i("Lifecycle", "On Stop Called");
    }

    // Activity закрылось полностью, это произошло либо по выбору пользователя, либо через код - вызвав функцию finish(), либо не хватило свободной оперативной памяти для открытого приложения и ОС Android очистила память удалив оттуда свернутые приложения.
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("Lifecycle", "On Destroy Called");
    }
}
Установите приложение на своё устройство, откройте, сверните, поменяйте ориентацию экрана, выйдите из приложения, очистите список открытых программ и проследите в LogCat какие сообщения выходят.