909.99K

Android. Экраны

1.

Android
Экраны

2.

Activity
Ключевым компонентом для создания визуального интерфейса в
приложении Android является activity (активность).
Нередко activity ассоциируется с отдельным экраном или окном
приложения, а переключение между окнами будет происходить
как перемещение от одной activity к другой.
Приложение может иметь одну или несколько activity. Например,
при создании проекта с пустой Activity в проект по умолчанию
добавляется один класс Activity - MainActivity, с которого и
начинается работа приложения

3.

MainActivity
public class MainActivity extends AppCompatActivity
{
// содержимое класса
}

4.

Activity
Все объекты activity представляют собой объекты
класса android.app.Activity, которая содержит базовую
функциональность для всех activity. В приложении из прошлой
темы мы напрямую с этим классом не работали, а MainActivity
наследовалась от класса AppCompatActivity. Однако сам класс
AppCompatActivity, хоть и не напрямую, наследуется от базового
класса Activity

5.

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

6.

Жизненный цикл
Все объекты activity, которые есть в приложении, управляются
системой в виде стека activity, который называется back stack.
При запуске новой activity она помещается поверх стека и
выводится на экран устройства, пока не появится новая activity.
Когда текущая activity заканчивает свою работу (например,
пользователь уходит из приложения), то она удаляется из стека, и
возобновляет работу та activity, которая ранее была второй в стеке

7.

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

8.

Жизненный цикл Activity
• protected void onCreate(Bundle saveInstanceState);
• protected void onStart();
• protected void onRestart();
• protected void onResume();
• protected void onPause();
• protected void onStop();
• protected void onDestroy();

9.

onCreate()
• onCreate - первый метод, с которого начинается выполнение activity. В
этом методе activity переходит в состояние Created. Этот метод
обязательно должен быть определен в классе activity. В нем
производится первоначальная настройка activity. В частности,
создаются объекты визуального интерфейса. Этот метод получает
объект Bundle, который содержит прежнее состояние activity, если оно
было сохранено. Если activity заново создается, то данный объект
имеет значение null. Если же activity уже ранее была создана, но
находилась в приостановленном состоянии, то bundle содержит
связанную с activity информацию.
• После того, как метод onCreate() завершил выполнение, activity
переходит в состояние Started, и и система вызывает метод onStart()

10.

onStart
В методе onStart() осуществляется подготовка к выводу activity на
экран устройства. Как правило, этот метод не требует
переопределения, а всю работу производит встроенный код. После
завершения работы метода activity отображается на экране,
вызывается метод onResume, а activity переходит в состояние
Resumed.

11.

onResume
При вызове метода onResume activity переходит в
состояние Resumed и отображается на экране устройства, и
пользователь может с ней взаимодействовать. И собственно
activity остается в этом состоянии, пока она не потеряет фокус,
например, вследствии переключения на другую activity или просто
из-за выключения экрана устройства.

12.

onPause
• Если пользователь решит перейти к другой activity, то система
вызывает метод onPause, а activity переходит в состояние Paused. В
этом методе можно освобождать используемые ресурсы,
приостанавливать процессы, например, воспроизведение аудио,
анимаций, останавливать работу камеры (если она используется) и
т.д., чтобы они меньше сказывались на производительность системы.
• Но надо учитывать, что в этот состоянии activity по прежнему остается
видимой на экране, и на работу данного метода отводится очень мало
времени, поэтому не стоит здесь сохранять какие-то данные, особенно
если при этом требуется обращение к сети, например, отправка
данных по интернету, или обращение к базе данных - подобные
действия лучше выполнять в методе onStop().

13.

onPause
• После выполнения этого метода activity становится невидимой,
не отображается на экране, но она все еще активна. И если
пользователь решит вернуться к этой activity, то система вызовет
снова метод onResume, и activity снова появится на экране.
• Другой вариант работы может возникнуть, если вдруг система
видит, что для работы активных приложений необходимо больше
памяти. И система может сама завершить полностью работу
activity, которая невидима и находится в фоне. Либо пользователь
может нажать на кнопку Back (Назад). В этом случае у activity
вызывается метод onStop.

14.

onStop
• В этом методе activity переходит в состояние Stopped. В этом
состоянии activity полностью невидима. В методе onStop следует
особождать используемые ресурсы, которые не нужны пользователю,
когда он не взаимодействует с activity. Здесь также можно сохранять
данные, например, в базу данных.
• При этом во время состояния Stopped activity остается в памяти
устройства, сохраняется состояние всех элементов интерфейса. К
примеру, если в текстовое поле EditText был введен какой-то текст, то
после возобновления работы activity и перехода ее в состояние
Resumed мы вновь увидим в текстовом поле ранее введенный текст.
• Если после вызова метода onStop пользователь решит вернуться к
прежней activity, тогда система вызовет метод onRestart. Если же
activity вовсе завершила свою работу, например, из-за закрытия
приложения, то вызывается метод onDestroy().

15.

onDestroy
• Ну и завершается работа activity вызовом метода onDestroy,
который возникает либо, если система решит убить activity в силу
конфигурационных причин (например, поворот экрана или при
многоконном режиме), либо при вызове метода finish().
• Также следует отметить, что при изменении ориентации экрана
система завершает activity и затем создает ее заново, вызывая
метод onCreate.

