Uchebn_posobie-Razrabotka-mobilnykh-prilozheniy-na-yazyke-JAVA-s-ispolzovaniem-ANDROID-STUDIO.pdf.pdf
Document Details
Uploaded by MagicalFaith3226
Almaty Technological University (АТУ)
Full Transcript
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего образования «Воронежский государственный технический университет» А. М. Нужный, Н. И. Гребенникова, В. В. Сафронов РАЗРАБОТКА МОБИЛЬНЫХ П...
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего образования «Воронежский государственный технический университет» А. М. Нужный, Н. И. Гребенникова, В. В. Сафронов РАЗРАБОТКА МОБИЛЬНЫХ ПРИЛОЖЕНИЙ НА ЯЗЫКЕ JAVA С ИСПОЛЬЗОВАНИЕМ ANDROID STUDIO Учебное пособие Воронеж 2020 УДК 681.3.06(07) ББК 32.973-018я7 Н24 Рецензенты: кафедра вычислительной техники и информационных систем Воронежского государственного лесотехнического университета им. Г. Ф. Морозова (зав. кафедрой д-р техн. наук, проф. В. К. Зольников); канд. техн. наук П. Ю. Гусев Нужный, А.М. Разработка мобильных приложений на языке Java с Н24 использованием Android Studio: учебное пособие [Электронный ресурс]. - Электрон, текстовые и граф. данные (3,14 Мб) / А. М. Нужный, Н. И. Гребенникова, В. В. Сафронов. - Воронеж: ФГБОУ ВО «Воронежский государственный технический университет», 2020. 1 электрон. опт. диск (CD-ROM): цв. – Систем. требования: ПК 500 и выше; 256 Мб ОЗУ; Windows 7; SVGA с разрешением 1024x768;. Adobe Acrobat; CD-ROM дисковод; мышь. - Загл. с экрана. ISBN 978-5-7731-0906-8 В пособии рассматриваются базовые аспекты разработки приложений в среде Android Studio на языке Java. Издание предназначено для студентов направления подготовки бакалавров 09.03.01 «Информатика и вычислительная техника» (профили «Вычислительные машины, комплексы, системы и сети», «Системы автоматизированного проектирования», «Системы автоматизированного проектирования в машиностроении») при изучении дисциплин «Программирование на языке Java», «Среды визуального программирования». Ил. 80. Табл. 2. Библиогр.: 3 назв. УДК 681.3.06(07) ББК 32.973-018я7 Издается по решению редакционно-издательского совета Воронежского государственного технического университета ISBN 978-5-7731-0906-8 Нужный А. М., Гребенникова Н. И., Сафронов В. В., 2020 ФГБОУ ВО «Воронежский государственный технический университет», 2020 ВВЕДЕНИЕ При всем разнообразии направлений использования языка Java, начиная от разработки серверных приложений в таких корпорациях как Citigroup, Deutsche Bank, Barclays, и заканчивая приложениями для встраиваемых систем типа смарт-карт или сенсоров, на сегодняшний день наиболее интересной, динамично развивающейся и востребованной является область разработки мобильных приложений для платформы Android. Данное учебное пособие содержит теоретические сведения и указания по выполнению практических работ, позволяющие овладеть навыками по установке, настройке и разработке простых приложений для мобильных устройств в среде разработки Android Studio. В пособии кратко рассмотрены принципы работы операционной системы Android, описаны компоненты Java- приложений для этой системы, принципы их взаимодействия и приемы создания. Приведено описание основных элементов графического интерфейса и описаны способы работы с ними. Рассмотрены аспекты взаимодействия пользовательских приложений со стандартными приложениями ОС Android, методы работы со всевозможными мультимедийными данными. Указания по выполнению практических работ содержат детальные указания по практическому использованию возможностей Android Studio, методов управления элементами графического интерфейса, приемов организации взаимодействия с системными приложениями. 3 ТЕМА 1. СОЗДАНИЕ ПЕРВОГО ПРИЛОЖЕНИЯ ANDROID Цель изучения: формирование базовых навыков по установке и настройке среды разработки Android Studio, созданию и отладке простого Java-приложения. 1.1. Теоретическая часть 1.1.1. Краткие сведения об Android Android - бесплатная операционная система, основанная на ядре Linux и оригинальной реализации виртуальной машины Java, выполненной компанией Google. Приложения для Android пишутся преимущественно на языках программирования Java и, в последнее время, Kotlin. Инструменты Android SDK (Software Development Kit – комплект разработки программного обеспечения) компилируют код Java, все требуемые файлы данных и ресурсов в файл APK – программный пакет Android, который представляет собой файл архива с расширением.apk. В файле APK находится все, что требуется для работы Android-приложения. Он позволяет установить приложение на любом устройстве под управлением системы Android. При разработке на Java могут использоваться различные среды разработки, такие как Android Studio, Eclipse, IntelliJ IDEA, но следует учитывать, что с 2016 официальная поддержка плагинов Eclipse под Android прекратилась, а Android Studio объявлена Google официальной средой разработки под Android. Android Studio, по сути, — известная Java IDE IntelliJ IDEA с плагинами, ориентированными на разработку под Android. Актуальная версия доступна для скачивания по ссылке: https://developer.android.com/studio/index.html. 4 Android Studio предоставляет возможность работать с компонентами пользовательского интерфейса при помощи перетаскивания, обеспечивает функцию предпросмотра макета, обладает системой автоматической сборки Gradle, позволяет генерировать различные виды сборок и генерацию нескольких.apk файлов. Также в Android Studio имеются средства рефакторинга кода, утилита для подписывания приложений, шаблоны основных макетов и компонентов Android. Системные требования Android Studio приведены в табл.1. Таблица 1 Системные требования Android Studio Windows OS X Linux Microsoft Mac® OS X® 10.8.5 Windows или выше, до 10.13 / GNOME Версия OS 10/8/7/Vista/ 10.14 (High Sierra/ или KDE 2003 (32 или Mojave) 64-bit) Оперативная 3 ГБ (минимум), 8 ГБ (рекомендуется); +1 ГБ для память Android Emulator 2 ГБ минимум (500 МБ для IDE + 1.5 ГБ для Свободное Android SDK и образа системы эмулятора), 4 ГБ место на диске SSD рекомендуемое Версия JDK Java Development Kit 8 Разрешение 1280 x 800 (минимум) экрана GNU C Library Java Runtime Дополнительно — (glibc) Environment (JRE) 6 2.15 или выше Любое Android-приложение на устройстве работает в изолированной программной среде (в "песочнице"). Это реализовано за счет того, что Android представляет собой 5 многопользовательскую систему Linux, в которой каждое приложение рассматривается как отдельный пользователь. Каждому приложению присваивается уникальный идентификатор пользователя и полномочия для всех файлов приложения назначаются таким образом, чтобы доступ к ним был разрешен только пользователю с данным идентификатором. Каждый процесс Linux выполняется на собственной виртуальной машине (ВМ) изолированно от других приложений, при этом каждое приложение выполняется в собственном процессе Linux. Android запускает процесс, когда требуется выполнить какой-либо компонент приложения, а затем завершает процесс, когда он больше не нужен, либо, когда системе требуется освободить память для других приложений. Система Android реализует принцип предоставления минимальных прав, т.е., приложение по умолчанию имеет доступ только к тем компонентам, которые ему необходимы для работы. Таким образом формируется исключительно безопасная среда, в которой приложение не имеет доступа к недозволенным областям системы. Однако у приложения есть варианты предоставления своих данных другим приложениям и доступа к системным службам. Приложение может запросить разрешение на доступ к данным устройства, например, к контактам пользователя, SMS-сообщениям, подключаемой карте памяти (SD-карте), камере, Bluetooth и др. Все разрешения должны предоставляться приложению при его установке. Кроме этого, группе приложений, подписанных одним сертификатом, может быть назначен одинаковый идентификатор пользователя, что позволяет им совместно использовать ресурсы и выполняться в рамках одной ВМ. 6 1.1.2. Компоненты Android-приложения Компоненты являются строительными блоками для создания приложений Android и представляют собой точки входа, через которые система может взаимодействовать с приложениями. Существуют следующие типы компонентов: - операции; - службы; - поставщики контента; - приемники широковещательных сообщений. Операция Activity — основной компонент приложения, используемый для организации взаимодействия с пользователем и формирующий окно для организации пользовательского интерфейса. Стандартное окно является полноэкранным, однако его размер может быть меньше, и оно может размещаться поверх других окон. Обычно приложение содержит несколько операций, слабо связанных между собой. Одна из операций в приложении обозначается как «основная» и предоставляется пользователю при первом запуске приложения. При этом, каждая операция может запустить другую операцию для выполнения различных действий. При запуске новой операции предыдущая операция останавливается системой и сохраняется в так называемом «стеке переходов назад», работающем по принципу «последним вошёл — первым вышел». После завершения пользователем текущей операции и нажатия кнопки «Назад», последняя операция удаляется из стека (и уничтожается), и возобновляется предыдущая операция. Служба (Service) - компонент, работающий в фоновом режиме и предназначенный для выполнения длительных 7 операции, например, фоновое прослушивание музыки, закачка данных по сети. Служба не имеет интерфейса и запускается другим компонентом, который в дальнейшем может взаимодействовать с ней, – например операцией. Поставщик контента (Content provider) – компонент для управления набором данных, хранимых в файловой системе, базе данных SQLite, Интернете или любом другом месте, к которому у приложения имеется доступ. Посредством поставщика контента другие приложения могут запрашивать или даже изменять данные. Так, в Android есть поставщик контента, управляющий информацией контактов пользователя. Приложение, получившее соответствующие разрешения, может запросить часть этого поставщика контента (например, ContactsContract.Data) для чтения и записи сведений об определенном контакте. Приемник широковещательных сообщений (Broadcast receiver) представляет собой компонент, который реагирует на объявления, распространяемые по всей системе. Объявления могут быть как системными (разряжен аккумулятор, сделан фотоснимок, выключился экран), так и рассылаться приложениями (данные загружены и готовы к использованию). Приемники широковещательных сообщений не имеют пользовательского интерфейса, но они могут создавать уведомления в строке состояния, чтобы предупредить пользователя о событии "рассылка объявления". Однако чаще всего они являются просто "шлюзом" для других компонентов и предназначены для выполнения минимального объема работы. 8 1.1.3. Запуск и взаимодействие компонентов Особенностью системы Android является то, что любое приложение может запустить компонент другого приложения. Так как каждое приложение выполняется системой в отдельном процессе с такими правами доступа к файлам, которые ограничивают доступ в другие приложения, пользовательское приложение не может напрямую вызвать компонент из другого приложения. Это может сделать сама система Android. Поэтому, чтобы вызвать компонент в другом приложении, необходимо сообщить системе о своем намерении (Intent) запустить определенный компонент. После этого система активирует требуемый компонент. Объекты Intent представляют собой асинхронные сообщения, которые связывают друг с другом отдельные компоненты во время выполнения и могут быть представлены для наглядности в виде мессенджеров, посылающих другим компонентам запрос на выполнение действий. Для операций и служб Intent определяет действие, которое требуется выполнить (например, просмотреть (view) или отправить (send) что-то), а также может указывать URI (Uniform Resource Identifier – унифицированный идентификатор ресурса) данных, с которыми это действие нужно выполнить. Например, объект Intent может передавать запрос на выполнение операции "показать изображение" или "открыть веб-страницу". Для запуска компонентов приложения системе Android необходимо знать, что компонент существует. Информация о них хранится в файле манифеста приложения AndroidManifest.xml. Файл должен находиться в корневой папке приложения и содержит объявления всех компонентов приложения, а также определяет разрешения приложения, 9 указания на используемые библиотеки, программные и аппаратные функции. 1.1.4. Жизненный цикл и методы операции (Activity) Все объекты Activity представляют собой объекты класса android.app.Activity, который содержит базовую функциональность для всех Activity. После запуска Activity проходит через ряд событий, которые обрабатываются системой, и для обработки которых существует ряд обратных вызовов (рис. 1). Рис. 1. Жизненный цикл activity 10 Первый метод, с которого начинается выполнение activity – onCreate. Он переводит объект Activity в состояние Created. Метод обычно переопределяется и является обязательным. Он содержит первоначальную настройку, в частности описание элементов визуального интерфейса. Помимо этого, метод получает объект Bundle, содержащий прежнее состояние Activity, если оно было сохранено. Это позволяет, например, вернуться к выбранной записи в списке контактов после ее редактирования, а не начинать просмотр всех записей сначала. Метод onStart() выполняет подготовку Activity к выводу на экран устройства и обычно не переопределяется. Метод onResume() переводит Activity в состояние Resumed, когда пользователь может с ней взаимодействовать. В этом состоянии Actitvity остается, пока не потеряет фокус. Метод onPause() вызывается, если пользователь переходит к другой Actitvity. Он освобождает используемые ресурсы и приостанавливает процессы. Аctivity становится невидимой, не отображается на экране, но продолжает быть активной и может быть вновь выведена на экран методом onResume(). Метод onSaveInstanceState() вызывается после метода onPause(), но до вызова onStop(). В onSaveInstanceState производится сохранение состояния приложения в передаваемый в качестве параметра объект Bundle. Метод onStop() переводит Аctivity в состояние Stopped. В методе onStop следует освобождать используемые ресурсы, которые не нужны пользователю, когда он не взаимодействует с Activity. Здесь также можно сохранять данные, например, в базу данных. После работы этого метода работа с Actitvity возможна при помощи методов onRestart() или onCreate(). 11 Завершается работа активности вызовом метода onDestroy, который возникает в случае, если система решит убить activity, либо при вызове метода finish(). Также следует отметить, что при изменении ориентации экрана система завершает activity и затем создает ее заново, вызывая метод onCreate. 1.2. Практическая часть 1.2.1. Установка средств разработки. Установка JDK В первую очередь для создания Android-приложений следует загрузить и установить пакет JDK (Java Development Kit), который необходим для разработки на языке Java. JDK можно найти на сайте компании Oracle: http://www.oracle.com/technetwork/java/javase/downloads/index. html. Рис. 2. Страница загрузки Java Platform 12 1.2.2. Настройка среды окружения После установки JDK в ОС Windows следует добавить в переменную среды окружения Path путь к исполняемым файлам JDK (например, «c:\Program Files\Java\jdk1.7.0_71\bin\»), а также создать или отредактировать системную переменную JAVA_HOME, значение которой также хранит путь к исполняемым файлам JDK. Рис. 3. Настройка переменных среды окружения 1.2.3. Установка Android Studio Следующим этапом является установка IDE Android Studio, доступной для загрузки по адресу: https://developer.android.com/studio Для загрузки следует принять лицензионное соглашение. После загрузки установочный файл следует запустить от имени администратора и следовать указаниям установщика. 13 Рис. 4. Установка Android Studio По окончании установки будет предложено запустить Android Studio, и выполнится установка Android SDK. Внимание! Android SDK по умолчанию устанавливается в каталоги профилей пользователя, что, в случае использования переносимых профилей, приведет к значительному росту их размера и, как, следствие, недопустимому увеличению времени загрузки компьютера. 14 В связи с этим, в лабораториях кафедры АВС запуск Android Studio осуществляется от имени локального администратора и выполняется преподавателем. Рис. 5. Установка Android SDK На этом этапе можно включить и установку эмулятора (виртуального устройства Android). В процессе установки система попросит определить объем дискового пространства для Hardware acselerated execution manager. Не следует указывать объем памяти меньше рекомендованного. 15 Рис. 6. Конфигурирование По завершении установки будет предложено создать новое приложение. 1.2.4. Создание первого приложения 1.2.4.1. Выбор шаблона В главном меню программы выберите File-New-New Project. Android Studio предоставляет ряд шаблонов для различных ситуаций, но самыми актуальными для разработки нового приложения являются Basic Activity и Empty Activity. Выберите шаблон Empty Activity на закладке Phone and Tablet и нажмите кнопку Next. 16 Рис. 7. Выбор шаблона 1.2.4.2. Конфигурирование проекта В следующем окне осуществляется настройка основных параметров проекта. Рис. 8. Окно конфигурирования проекта 17 В поле Name следует указать имя приложения, которое будет в дальнейшем отображаться в заголовке. Поле Pacage Name по умолчанию содержит имя пакета com.example.имя приложения в формате доменных имен, характерном для Java. В дальнейшем это имя будет преобразовано в структуру каталогов по пути, указанному в поле Save location. Имя часто использует обратное доменное имя компании-разработчика. Например, «com.example.mypackage» - пакет с именем mypackage, созданный программистом в компании example.com. В поле Language следует указать Java, а в поле Minimum API level можно указать API 21: Android 5.0 (Lollipop). Выбор минимального уровня, поддерживаемого API, определяется данными об использовании различных версий ОС Android. Таблица 2 Процент устройств с поддержкой различных версий Android Android platform version API level Cumulative distribution 10.0 Android 10 29 8.2% 9.5 Pie 28 39.5% 8.1 Oreo 27 53.5% 8.0 Oreo 26 60.8% 7.1 Nougat 25 66.2% 7.0 Nougat 24 73.7% 6.0 Marshmallow 23 84.9% 5.1 Lollipop 22 92.3% 5.0 Lollipop 21 94.1% 4.4 KitKat 19 98.1% 4.3 Jelly Bean 18 98.4% 4.2 Jelly Bean 17 99.2% 4.1 Jelly Bean 16 99.8% 18 По окончании настройки нажмите кнопку Finish. Вариант настройки проекта приведен на рис. 9. Рис. 9. Вариант настройки проекта 1.2.4.3. Работа с проектом Обратите внимание, что новый проект создается в новом окне Android Studio. Для высвобождения ресурсов исходное окно рекомендуется закрыть. Через некоторое время, когда будет создана структура проекта, окно Android Studio примет приблизительно следующий вид: 19 Рис. 10. Первоначальное отображение проекта в Android Studio В правой части окна отображаются главные файлы проекта: - MainActivity.java – содержит логику приложения; - activity_main.xml - содержит определение графического интерфейса приложения, доступен для редактирования в режимах Design или Text. Рис. 11. Элементы редактирования файла activity_main.xml в режиме Design 20 Уже в исходном состоянии приложение может быть запущено в эмуляторе. Для этого, если эмулятор уже установлен, следует нажать пиктограмму «Run App» или Shift+F10. Произойдет запуск эмулятора и выполнение нашей программы. Рис.12. Запущенная программа в эмуляторе 1.2.4.4. Структура проекта На рисунке 13 слева приведена полная структура проекта (доступна при выборе пункта Project в верхней левой части экрана) и, справа - структура папки MyFirstApplication\app\, содержащей наиболее интересные для нас файлы. 21 Рис. 13. Структура проекта Папка \app является отдельным модулем для приложения и содержит все необходимые файлы приложения - код, ресурсы картинок и т.д., например: 1. Файл \app\build\outputs\apk\debug\app- debug.apk - установочный файл системы Android, который будет создан при выборе пункта меню «Build - Build Bandle(s)/APK – Build APK (S)». 2. Файл \app\src\main\java\ivanov\myfirstapplication\MainActivity.java (см. выше); 3. Файл \app\src\main\res\layout\аctivity_main.xml (см. выше); 22 4. Также в каталоге \app\src\main\ располагается файл-манифест приложения AndroidManifest.xml. Остальные папки проекта служат для хранения различных настроек, управления проектом и т.д. 1.2.4.5. Анализ файлов проекта Рассмотрим содержимое файла MainActivity.java: package com.nam.myapp0; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } Рис. 14. Cодержимое файла MainActivity.java Как можно увидеть, имя пакета совпадает с именем приложения, определенным ранее. Далее производится подключение библиотек и определение класса MainActivity с переопределенным методом onCreate. В дальнейшем в этом файле будет храниться вся логика первой Activity нашего приложения. Эта Activity связана с файлом аctivity_main.xml, содержащим описание формы (экрана), что прописано в последней строчке кода определения метода onCreate. Содержимое файла аctivity_main.xml: 23 Рис. 15. Cодержимое файла разметки Файл содержит описание внешнего представления MainActivity нашего приложения. Пока что здесь находится описание единственного графического элемента экрана нашего приложения - «TextView», отображающего надпись "Hello World!". Манифест содержит описания конфигурации приложения и элемента activity класса MainActivity, определенного в файле MainActivity.java. Содержимое файла AndroidManifest.xml.: 24 Рис. 16. Содержимое файла манифеста 1.2.4.6. Внесение изменений в приложение Изменим приложение таким образом, чтобы приветствие было обращено к имени, введенному в поле ввода. Для этого добавим на наш экран в режиме Design три элемента: TextView, PlainText и Button: 25 Рис. 17. Новые элементы управления Отредактируем атрибуты «text» добавленных элементов так, чтобы экран принял вид, как на рис. 17. Попутно изменим атрибуты “id” всех элементов, придав им смысловую нагрузку. Так, для поля ввода имени это может быть «eTName», что обозначает editText Name, для кнопки приветствия – «btnHello», для текстовых полей – «tVName» и «tVHello». Такие имена удобно использовать при разработке логики приложения, поскольку они указывают как на тип элементов управления, так и на их назначение. 26 Рис. 18. Настроенные элементы управления Запустим приложение в эмуляторе. Если результат выполнения напоминает рис. 19 слева, то необходимо нажать пиктограмму Infer Constraints , что позволит автоматически зафиксировать взаимное расположение элементов. После повторного запуска результат должен быть как в правой части рис. 19. Если возникнет необходимость вновь изменить местоположение элементов, следует воспользоваться пиктограммой Clear all Constraints , а затем вновь зафиксировать их пиктограммой Infer Constraints. Для добавления обработчика события нажатия кнопки «Приветствуем» выберите ее, и в поле атрибута onClick 27 напишите имя обработчика события нажатия на кнопку, например, «onClick». Перейдем в режим редактирования «text» и, установив курсор на имени нашего обработчика событий, нажмем Alt+Enter. В появившемся списке необходимо выбрать «Create 'onClick(View)' in 'MainActivity», что позволяет автоматически добавить метод onClick в файле MainActivity.java и перейти к его редактированию. Рис. 19. Результат действия Infer Constrains Для начала необходимо создать переменные класса для элементов управления, которые будут использоваться в коде (EditText для ввода имени и TextView для отображения приветствия). Для этого перед строкой @Override добавьте следующий код: private TextView mHelloTextView; 28 private EditText mNameEditText; В коде переопределения процедуры onCreate установим связь между этими параметрами и нашими визуальными элементами: mHelloTextView=findViewById(R.id.tVHello); //получение TextView по ID mNameEditText =findViewById(R.id.eTName); // получение EditText по ID Теперь через переменные можно управлять элементами из процедуры onClick: public void onClick(View view) { if (mNameEditText.getText().length() == 0) { //проверка, что имя введено mHelloTextView.setText("Здравствуй, Мир!"); } else { mHelloTextView.setText("Привет, " + mNameEditText.getText()); } } Результат работы приложения приведен ниже. Рис. 20. Результат работы программы 29 1.2.4.7. Исправление недочетов На рис. 21 можно увидеть, что Android Studio предупреждает нас при помощи желтых восклицательных знаков о некорректном использовании атрибута text ряда элементов управления. Если щелкнуть по этому значку, то отобразится следующее предупреждение: Рис. 21. Предупреждение о неправильном оформлении надписей По правилам строки нужно хранить в строковых ресурсах. Подобный подход даёт разработчику множество преимуществ, в частности, быструю локализацию приложения. Для создания строковых ресурсов следует в режиме Design щелкнуть по прямоугольной пиктограмме справа от корректируемого ресурса. В появившемся окне «Pick a Resource» нажмите кликните по надписи “Add new resource” и выберите «New string value». Ниже приведено окно (рис. 22) для определения текстового ресурса кнопки «Приветствуем». Таким же образом определяются ресурсы цветов и прочие. 30 Рис. 22. Определение текстового ресурса 1.2.5. Практическое задание 1. Выполнить настройку отображения элементов управления с использованием инструментов центрирования. 2. Определить строковые ресурсы всех элементов управления. 3. Определить ресурс цвета для атрибута background базового контейнера ConstrainLayout. 4. На базе существующего приложения создать приложение-калькулятор, осуществляющий сложение и вычитание двух целых чисел. Для преобразования типов можно использовать конструкцию: Integer N1=0; N1 = Integer.parseInt(mEditText.getText().toString()); 31 ТЕМА 2. ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ANDROID Цель изучения: формирование навыков проектирования и разработки графического интерфейса Android 2.1. Теоретическая часть 2.1.1. Организация GUI Android Базовым компонентом для создания визуального интерфейса в приложении Android является Activity. Как отмечалось выше, в новом проекте после выбора шаблона создается главная Activity, которая описывается двумя файлами: MainActivity.java - описывает логику приложения и activity_main.xml - определяет графический интерфейс активности. Между этими файлами устанавливается взаимное соответствие (см. рис. 23). Рис. 23. Файлы описания activity 2.1.2. Activity Помимо главной Activity, проект может включать в себя набор дополнительных Activity, предназначенных для организации интерфейса слабо связанных между собой функций. Создание новой Activity в Android Studio выполняется через меню File-New-Activity-(Выбор шаблона), 32 или через контекстное меню New->Activity->Empty Activity, если выбрана папка, в которой находится класс MainActivity. Рис. 24. Создание дополнительной Activity Далее необходимо выполнить настройку Activity, которая заключается в определении ее имени и имени файла разметки. После этого информация об Activity автоматически добавится в файл манифеста. Рис. 25. Конфигурирование Activity 33 Для вызова одной активности из другой используется метод startActivity(): Рис. 26. Вызов дополнительной activity Для передачи данных между двумя activity используется объект Intent. Через его метод putExtra() можно добавить ключ и связанное с ним значение. Ниже приведен пример передачи из текущей activity в SecondActivity строки «Piter» с ключом «name». Рис. 27. Передача данных через Intent В зависимости от типа отправляемых данных при их получении можно использовать ряд методов объекта Bundle. Все они в качестве параметра принимают ключ объекта. Основные из них: - get(): универсальный метод, который возвращает значение типа Object. Соответственно, после получения данное значение необходимо преобразовать к нужному типу; - getString(): возвращает объект типа String; - getInt(): возвращает значение типа int; - getByte(): возвращает значение типа byte; 34 - getChar(): возвращает значение типа char; - getShort(): возвращает значение типа short; - getLong(): возвращает значение типа long; - getFloat(): возвращает значение типа float; - getDouble(): возвращает значение типа double; - getBoolean(): возвращает значение типа boolean - getCharArray(): возвращает массив объектов char; - getIntArray(): возвращает массив объектов int; - getFloatArray(): возвращает массив объектов float; - getSerializable(): возвращает объект интерфейса Serializable. Пример получения данных при загрузке SecondActivity с использованием метода get() приведен ниже. Рис. 28. Прием данных с помощью метода get() Каждая Activity может использовать несколько файлов разметки, что позволяет создавать различные варианты ее визуального отображения. Для добавления нового файла разметки необходимо выбрать: File-New-Layout XML file, и выполнить конфигурирование разметки. 35 Рис. 29. Добавление разметки Activity Для смены отображаемого файла разметки следует воспользоваться методом setContentView(R.layout.activity_main); Графический интерфейс пользователя (GUI- graphical user interface) в Android представляет собой иерархию объектов android.view.ViewGroup и android.view.View. Каждый объект ViewGroup представляет контейнер, который содержит и упорядочивает дочерние объекты View. В частности, к контейнерам относят такие элементы, как LinearLayout, GridLayout, ConstraintLayout и ряд других. Простые объекты View представляют собой элементы управления и прочие виджеты, например, кнопки, текстовые поля и т.д., через которые пользователь взаимодействует с программой. 36 Рис. 30. Иерархическая структура графического интерфейса Манипуляции с визуальными компонентами Activity удобно выполнять в режиме дизайнера, предоставляющим разнообразный инструментарий для этих целей. Рис. 31. Средства работы с элементами графического интерфейса в режиме Design 37 2.1.3. Макеты выравнивания Первым делом при проектировании графического интерфейса следует определиться с типом родительского контейнера, в котором будут размещаться все элементы. Существуют различные типы контейнеров (LinearLayout, RelativeLayout, FrameLayout, TableLayout, ConstraintLayout), которые позволяют размещать визуальны элементы внутри себя различными способами (имеют различные макеты выравнивания) и доступны для выбора при конфигурировании разметки activity. По умолчанию для новой activity в Android Studio устанавливается корневой контейнер (Root Tag) типа ConstraintLayout, в котором расположение элементов View определяется с помощью привязок (constraints), определяющих взаимное расположение всех элементов интерфейса. Рис. 32. Определение привязок в контейнере ConstraintLayout Контейнер LinearLayout упорядочивает все дочерние элементы в одном направлении: по горизонтали или по 38 вертикали. Направление разметки указывается с помощью атрибута android:orientation. Рис. 33. Выравнивание в контейнере LinearLayout LinearLayout поддерживает такое свойство, как вес элемента, которое передается атрибутом android:layout_weight. Это свойство принимает значение, указывающее, какую часть оставшегося свободного места контейнера по отношению к другим объектам займет данный элемент. Например, если один элемент у нас будет иметь для свойства android:layout_weight значение 2, а другой - значение 1, то в сумме они дадут 3, поэтому первый элемент будет занимать 2/3 оставшегося пространства, а второй - 1/3. Если все элементы имеют значение android:layout_weight="1", то все эти элементы будут равномерно распределены по всей площади контейнера. Для создания табличных представлений используются контейнеры TableLayout и GridLayout. 39 Рис. 34. Пример табличного представления элементов интерфейса с использованием контейнера GridLayout Контейнер ScrollView предназначен для создания прокрутки в том случае, если все элементы одномоментно не могут поместиться на экране устройства. ScrollView может вмещать только один элемент, поэтому если необходимо разместить несколько элементов, то их надо поместить в какой-нибудь контейнер, например, LinearLayout. 2.1.4. Элементы графического интерфейса (элементы управления) После того, как родительский контейнер выбран, производится добавление визуальных элементов (элементов управления) типа View, таких как Button, TextView, EditText, Checkbox, ListView и пр. Рассмотрим некоторые из них. 2.1.4.1. TextView Наиболее простым визуальным элементом является TextView, который предназначен для отображения текста без возможности его редактирования. 40 Основные атрибуты: android:text: устанавливает текст элемента; android:textSize: устанавливает высоту текста, в качестве единиц измерения для указания высоты используются sp; android:background: задает фоновый цвет элемента в виде цвета в шестнадцатеричной записи или в виде цветового ресурса; android:textColor: задает цвет текста; android:textAllCaps: при значении true делает все символы в тексте заглавными; android:textDirection: устанавливает направление текста. Рис. 35. Элемент TextView 2.1.4.2. EditText EditText - подкласс класса TextView, представляет собой текстовое поле с возможностью ввода и редактирования текста. Имеет ряд дополнительных атрибутов: android:hint - задает текст, отображаемый в качестве подсказки; 41 android:inputType - задает вид клавиатуры для ввода text: обычная клавиатура для ввода однострочного текста; textMultiLine: многострочное текстовое поле TextEmailAddress: обычная клавиатура, на которой присутствует символ @, ориентирована на ввод e-mail; textUri: обычная клавиатура, на которой присутствует символ /, ориентирована на ввод интернет-адресов; textPassword: клавиатура для ввода пароля; textCapWords: при вводе первый введенный символ слова представляет заглавную букву, остальные – строчные; number: числовая клавиатура; phone: клавиатура в стиле обычного телефона; date: клавиатура для ввода даты; time: клавиатура для ввода времени; datetime: клавиатура для ввода даты и времени. EditText предоставляет возможность обрабатывать введенные символы по мере ввода пользователя. Ниже приведен пример, на котором с помощью метода addTextChangedListener() к элементу EditText добавляется слушатель ввода текста - объект TextWatcher, метод которого onTextChanged вызывается при изменении текста и отображает вводимый текст в TextView. 42 Рис. 36. Пример обработки ввода в EditText 2.1.4.3. Button Кнопки Button представлены классом android.widget.Button и являются наиболее распространенным элементом организации взаимодействия с пользователем. Ключевые атрибуты кнопок: text: задает текст на кнопке; textColor: задает цвет текста на кнопке; background: задает фоновый цвет кнопки; textAllCaps: при значении true устанавливает текст в верхнем регистре. По умолчанию как раз и применяется значение true; onClick: задает обработчик нажатия кнопки. Описание процедуры создания обработчика событий для кнопки см. выше, в практической части темы 1. 2.1.4.4. Всплывающие окна. Toast Toast представляет собой всплывающее окно для отображения текста в течение некоторого времени. Toast нельзя создать в xml, можно использовать только в коде java. 43 Ниже приведен пример создания всплывающего окна из обработчика нажатия кнопки. Рис. 37. Создание Toast по нажатию кнопки 2.1.4.5. Checkbox Checkbox - флажки, которые могут находиться в отмеченном и неотмеченном состоянии. Флажки позволяют производить множественный выбор из нескольких значений. Рис. 38. Обработчик события Checkbox 44 Атрибут android:onClick, как и в случае с простыми кнопками, позволяет задать обработчик нажатия на флажок. 2.1.4.6. ToggleButton ToggleButton – это кнопка, которая подобно элементу CheckBox может пребывать в двух состояниях: отмеченном и неотмеченном, причем для каждого состояния можно установить свой текст. Рис. 39. Разметка, обработчик событий и внешний вид ToggleButton 2.1.4.7. Списочные элементы Android представляет широкую палитру элементов, которые представляют списки. Все они является наследниками класса android.widget.AdapterView. Это такие виджеты как ListView, GridView, Spinner. Они могут выступать контейнерами для других элементов управления. При работе со списками приходится взаимодействовать с тремя компонентами. Во-первых, это сами элементы списков (ListView, GridView, Spinner), которые отображают данные. Во-вторых, это источник данных - массив, объект ArrayList, база данных и т.д., в котором находятся сами отображаемые данные. И в-третьих, это адаптеры - 45 специальные компоненты, которые связывают источник данных с элементом списка. Рис. 40. Компоненты, используемые для организации работы списочных элементов Рассмотрим связь элемента ListView с источником данных с помощью одного из таких адаптеров - класса ArrayAdapter. Класс ArrayAdapter представляет собой простейший адаптер, который связывает массив данных с набором элементов TextView, из которых, к примеру, может состоять ListView. Ниже приведено описание элемента ListView в файле разметки. Как можно увидеть, в описании не задается количество строк, а лишь прописывается способ определения размеров (высоты и ширины) элемента - (см. следующий раздел). 46 Рис. 41. Описание списочного элемента ListView в файле разметки Код activity, связывающий ListView через ArrayAdapter с данными (массив), может выглядеть следующим образом: Рис. 42. Привязка ListView и ArrayAdapter В приведенном примере создается и заполняется массив стран (countries), затем в переопределении процедуры onCreate, по ID получаем ссылку на элемент ListView, создаем новый объект adapter, связываем его с массивом данных и устанавливаем его в качестве адаптера для списочного элемента. Эти действия позволяют отобразить на экране 47 списочный элемент, содержащий полный перечень элементов массива. Для организации возможности выбора строки из списка необходимо установить слушатель OnItemClickListener, который предоставляет метод onItemClick, через параметры которого можно получить выделенный элемент и сопутствующие данные. Рис. 43. Установка слушателя для списка и переопределение метода обработки события 2.1.5. Настройка элементов интерфейса После добавления на экран activity визуального компонента, первым делом следует определить для него информативный id, т.к. id является основным атрибутом для доступа к компонентам при программировании логики работы программы. Изменение атрибута в режиме дизайнера сразу синхронизируется с текстом activity_main.xml. 48 Рис. 44. Определение id элемента графического интерфейса Следующим шагом в конфигурировании графических элементов является определение их размеров и взаимного расположения. Все вышеперечисленные контейнеры (LinearLayout, RelativeLayout, FrameLayout, TableLayout, ConstraintLayout) для определения размеров элементов используют в файле xml атрибуты, которые начинаются с префикса layout. К таким параметрам относятся атрибуты layout_height и layout_width, которые используются для установки размеров и могут принимать одно из следующих значений: - точные размеры элемента, например, 96 dp; - значение wrap_content: элемент растягивается до тех границ, которые достаточны, чтобы вместить все его содержимое; - значение match_parent: элемент заполняет всю область родительского контейнера (тот же эффект будет при установке значения 0dp). Для указания точных размеров элементов могут использоваться следующие единицы измерения: 49 - px: пиксели текущего экрана (не рекомендуется к использованию); - dp: (device-independent pixels) - абстрактная единица измерения, основанная на физической плотности экрана с разрешением 160 dpi. Является предпочтительной для определения размеров элементов; - sp: (scale-independent pixels) - независимые от масштабирования пиксели, рекомендуются для работы со шрифтами; - и пр. После определения размеров элементов следует определить отступы как от внешних границ элемента до границ контейнера, так и внутри самого элемента между его границами и содержимым. Для установки внутренних отступов применяется атрибут android:padding. Он устанавливает отступы контента от всех четырех сторон контейнера. Можно устанавливать отступы только от одной стороны контейнера, применяя следующие атрибуты: android:paddingLeft, android:paddingRight, android:paddingTop и android:paddingBottom. Рис. 45. Определение внутренних отступов 50 Для установки внешних отступов используются атрибуты layout_marginTop, layout_marginBottom, layout_marginLeft и layout_marginRight. Рис. 46. Определение внешних отступов Установка отступов, как и прочие виды управления положением визуальных элементов интерфейса, возможна не только средствами xml-разметки, но и программно. Для программной установки внутренних отступов у элемента вызывается метод setPadding(left, top, right, bottom), в который передаются четыре значения, по одному для каждой из сторон. Для установки внешних отступов необходимо реализовать объект LayoutParams для того контейнера, который применяется. И затем вызвать у этого объекта LayoutParams метод setMargins(left, top, right, bottom). 51 Рис. 47. Программная установка отступов Помимо вышеперечисленных атрибутов существуют атрибуты для позиционирования содержимого внутри объектов (gravity) и для позиционирования внутри контейнера (layout_gravity). Оба этих атрибута могут принимать следующие значения: top, bottom, left, right, center_vertical, center_horizontal, center, fill_vertical,fill_horizontal, fill, clip_vertical, clip_horizontal, start и end, которые определяют различные варианты положения содержимого (текста). Рис. 48. Пример выравнивания содержимого TextView по нижней границе 52 2.1.6. Темы и стили Как следует из вышеприведенного материала, настройка элементов интерфейса Android предполагает использование значительного количества параметров, позволяющих установить размер, цвет и тип шрифта, способы выравнивания и отступы и тому подобное. При этом, каждый из устанавливаемых параметров прописывается в виде отдельной строчки для каждого элемента интерфейса в файле разметки. Рис. 49. Однотипные настройки группы элементов Часто при этом группы однотипных элементов в одном или нескольких файлах разметки имеют совершенно одинаковые настройки, как на рисунке выше. Это приводит к тому, что количество строк файла разметки значительно возрастает за счет включения большого количества повторов одинаковых наборов строк. При этом, если возникнет необходимость изменить стиль приложения (например, размер или тип шрифта компонентов TextView), то править придется описание каждого элемента. Для решения этих проблем в Android используются стили. Стиль – единожды 53 созданное описание набора параметров элементов, которое может использоваться для любого количества элементов интерфейса, поддерживающих эти параметры. Хранение стилей осуществляется в файле styles.xml, расположенном в папке res/values проекта. Если файл не существует, его можно создать, кликнув правой кнопкой мыши по папке values и выбрав в контекстном меню New- XML-Values XML File. Удобнее этот файл создать, воспользовавшись средствами автоматизации Android Studio. После того, как в файле разметки для элемента будет прописано определение не существующего стиля, Android Studio предложит создать файл styles.xml и определит в нем новый стиль. Ниже приведены примеры описания стиля и его использования. Рис. 50. Описание стиля и пример его использования Развитием стилей в Android являются темы, представляющие собой укрупненные стили, которые могут применяться не к отдельным элементам, а к Activity или к приложению в целом. Темы можно создавать самостоятельно или использовать стандартные. 54 При создании приложения автоматически создается его собственная тема, которая сохраняется в файле themes.xml. Она наследуется от одной из стандартных тем и может быть изменена следующим образом: Рис. 51. Изменение родительской темы приложения 2.1.7. Ресурсы в Android и их использование в GUI Ресурс в приложении Android представляет собой файл, например, файл разметки интерфейса, файл изображения, аудио/видео файл или некоторое значение, например, простую строку. То есть, ресурсы представляют собой и файлы разметки, и отдельные строки, и звуковые файлы, файлы изображений и т.д. Все ресурсы находятся в проекте в каталоге res. Для различных типов ресурсов, определенных в проекте, в каталоге res создаются подкаталоги. Поддерживаемые подкаталоги: animator/: xml-файлы, определяющие анимацию свойств; anim/: xml-файлы, определяющие tween-анимацию; color/: xml-файлы, определяющие список цветов; drawable/: графические файлы (.png,.jpg,.gif); 55 mipmap/: графические файлы, используемые для иконок приложения под различные разрешения экранов; layout/: xml-файлы, определяющие пользовательский интерфейс приложения; menu/: xml-файлы, определяющие меню приложения raw/: различные файлы, которые сохраняются в исходном виде; values/: xml-файлы, которые содержат различные используемые в приложении значения, например, ресурсы строк; xml/: Произвольные xml-файлы. В стандартном проекте Android Studio каталог /res содержит каталоги не для всех типов ресурсов, которые использоваться в Android, однако при необходимости можно добавить в папку res нужный каталог, а в него затем поместить ресурс. Когда происходит компиляция проекта, сведения обо всех ресурсах добавляются в специальный файл R.java, который можно найти в каталоге Windows проекта по пути app\build\generated\source\r\debug\[пакет_приложения]. Существует два способа определения доступа к ресурсам: в файле исходного кода и в файле xml. При необходимости сослаться на ресурс в файле xml, например, в файле activity_main.xml, используют следующую формализованную форму доступа: @[имя_пакета:]тип_ресурса/имя_ресурса , где - имя_пакета - представляет имя пакета, в котором ресурс находится (указывать необязательно, если ресурс находится в том же пакете); 56 - тип_ресурса - подкласс, определенный в классе R для типа ресурса, например, drawable, id, layout, string, attr, plural, array; - имя_ресурса - имя файла ресурса без расширения или значение атрибута android:name в XML-элементе (для простых значений). Например, мы хотим вывести в элемент TextView строку, содержащую имя приложения (string name="app_name"), которая определена в виде ресурса в файле strings.xml, подойдет следующий код. Рис. 52. Работа со строчным ресурсом из файла разметки. Для решения подобной задачи с использованием кода Activity необходимо вначале использовать метод getResources(), который возвращает объект android.content.res.Resources, а затем вызвать один из его методов: getString(): получает строку из файла strings.xml по числовому идентификатору; getDimension(): получает числовое значение - ресурс dimen; getDrawable(): получает графический файл; getBoolean(): получает значение boolean; 57 Рис. 53. Работа со строчным ресурсом из кода activity 2.1.7.1. Ресурсы изображений Одним из наиболее распространенных источников ресурсов являются файлы изображений. Android поддерживает следующие форматы файлов:.png (предпочтителен);.jpg (приемлем);.gif (нежелателен). Для графических файлов в проекте по умолчанию создана папка res/drawable. При добавлении графических файлов в эту папку для каждого из них Android создает ресурс Drawable. После этого к ресурсу можно следующим образом: в коде Java: R.drawable.имя_файла в коде xml: @[имя_пакета:]drawable/имя_файла Стоит учитывать, что файл изображения будет добавляться в приложение, тем самым увеличивая его размер. При этом большие изображения отрицательно влияют на производительность. Поэтому следует использовать небольшие и оптимизированные (сжатые) графические файлы. 58 Для работы с изображениями в Android можно использовать различные элементы, но непосредственно для вывода изображений предназначен ImageView. На рисунке ниже приведены описания этого элемента в файле разметки и в коде activity. Рис. 54. Описание ImageView 2.2. Практическая часть Задание: используя теоретический материал темы создать приложение для визуализации графических ресурсов в различных представлениях, обладающее следующими характеристиками: 1. Наличие трех или более файлов разметки для главной Actitvity. Разметки должны использовать различные контейнеры: LinearLayout, TableLayout. Обеспечить возможность переключения разметок. 2. Использование одного или нескольких списочных элементов (ListView, GridView или Spinner – на выбор). 59 3. Наличие одной или нескольких дополнительных Activity. Обеспечить возможность переключения Activity с передачей данных. 4. Использование в проекте набора файлов графических ресурсов. Функциональные требования: приложение должно обеспечивать функции выбора, предпросмотра и полноэкранного просмотра файлов графических ресурсов. Пример карты экранов приведен на рисунке ниже. Рис. 55. Пример карты экранов 60 Порядок выполнения работы 1. Запустить Android Studio. На кафедре АВС запуск производится от имени администратора. Выполняется преподавателем. 2. Создать новый проект. Использовать шаблон Empty Activity. 3. Добавить в приложение несколько файлов графических ресурсов. Лучше использовать файлы.png, имеющие небольшой размер. Для добавления скопируйте файлы в каталог app\src\main\res\drawable (см. рис.). Рис. 56. Каталог графических ресурсов проекта 61 4. Добавьте необходимые элементы интерфейса и выполните настройку их местоположения, используя атрибуты android:padding и layout_margin. Для удобства манипулирования атрибутами местоположения рекомендуется добавить контейнер , содержащий в себе контейнер. Проверьте, чтобы доступ к элементам интерфейса обеспечивался при любой ориентации экрана. Рис. 57. Главный экран приложения 5. Добавьте дополнительные файлы разметки для главной активности. Для этого следует в каталоге проекта установить курсор на классе MainActivity и из контекстного меню New-XML-Layout XML File произвести добавление файла разметки (рис. 58). 62 Рис. 58. Добавление файла разметки В качестве корневого контейнера рекомендуется использовать LinearLayout. 6. Добавьте необходимые графически элементы и выполните настройку их местоположения. Вариант разметки и вид экрана просмотра списком приведены на рис. 59. 63 Рис. 59. Макет и вид экрана списочного просмотра ресурсов Для визуализации файла разметки используйте метод setContentView(): setContentView(R.layout.имя_файла_разметки); Работа со списочным элементом listView предполагает выполнение в коде java следующих шагов: 1. Получение экземпляра элемента ListView. 2. Формирование массива строк, содержащих имена графических файлов. 3. Создание и использование адаптера данных, позволяющего связать строчный массив с элементом listView. Пример кода приведен на рис.60. 64 Рис. 60. Пример кода для работы с ListView Для обработки события выбора строки ListView необходимо создать «слушатель» setOnItemClickListener для элемента ListView и переопределить для него метод onItemClick, таким образом, чтобы он выполнял необходимые действия. Вариант переопределения метода для отображения графических ресурсов в элементе «imageView» приведен на рис. 61. 4. Для просмотра графических ресурсов в виде таблицы возможно использование разметок GridLayout или TableLayout (предпочтительно). Вариант макета для табличного отображения ресурсов приведен на рис. 62. 5. Для создания дополнительной Activity необходимо воспользоваться меню File-New-Activity. 6. Для запуска Activity и передачи ей каких – либо параметров ключевым классом является android.content.Intent. Объект этого класса представляет собой задачу, которую надо выполнить приложению. 65 Рис. 61. Создание слушателя для listView Рис. 62. Макет и вид экрана табличного просмотра ресурсов На рис. 63 приведен пример обработчика события клика по изображению на экране списочного просмотра, который запускает новую активность ViewResourceActivity и передает ей в качестве параметра имя ресурса для просмотра (в 66 переменной strText). Имя параметра определено как «fileName». Рис. 63. Вызов Activity c передачей параметра Для получения значения параметра в новой Activity используется объект Bundle, который предоставляет набор методов, принимающих в качестве параметра ключ передаваемого параметра. Пример получения параметра с ключом «filename» приведен на рис. 64. Рис. 64. Получение параметра с ключом «filename» 67 ТЕМА 3. ВЗАИМОДЕЙСТВИЕ С СИСТЕМНЫМИ ПРИЛОЖЕНИЯМИ Цель изучения: формирование навыков использования объекта Intent. 3.1. Теоретическая часть 3.1.1. Явные и неявные намерения Как отмечалось выше, несмотря на то, что все приложения в Android выполняются в собственной «песочнице» и изолированы друг от друга, имеется механизм, позволяющий приложению использовать другие компоненты системы. Благодаря этому, Android-разработчик не станет писать собственное приложение – камеру, если его приложению необходимо сделать фотографию, или разрабатывать новые мессенджер и почтовый клиент, если из приложения необходимо отправить сообщение о том, что пришло электронное письмо. Вместо этого можно использовать системные приложения, обеспечивающие выполнение всех вышеперечисленных задач. Для вызова системных приложений, как и для активации прочих компонентов используются объекты намерений «Intent». Намерения - объекты Intent, могут быть «явными» или «неявными». Явные намерения уже использовались выше, в практической работе к теме 2, при вызове дополнительной активности. Рис. 65. Создание «явного» намерения 68 Как можно увидеть, при создании «явного» намерения в качестве первого параметра передается объект «this», представляющий собой ссылку на текущую activity, используемую в качестве контекста (Context). Второй параметр явно указывает имя класса вызываемой активности (ViewResourceActivity.class). Поэтому данный Intent является «явным». В случае использования «неявного» намерения, имя класса активности не указывается, но передается ряд параметров (action, data, category), значения которых указывают, что должна делать вызываемая активность. Так, если в качестве параметра action передать значение «ACTION_VIEW», а в качестве data - адрес сайта, то будет запущен браузер. Рис. 66. Использование неявного намерения для запуска браузера Впрочем, для получения доступа в интернет можно воспользоваться простейшим элементом для рендеринга html- кода WebView, который базируется на движке WebKit, что гарантирует отображение контента подобно таким браузерам, как Google Chrome и Safari. 69 Для этого, первым делом следует указать в файле манифеста AndroidManifest.xml разрешение на использование Internet (перед тегом ), и определить элемент в файле разметки. Рис. 67. Использование WebView Чтобы загрузить определенную страницу в WebView, через метод loadUrl() необходимо передать ее адрес: Рис. 68. Передача адреса страницы в WebView В версиях Android, начиная с Android 8.0 и старше, для нормального функционирования вышеприведенного кода в файле манифеста, внутри тега необходимо добавить строку: android:usesCleartextTraffic="true" 70 3.1.2. Константы действия Константы действия – это набор стандартных значений параметра action, определенных для объекта Intent, использование которых приводит к запуску часто употребляемых системных приложений. Рассмотрим наиболее используемые константы действия: - ACTION_VIEW — наиболее распространённое общее действие. Для данных, передаваемых с по?