Жизненный цикл мобильного приложения на Android: намерения и фрагменты

Жизненный цикл мобильного приложения на Android: намерения и фрагменты

Намерение

Намерение - это абстрактное описание операции, которая должна быть выполнена. Его можно использовать в Context.startActivity для запуска активности BroadcastIntent для отправки его любым заинтересованным компонентам BroadcastReceiver и Context.startService или Context.bindService для связи с фоновой службой.

Намерение предоставляет средство для выполнения поздней привязки во время выполнения между кодом в разных приложениях. Его наиболее важное применение заключается в запуске мероприятий, где его можно рассматривать как связующее звено между ними. По сути, это пассивная структура данных, содержащая абстрактное описание действия, которое должно быть выполнено.

Структура намерений

Основными элементами информации в намерении являются:

действие - общее действие, которое должно быть выполнено. Например, ACTION_VIEW, ACTION_EDIT, ACTION_MAIN и т.д.

данные - данные для работы, такие, как запись пользователя в базе данных контактов, выраженные в виде URI.

В дополнение к этим основным атрибутам существует ряд вторичных атрибутов, которые вы также можете включить с намерением:

категория - предоставляет дополнительную информацию о выполняемом действии. Например, CATEGORY_LAUNCHER означает, что он должен отображаться в программе запуска как приложение верхнего уровня. В то время как CATEGORY_ALTERNATIVE означает, что он должен быть включен в список альтернативных действий, которые пользователь может выполнить с фрагментом данных.

тип - задает явный тип (MIME-тип) данных намерения. Обычно тип выводится из самих данных. Установив этот атрибут, вы отключаете эту оценку и принудительно вводите явный тип.

компонент - указывает явное имя класса компонента, которое будет использоваться для намерения. Обычно это определяется путем просмотра другой информации в намерении (действие, данные / тип и категории) и сопоставления ее с компонентом, который может ее обрабатывать. Если этот атрибут установлен, то никакая оценка не выполняется, и этот компонент используется точно так, как есть. При указании этого атрибута все остальные атрибуты намерения становятся необязательными.

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

Вот несколько примеров других операций, которые вы можете указать в качестве намерений, используя эти дополнительные параметры:

ACTION_MAIN с категорией CATEGORY_HOME - запуск главного экрана.

ACTION_GET_CONTENT с типом MIME vnd.android.cursor.item/phone --.

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