16.

Переходы между состояниями

17.

Fragments
• Сами фрагменты наследуются от androidx.fragment.app.Fragment.
Существует подклассы
фрагментов: ListFragment, DialogFragment, PreferenceFragment, W
ebViewFragment и др. Не исключено, что число классов будет
увеличиваться, например, появился ещё один
класс MapFragment.

18.

Fragments. FragmentManager
• Для взаимодействия между фрагментами используется
класс android.app.FragmentManager - специальный менеджер по
фрагментам.
• Как в любом офисе, спецманагер не делает работу своими
руками, а использует помощников. Например, для транзакций
(добавление, удаление, замена) используется класспомощник android.app.FragmentTransaction.

19.

Fragments. ЖЦ
У каждого фрагмента должен быть свой класс. Класс наследуется от
класса Fragment или схожих классов, о которых говорилось выше.
Это похоже на создание новой активности или нового компонента.
Также, как в активности, вы создаёте различные методы
типа onCreate() и т.д. Если фрагмент имеет разметку, то
используется метод onCreateView() - считайте его аналогом
метода setContentView(), в котором вы подключали разметку
активности. При этом метод onCreateView() возвращает
объект View, который является корневым элементом разметки
фрагмента.

20.

Fragments. ЖЦ

21.

Fragment
• Разметку для фрагмента можно создать программно или
декларативно через XML.
• Создание разметки для фрагмента ничем не отличается от
создания разметки для активности

22.

Fragments

23.

FragmentManager
• Класс FragmentManager имеет два метода, позволяющих найти
фрагмент, который связан с активностью:
• findFragmentById(int id)Находит фрагмент по
идентификаторуfindFragmentByTag(String tag)Находит фрагмент по
заданному тегу

24.

FragmentManager. Методы транзакции
• add()Добавляет фрагмент к активности
• remove()Удаляет фрагмент из активности
• replace()Заменяет один фрагмент на другой
• hide()Прячет фрагмент (делает невидимым на экране)
• show()Выводит скрытый фрагмент на экран
• detach() (API 13)Отсоединяет фрагмент от графического интерфейса, но
экземпляр класса сохраняется
• attach() (API 13)Присоединяет фрагмент, который был отсоединён
методом detach()
• Методы remove(), replace(), detach(), attach() не применимы к
статичным фрагментам.

25.

Transaction
Перед началом транзакции нужно получить
экземпляр FragmentTransaction через
метод FragmentManager.beginTransaction(). Далее вызываются
различные методы для управления фрагментами.
В конце любой транзакции, которая может состоять из цепочки
вышеперечисленных методов, следует вызвать метод commit().

26.

Аргументы фрагмента
• Фрагменты должны сохранять свою модульность и не должны
общаться друг с другом напрямую. Если один фрагмент хочет
докопаться до другого, он должен сообщить об этом своему
менеджеру активности, а он уже передаст просьбу другому
фрагменту. И наоборот. Это сделано специально для того, чтобы
было понятно, что менеджер тут главный и он не зря зарплату
получает. Есть три основных способа общения фрагмента с
активностью.

27.

Аргументы фрагмента
• Активность может создать фрагмент и установить аргументы для
него
• Активность может вызвать методы экземпляра фрагмента
• Фрагмент может реализовать интерфейс, который будет
использован в активности в виде слушателя

28.

Аргументы фрагмента
• Фрагмент должен иметь только один пустой конструктор без
аргументов. Но можно создать статический newInstance с
аргументами через метод setArguments().

29.

Аргументы фрагмента
• Доступ к аргументам можно получить в
методе onCreate() фрагмента:

30.

Аргументы фрагмента
• Динамически загружаем фрагмент в активность.

31.

Аргументы фрагмента
• Если активность должна выполнить какую-то операцию в
фрагменте, то самый простой способ - задать нужный метод в
фрагменте и вызвать данный метод через экземпляр фрагмента.

32.

Аргументы фрагмента
• Вызываем метод в активности:

33.

Управление стеком фрагментов
• Фрагменты, как и активности, могут управляться кнопкой Back. Вы можете
добавить несколько фрагментов, а потом через кнопку Back вернуться к
первому фрагменту. Если в стеке не останется ни одного фрагмента, то
следующее нажатие кнопки закроет активность.
• Чтобы добавить транзакцию в стек, вызовите
метод FragmentTransaction.addToBackStack(String) перед завершением
транзакции (commit). Строковый аргумент - опциональное имя для
идентификации стека или null. Класс FragmentManager имеет
метод popBackStack(), возвращающий предыдущее состояние стека по этому
имени.
• Если вы вызовете метод addToBackStack() при удалении или замещении
фрагмента, то будут вызваны методы фрагмента onPause(), onStop(),
onDestroyView().
• Когда пользователь нажимает на кнопку возврата, то вызываются методы
фрагмента onCreateView(), onActivityCreated(), onStart() и onResume().

34.

Связь между фрагментом и активностью
• Экземпляр фрагмента связан с активностью. Активность может
вызывать методы фрагмента через ссылку на объект фрагмента.
Доступ к фрагменту можно получить через
методы findFragmentById() или findFragmentByTag().
• Фрагмент в свою очередь может получить доступ к своей
активности через метод Fragment.getActivity().
English     Русский Правила