Компоненты приложений в Android
Основной чертой ОС Android является то, что элементы одного приложения в системе могут использоваться для своего функционала другим приложением, если предоставлять такой доступ. Например, если необходимо реализовать прокручиваемый список сообщений, а на другом приложении уже создан необходимый функционал, который в свою очередь, открыт для использования другим приложениям, то можно не создавать собственный функционал заново, а просто вызвать существующий. При таком заимствовании, программа просто запускает некоторый фрагмент файла другого кода, когда возникает такая необходимость. Чтобы обеспечить такой принцип работы, система должна быть способна запускать процесс приложения тогда, когда потребуется любая его часть и создавать экземпляры java-объектов именно для этой части. Поэтому приложения Android не имеют единой точки входа, как это принято в большинстве систем. Вместо этого их код представляет собой набор некоторых отдельных целостных сущностей, компонент, из которых система может создавать экземпляры и использовать их [1].
Можно выделить четыре типа таких сущностей-компонент. Поговорим о каждой в отдельности представляет собой внешний пользовательский интерфейс для одной операции, которую может совершить пользователь. Если упростить, то это просто один текущий экран как некоторая единица активности, своего рода кадр с одним пользовательским действием. Здесь и далее используется термин activity без перевода, как некоторое имя собственное. Хотя дословный перевод, «активность» или «действие», хорошо передает общий смысл компонента [2].
Например, activity может предоставить список пунктов меню, которые может выбрать пользователь или отобразить фотографии с их подписями. Или другой пример - приложение для мгновенного обмена сообщениями может использовать одно activity для того, чтобы отобразить лист контактов, другое - чтобы создать сообщение для выбранного контакта, третье - чтобы посмотреть историю сообщений или выполнить настройки и так далее.
Все activity текущего приложения работают вместе и формируют единый пользовательский интерфейс, однако при этом они независимы между собой. Каждое из них реализовано как подкласс базового класса Activity, обеспечивающего создание окна, в котором программист может поместить визуальный интерфейс [3].
Приложение может состоять из всего одного activity или сразу из нескольких, как упомянутый ранее в качестве примера мессенджер. Какие именно activity и сколько их, зависит от конкретного приложения и его дизайна. Как правило, одно из activity помечается как первое, это означает, что оно предоставлено пользователю при запуске приложения. Одно activity может запускать другое. Таким образом, переход от одного activity к другому осуществляется тогда, когда текущее activity вызывает следующее [4].
Каждое activity предоставляет окно по умолчанию. Обычно окно создается в полноэкранном виде, но оно также может и не занимать весь экран и находиться поверх других окон. Activity также может задействовать дополнительные окна - например, всплывающее диалоговое для взаимодействия с пользователем в процессе работы activity, или окно для предоставления текущей информации при выборе какой-нибудь важной опции [5].
Визуальное содержание окна строится с помощью иерархии визуальных компонентов (или представлений) - объектов, производных от базового класса View. Каждый компонент представляет собой просто прямоугольное пространство внутри окна. Родительские компоненты содержат дочерние и организуют их расположение. Иерархию компонент можно представить в виде дерева, а те элементы, которые находятся в самой нижней его части (листья) и не имеют дочерних компонент, отрисовывают прямоугольные области и ожидают действий пользователя на этом участке. Таким образом осуществляется интерактивное взаимодействие с пользователем. К примеру, такое представление может отображать на экране маленькую иконку и инициировать какое-нибудь действие, когда пользователь на неё нажмет. В операционной системе Android уже есть набор готовых визуальных компонент, которые доступны для использования разработчиками. Набор включает в себя кнопки, текстовые поля, полосы прокрутки, меню, флажки-переключатели и многое другое [6].
Для того чтобы поместить в окно такую иерархию, нужно вызвать метод Activity.setContentView(). Параметром метода является экземпляр класса View, лежащий в корне иерархии.(сервисы) представляют из себя компоненты, которые работают в фоновом режиме. Он, как правило, требуется для длительных операций или для обеспечения работы удаленных процессов, но в общем случае это просто режим, который функционирует, когда приложение не в фокусе. Примером такого процесса может стать прослушивание музыки в то время, когда пользователь делает что-то другое или получение данных по сети без блокирования текущей активности. Сервис сам по себе не предоставляет пользовательского интерфейса, то есть с пользователем не взаимодействует, а запускается, управляется и связан с другими компонентами, например, activity. Также может запускаться вместе с системой.providers Данный компонент управляет наборами данных, которые приложения предоставляют другим. Эти данные могут храниться в файловой системе, базах данных SQLite, в сети, или в любом другом постоянном месте, к которому приложение может иметь доступ. Посредством content provider другое приложение может запрашивать данные и, если выставлены соответствующие разрешения, изменять их. Например, система Android содержит content provider, который управляет пользовательской информацией о контактах. Он позволяет любому приложению, обладающему соответствующими правами вызывать составляющие этого компонента для того, чтобы считывать, записывать или изменять информацию о конкретном человеке [7].
В более общем случае, content provider можно использовать для чтения и записи данных, которые используются приложением и не являются открытыми для других. Например, приложение Note Pad использует такой компонент для сохранения сделанных записей.
Данные компоненты реализуются как подкласс ContentProvider. И для того, чтобы другие приложения могли совершить операции с данными, им необходимо предоставить стандартный набор API.receivers. Этот компонент отвечает за распространение общесистемных сообщений, отслеживание и реагирование на действия. Многие оповещения идут от системы, например, сообщения о том, что заряд батареи мал или экран выключен. Приложения также могут инициировать такие оповещения, например, сигнализировать о том, что информация загружена на устройство и доступна к использованию. Как и сервисы, broadcast receiver не предоставляет пользовательского интерфейса, однако, он способен создавать уведомления в строке состояния, чтобы предупреждать пользователя о том, что произошло какое-то событие. Однако чаще broadcast receiver взаимодействует с другими компонентами для того, чтобы самому выполнять минимальный объем работы. Так, он может инициировать сервисы для выполнения действий, привязанных к какому-то событию [8].
Можно выделить четыре типа таких сущностей-компонент. Поговорим о каждой в отдельности представляет собой внешний пользовательский интерфейс для одной операции, которую может совершить пользователь. Если упростить, то это просто один текущий экран как некоторая единица активности, своего рода кадр с одним пользовательским действием. Здесь и далее используется термин activity без перевода, как некоторое имя собственное. Хотя дословный перевод, «активность» или «действие», хорошо передает общий смысл компонента [2].
Например, activity может предоставить список пунктов меню, которые может выбрать пользователь или отобразить фотографии с их подписями. Или другой пример - приложение для мгновенного обмена сообщениями может использовать одно activity для того, чтобы отобразить лист контактов, другое - чтобы создать сообщение для выбранного контакта, третье - чтобы посмотреть историю сообщений или выполнить настройки и так далее.
Все activity текущего приложения работают вместе и формируют единый пользовательский интерфейс, однако при этом они независимы между собой. Каждое из них реализовано как подкласс базового класса Activity, обеспечивающего создание окна, в котором программист может поместить визуальный интерфейс [3].
Приложение может состоять из всего одного activity или сразу из нескольких, как упомянутый ранее в качестве примера мессенджер. Какие именно activity и сколько их, зависит от конкретного приложения и его дизайна. Как правило, одно из activity помечается как первое, это означает, что оно предоставлено пользователю при запуске приложения. Одно activity может запускать другое. Таким образом, переход от одного activity к другому осуществляется тогда, когда текущее activity вызывает следующее [4].
Каждое activity предоставляет окно по умолчанию. Обычно окно создается в полноэкранном виде, но оно также может и не занимать весь экран и находиться поверх других окон. Activity также может задействовать дополнительные окна - например, всплывающее диалоговое для взаимодействия с пользователем в процессе работы activity, или окно для предоставления текущей информации при выборе какой-нибудь важной опции [5].
Визуальное содержание окна строится с помощью иерархии визуальных компонентов (или представлений) - объектов, производных от базового класса View. Каждый компонент представляет собой просто прямоугольное пространство внутри окна. Родительские компоненты содержат дочерние и организуют их расположение. Иерархию компонент можно представить в виде дерева, а те элементы, которые находятся в самой нижней его части (листья) и не имеют дочерних компонент, отрисовывают прямоугольные области и ожидают действий пользователя на этом участке. Таким образом осуществляется интерактивное взаимодействие с пользователем. К примеру, такое представление может отображать на экране маленькую иконку и инициировать какое-нибудь действие, когда пользователь на неё нажмет. В операционной системе Android уже есть набор готовых визуальных компонент, которые доступны для использования разработчиками. Набор включает в себя кнопки, текстовые поля, полосы прокрутки, меню, флажки-переключатели и многое другое [6].
Для того чтобы поместить в окно такую иерархию, нужно вызвать метод Activity.setContentView(). Параметром метода является экземпляр класса View, лежащий в корне иерархии.(сервисы) представляют из себя компоненты, которые работают в фоновом режиме. Он, как правило, требуется для длительных операций или для обеспечения работы удаленных процессов, но в общем случае это просто режим, который функционирует, когда приложение не в фокусе. Примером такого процесса может стать прослушивание музыки в то время, когда пользователь делает что-то другое или получение данных по сети без блокирования текущей активности. Сервис сам по себе не предоставляет пользовательского интерфейса, то есть с пользователем не взаимодействует, а запускается, управляется и связан с другими компонентами, например, activity. Также может запускаться вместе с системой.providers Данный компонент управляет наборами данных, которые приложения предоставляют другим. Эти данные могут храниться в файловой системе, базах данных SQLite, в сети, или в любом другом постоянном месте, к которому приложение может иметь доступ. Посредством content provider другое приложение может запрашивать данные и, если выставлены соответствующие разрешения, изменять их. Например, система Android содержит content provider, который управляет пользовательской информацией о контактах. Он позволяет любому приложению, обладающему соответствующими правами вызывать составляющие этого компонента для того, чтобы считывать, записывать или изменять информацию о конкретном человеке [7].
В более общем случае, content provider можно использовать для чтения и записи данных, которые используются приложением и не являются открытыми для других. Например, приложение Note Pad использует такой компонент для сохранения сделанных записей.
Данные компоненты реализуются как подкласс ContentProvider. И для того, чтобы другие приложения могли совершить операции с данными, им необходимо предоставить стандартный набор API.receivers. Этот компонент отвечает за распространение общесистемных сообщений, отслеживание и реагирование на действия. Многие оповещения идут от системы, например, сообщения о том, что заряд батареи мал или экран выключен. Приложения также могут инициировать такие оповещения, например, сигнализировать о том, что информация загружена на устройство и доступна к использованию. Как и сервисы, broadcast receiver не предоставляет пользовательского интерфейса, однако, он способен создавать уведомления в строке состояния, чтобы предупреждать пользователя о том, что произошло какое-то событие. Однако чаще broadcast receiver взаимодействует с другими компонентами для того, чтобы самому выполнять минимальный объем работы. Так, он может инициировать сервисы для выполнения действий, привязанных к какому-то событию [8].
Список литературы
- Казанин, А. А. Анализ и классификация приложений на платформе Android OS, использующих технологию GPS / А. А. Казанин, А. В. Ананьин, Е. А. Мельгунова. – М: 2015. – С.251-254.
- Колисниченко, Д. Программирование для Android. Самоучитель / Д. Колисниченко. – М: БХВ-Петербург, 2012. – 272 с.
- Коматинени С. Android 4 для профессионалов: Создание приложений для планшетных компьютеров и смартфонов / С. Коматинени, Д. Маклин, С. Хашими; Пер. с англ. Ю.И. Корниенко [и др.]. – М.: Вильямс. - 2012. – 880 с.
- Левин, А. Android на планшетах и смартфонах. / А. Левин. – СПБ: Питер: 2013. – 224 с.
- Майер, Р. Android 4. Программирование приложений для планшетных компьютеров и смартфонов / Р. Майер. – М: Изд-во Эскмо, 2013. – 816 с.
- Макарцев, А. В. Сравнение сред разработки android приложений Eclipse и Android Studio / А. В. Макарцев, В. Ю. Пирогов. – Шадринск : 2016. – С.57-58.
- Медникс З. Программирование под Android / З. Медникс, Л. Дорнин, Б. Мик. - М.: 2013. – 560 с.
- Мельникова, О. Программирование под Android / О. Мельникова. – М : Питер-Москва, 2013. – 506 с.