ACTION_GET_CONTENT с типом MIME */* и категорией.

CATEGORY_OPENABLE - отображает все средства выбора данных, которые могут быть открыты с помощью ContentResolver#openInputStream(Uri), позволяя пользователю выбрать один из них, а затем некоторые данные внутри него и возвращая результирующий URI вызывающему. Это может быть использовано, например, в приложении электронной почты, чтобы позволить пользователю выбрать некоторые данные для включения в качестве вложения.

Существует множество стандартных констант Intent action и category, определенных в классе Intent, но приложения также могут определять свои собственные. Эти строки используют область видимости в стиле Java, чтобы гарантировать, что они уникальны - например, стандартный ACTION_VIEW называется "android.intent.action.ВИД".

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

Фрагменты

Фрагмент представляет поведение или часть пользовательского интерфейса в FragmentActivity. Вы можете объединить несколько фрагментов в одном действии, чтобы создать мультипанельный пользовательский интерфейс и повторно использовать фрагмент в нескольких действиях. Вы можете думать о фрагменте как о модульном разделе действия, который имеет свой собственный жизненный цикл, получает свои собственные входные события и который вы можете добавлять или удалять во время выполнения действия (что-то вроде "подактивности", которую вы можете повторно использовать в разных действиях).

Фрагмент всегда должен размещаться в действии (Activity), и жизненный цикл фрагмента напрямую зависит от жизненного цикла основного действия. Например, когда действие приостановлено, то же самое происходит со всеми фрагментами в нем, а когда действие уничтожено, то же самое происходит со всеми фрагментами. Однако во время выполнения действия (оно находится в состоянии возобновленного жизненного цикла) вы можете управлять каждым фрагментом независимо, например добавлять или удалять их. Когда вы выполняете такую транзакцию фрагмента, вы также можете добавить ее в обратный стек, управляемый действием — каждая запись обратного стека в действии является записью о произошедшей транзакции фрагмента. Обратный стек позволяет пользователю отменить транзакцию фрагмента (перейти назад), нажав кнопку "Назад".

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

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

Философия дизайна

Android представила фрагменты в Android 3.0 (уровень API 11), в первую очередь, для поддержки более динамичного и гибкого дизайна пользовательского интерфейса на больших экранах, таких как планшеты. Поскольку экран планшета намного больше, чем у телефона, появляется больше возможностей для объединения и взаимозаменяемости компонентов пользовательского интерфейса. Фрагменты позволяют создавать такие конструкции без необходимости управления сложными изменениями в иерархии представлений. Разделив макет действия на фрагменты, вы получаете возможность изменять внешний вид действия во время выполнения и сохранять эти изменения в фоновом стеке, которым управляет действие. Теперь они широко доступны через библиотеку поддержки фрагментов.

Например, новостное приложение может использовать один фрагмент для отображения списка статей слева, а другой фрагмент для отображения статьи справа — оба фрагмента отображаются в одном действии бок о бок, и каждый фрагмент имеет свой собственный набор методов обратного вызова жизненного цикла и обрабатывает свои собственные события пользовательского ввода. Таким образом, вместо того, чтобы использовать одно действие для выбора статьи и другое действие для чтения статьи, пользователь может выбрать статью и прочитать все это в рамках одного действия, как показано в макете планшета на первом изображении.

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

Фрагменты

Пример того, как два модуля пользовательского интерфейса, определенные фрагментами, могут быть объединены в одно действие для дизайна планшета, но разделены для дизайна телефона.

Например, чтобы продолжить пример новостного приложения, приложение может вставлять два фрагмента в действие A при запуске на устройстве размером с планшет. Однако на экране размером с телефон не хватает места для обоих фрагментов, поэтому действие A включает только фрагмент для списка статей, и когда пользователь выбирает статью, он запускает действие B, которое включает второй фрагмент для чтения статьи. Таким образом, приложение поддерживает как планшеты, так и телефоны, повторно используя фрагменты в различных комбинациях.

Дополнительные сведения о разработке приложения с использованием различных комбинаций фрагментов для различных конфигураций экрана см. в разделе "Обзор совместимости экрана". 

Создание фрагмента

Жизненный цикл фрагмента

Жизненный цикл фрагмента (во время выполнения его действия).

Чтобы создать фрагмент, вы должны создать подкласс Fragment (или существующий его подкласс). Класс Fragment содержит код, который очень похож на Activity. Он содержит методы обратного вызова, аналогичные activity, такие как onCreate(), OnStart(), onPause() и onStop(). На самом деле, если вы конвертируете существующее приложение Android для использования фрагментов, вы можете просто переместить код из методов обратного вызова вашего действия в соответствующие методы обратного вызова вашего фрагмента.

Обычно вы должны реализовать по крайней мере следующие методы жизненного цикла:

onCreate()

Система вызывает это при создании фрагмента. В рамках вашей реализации вы должны инициализировать основные компоненты фрагмента, которые вы хотите сохранить, когда фрагмент приостановлен или остановлен, а затем возобновлен.

onCreateView()

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

onPause()

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

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

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

Есть также несколько подклассов, которые вы, возможно, захотите расширить вместо базового класса фрагментов:

Фрагмент диалогового окна

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

Фрагмент списка

Отображает список элементов, управляемых адаптером (например, SimpleCursorAdapter), аналогично ListActivity. Он предоставляет несколько методов для управления представлением списка, таких как обратный вызов onListItemClick() для обработки событий щелчка. (Обратите внимание, что предпочтительным методом отображения списка является использование RecyclerView вместо ListView. В этом случае вам нужно будет создать фрагмент, который включает в свой макет RecyclerView.

PreferenceFragmentCompat

Отображает иерархию объектов предпочтений в виде списка. Это используется для создания экрана настроек для вашего приложения.

Добавление пользовательского интерфейса

Фрагмент обычно используется как часть пользовательского интерфейса действия и вносит свой собственный макет в действие.

Чтобы предоставить макет для фрагмента, вы должны реализовать метод обратного вызова onCreateView(), который система Android вызывает, когда пришло время фрагменту нарисовать свой макет. Ваша реализация этого метода должна возвращать представление, являющееся корнем макета вашего фрагмента.

Примечание: Если ваш фрагмент является подклассом ListFragment, реализация по умолчанию возвращает ListView из onCreateView(), поэтому вам не нужно его реализовывать. Чтобы вернуть макет из onCreateView(), вы можете создать его из ресурса макета, определенного в XML. Чтобы помочь вам в этом, onCreateView() предоставляет объект LayoutInflater.

Полезные ссылки:

Основные шаги жизненного цикла мобильного приложения для Android

Телеграм: https://t.me/the_cybermania

Read More