Евгений Умрихин
Санкт-Петербург
«БХВ-Петербург»
2021
УДК 004.43
ББК 32.973.26-018.1
У55
Умрихин Е. Д.
У55 Разработка Android-приложений на С# с использованием Xamarin с нуля. —
СПб.: БХВ-Петербург, 2021. — 336 с.: ил. — (С нуля)
ISBN 978-5-9775-6671-1
Рассмотрены особенности создания Android-приложений при помощи Visual
Studio Community на C#. Книга знакомит читателя со структурой проектов
Xamarin.Android, с особенностями сборки и отладки приложений. Рассматривают-
ся основные подходы к разработке Android-приложений, методы построения ин-
терфейса, хранения данных, показана интеграция мобильных приложений с веб-
службами, описаны особенности распространения и публикации приложений
в магазине Google Play, разобраны основные методы монетизации мобильного
контента. Представлены многочисленные примеры кода для решения различных
задач, который можно использовать в своих приложениях.
Для начинающих разработчиков
УДК 004.43
ББК 32.973.26-018.1
Группа подготовки издания:
Руководитель проекта Павел Шалин
Зав. редакцией Екатерина Сависте
Компьютерная верстка Ольги Сергиенко
Дизайн обложки Карины Соловьевой
"БХВ-Петербург", 191036, Санкт-Петербург, Гончарная ул., 20.
ISBN 978-5-9775-6671-1 © Умрихин Е. Д., 2021
© Оформление. ООО "БХВ-Петербург", ООО "БХВ", 2021
<0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0>
ОГЛАВЛЕНИЕ
Введение ............................................................................................................................5
Что вы узнаете из этой книги? .......................................................................................................7
Что нужно знать?.............................................................................................................................8
Основные термины и понятия ........................................................................................................8
Об авторе ..........................................................................................................................................9
Глава 1. Освоение интегрированной среды разработки (IDE).............................11
Знакомство с Visual Studio Community........................................................................................11
Содержание проекта......................................................................................................................12
Ресурсы приложения .....................................................................................................................13
Проектирование экранных форм..................................................................................................15
Редактор кода.................................................................................................................................16
Приложение HelloWorld................................................................................................................17
Локализация приложений .............................................................................................................21
Принципы работы приложения и основы архитектуры.............................................................23
Описание исходного кода .............................................................................................................26
Тестирование и отладка приложения ..........................................................................................29
Глава 2. Работа с Activity .............................................................................................31
Жизненный цикл приложения......................................................................................................31
Управление жизненным циклом ..................................................................................................35
Атрибут [Activity] и основные свойства активности..................................................................38
Намерения и передача данных между Activity ...........................................................................41
Получение результата из Activity.................................................................................................46
Сохранение настроек Activity.......................................................................................................52
Взаимодействие между Activity ...................................................................................................54
Передача данных между Activity через статические переменные ............................................56
Диалоговые Activity ......................................................................................................................57
Глава 3. Выбор и использование управляющих компонентов ............................60
Layouts в Android ...........................................................................................................................60
Контейнер ScrollView ....................................................................................................................67
Элемент TextView...........................................................................................................................67
Элемент EditText ............................................................................................................................68
Элемент Button...............................................................................................................................69
Элемент Checkbox..........................................................................................................................78
Элемент RadioButton .....................................................................................................................78
Элемент SeekBar ............................................................................................................................79
Элемент ImageView........................................................................................................................86
Анимация свойств .........................................................................................................................91
4 Оглавление
Адаптеры и списки ........................................................................................................................94
Выбор даты и времени ................................................................................................................109
Создание меню.............................................................................................................................110
Элемент Toolbar...........................................................................................................................116
Контекстная панель действий ....................................................................................................119
Введение во фрагменты ..............................................................................................................124
Разработка интерфейса в стиле WhatsApp ................................................................................128
Использование асинхронных методов.......................................................................................135
Элемент SwipeRefreshLayout.......................................................................................................140
Создание экранных заставок ......................................................................................................142
Перелистывание страниц и ViewPager ......................................................................................145
Создание собственных компонентов .........................................................................................148
Компоненты построения диаграмм............................................................................................151
Создание интерфейса в стиле Gmail ..........................................................................................156
Глава 4. Запись и чтение данных .............................................................................165
Чтение и сохранение файлов ......................................................................................................165
Основы работы с SQLite .............................................................................................................174
Добавление, удаление и обновление данных в SQLite ............................................................182
Динамический поиск по базе данных SQLite............................................................................188
Глава 5. Работа с веб-сервисами...............................................................................194
Введение в веб-сервисы ..............................................................................................................194
Веб-службы ASP.NET (ASMX)..................................................................................................195
Использование служб RESTful...................................................................................................207
Глава 6. Обзор основных функций ..........................................................................219
Телефонные звонки .....................................................................................................................219
Отправка СМС .............................................................................................................................222
Работа с контактами ....................................................................................................................226
Определение местоположения ...................................................................................................235
Захват изображения и работа с камерой....................................................................................240
Распознавание речи .....................................................................................................................248
Введение в сервисы .....................................................................................................................252
Широковещательные приёмники...............................................................................................257
Уведомления ................................................................................................................................261
Разработка сканера кассовых чеков...........................................................................................264
Оптическое распознавание символов ........................................................................................270
Разработка экранных виджетов..................................................................................................276
Вывод данных на печать .............................................................................................................284
Компонент ShortcutBadger..........................................................................................................289
Использование диспетчера оповещений ...................................................................................290
Отслеживание телефонных звонков ..........................................................................................293
Глава 7. Сборка и распространение приложений.................................................305
Создание подписанного apk .......................................................................................................305
Публикация приложения в Play Market .....................................................................................311
Монетизация мобильных приложений ......................................................................................314
Заключение ................................................................................................................... 329
Предметный указатель...............................................................................................332
<0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0>
ВВЕДЕНИЕ
Мобильные устройства давно вошли в нашу жизнь. За последние годы лишь укре-
пился тренд в увеличении доли смартфонов и планшетов на рынках мобильных те-
лефонов и персональных компьютеров. Бизнес все активнее переносит свои серви-
сы на мобильные площадки. Безусловным лидером среди таких платформ является
операционная система Android. По данным различных источников, ее доля достиг-
ла 90% всего рынка мобильных операционных систем. Компания Google — разра-
ботчик этой операционной системы — предоставляет всю необходимую инфра-
структуру для создания и распространения программных решений для мобильных
устройств на базе Android. Вместе с тем официальной средой разработки приложе-
ний считается Android Studio, которая включает такие языки программирования,
как Java, Kotlin, С++. Эти средства разработки принято считать нативными.
Использование нативных средств разработки — довольно правильный подход при
создании качественных бизнес-приложений. Однако на практике такой способ не
всегда оказывается экономически выгодным. Для бизнеса создание мобильной вер-
сии своего сервиса сопряжено со значительными расходами: приходится держать
в команде несколько дорогостоящих специалистов, стоимость разработки прило-
жений в специализированной компании может быть еще выше, притом что для ка-
ждой мобильной платформы используются свои нативные средства, а сервис дол-
жен работать минимум на двух самых популярных. В таких ситуациях использо-
вать другие способы разработки оказывается целесообразней.
Кроме нативных существуют так называемые гибридные технологии. Их суть за-
ключается в совместном использовании нативных средств разработки и веб-
разработки. В гибридном приложении нативная часть — это контейнер WebView
(веб-представление), расположенный на основном экране приложения и обеспечи-
вающий взаимодействие с операционной системой. При этом весь интерфейс и весь
функционал разрабатываются при помощи стека технологий, принятых в веб:
HTML5 в связке с JavaScript. Чем-то это напоминает обычный браузер. Преимуще-
ством такого подхода является то, что разработка ведется сразу для нескольких
платформ за счет повторного использования кода. Это приводит к значительной
экономии расходов и выходу на рынок программного продукта для нескольких
платформ одновременно. К сожалению, у данного подхода есть и слабые стороны,
например доступ к новым возможностям мобильной платформы происходит не
сразу, а лишь после изменения фреймворка. Вносят свою лепту и низкая скорость,
сложности с дизайном из-за разных подходов к нему в операционных системах,
незащищенность кода.
6 Введение
Таких недостатков лишена одна из технологий для разработки мобильных прило-
жений — Xamarin (произносится [зэ́мэрин]), набирающая сейчас популярность.
Xamarin позволяет разрабатывать приложения на языке C#, который входит в топ
10 самых востребованных языков программирования в мире и поддерживается
Microsoft — одной из крупнейших IT-корпораций. При этом используются библио-
теки классов и среда исполнения, работающие на всех платформах, таких как
Android, iOS и Windows. Как и в случае применения нативных средств разработки,
производится не интерпретация, а компиляция собственных приложений. Они дос-
таточно производительны, в отличие от гибридных приложений. Это справедливо
даже для игр, которые зачастую очень ресурсоемки. Имея привязки ко всем базо-
вым пакетам SDK в мобильных платформах Android и iOS, Xamarin позволяет ис-
пользовать библиотеки Java, Objective-C и пр. Таким образом, продукт предостав-
ляет доступ к функциональным возможностям существующих мобильных опера-
ционных систем и имеет ряд собственных. В частности, разработка приложений
осуществляется в Microsoft Visual Studio, которая имеет качественную кросс-плат-
форменную поддержку для основных мобильных платформ и усовершенствован-
ную систему управления проектами. В настоящее время существуют реализации
этой среды разработки для двух операционных систем: Windows и macOS. Кроме
того, большинство .Net-классов и технологий, таких как, например, Linq или
ASP.NET, традиционно обласканных .Net-разработчиками, можно использовать
в Xamarin-проектах.
Xamarin представлен двумя коммерческими продуктами: Xamarin.Android (ранее
назывался MonoDroid) и Xamarin.iOS (ранее назывался MonoTouch), которые соз-
даны на базе Mono — проекта по созданию полноценного воплощения системы
.NET Framework на базе свободного программного обеспечения и опубликованных
стандартах .NET ECMA. Mono впервые был выпущен уже почти два десятилетия
назад, является практически ровесником .NET Framework и имеет поддержку зна-
чительного числа операционных систем: Windows, Linux, BSD (FreeBSD, OpenBSD,
NetBSD), Solaris, macOS (Mac OS X) и др. Кроме того, существует еще технология
кросс-платформенной разработки Xamarin.Forms, позволяющая использовать одну
логику для всех платформ. В этом случае можно графический интерфейс опреде-
лить один раз, на C# реализовать требуемую логику и получить работающие при-
ложения для Android, iOS и Windows. Эта платформа функционально состоит из
субплатформ Xamarin.Android и Xamarin.iOS. Благодаря такой организации через
них запросы приложений направляются к прикладным интерфейсам на устройствах
под управлением ОС Android или iOS.
Появление Xamarin позволило приобщиться многочисленной армии C#-програм-
мистов к мобильной разработке, что в некотором смысле можно считать революци-
онным событием. Прежде всего, это открывает некоторые перспективы для Mono
стать более популярным и востребованным проектом. Наряду с этим специалисты
C# теперь не являются простыми наблюдателями. Xamarin дал им шанс стать пол-
ноценными мобильными разработчиками. Несмотря на то что эта возможность
появилась уже давно, до сих пор, кроме официального руководства, которое в ряде
случаев является довольно сложным для понимания, фактически нет ни одного
Введение 7
учебного пособия на русском языке, при помощи которого можно было бы полу-
чить общие представления об этой платформе разработки в доступной форме на
практических примерах. Вместе с тем имеются многочисленные руководства на
английском языке, что свидетельствует о невероятной популярности технологии.
В данной книге делается попытка изменить сложившуюся ситуацию. В ней бу-
дут рассмотрены основы создания мобильных приложений с использованием
Xamarin.Android, которая позволяет разрабатывать нативные приложения для наи-
более популярной мобильной операционной системы.
Что вы узнаете из этой книги?
Глава 1. Освоение интегрированной среды разработки (IDE). В этой главе мы по-
знакомимся с основными инструментами разработки приложений для Android при
помощи Visual Studio, рассмотрим структуру проектов таких приложений и напи-
шем самую первую программу.
Глава 2. Работа с Activity. Данная глава посвящена основному и важнейшему эк-
ранному представлению Android-приложения — компоненту, с которым пользова-
тели могут взаимодействовать при выполнении каких-либо действий, например
когда требуется набрать номер телефона, сделать фото, отправить письмо или про-
смотреть карту.
Глава 3. Выбор и использование управляющих компонентов. Здесь мы познако-
мимся с основными компонентами, которые используются во всех Android-
приложениях для построения визуального интерфейса, и научимся разрабатывать
свои.
Глава 4. Запись и чтение данных. В этой главе рассказано, как сохранить данные на
устройстве и прочитать их. Также вы познакомитесь с популярной мобильной сис-
темой управления данными SQLite.
Глава 5. Работа с веб-сервисам. Здесь пойдет речь об основах построения много-
уровневых приложений, использующих веб-службы для обработки данных. Мы
создадим простую веб-службу на ASP.NET, которая будет запрашивать информа-
цию в созданной нами базе данных, модифицировать в ней данные и предоставлять
их мобильному приложению.
Глава 6. Обзор основных функций. В этой главе продемонстрированы основные
приемы работы с телефонными звонками, СМС-сообщениями, контактами, уве-
домлениями, камерой; описано, как определять местоположение, осуществлять
распознавание речи. Рассмотрена организация функций приложения в виде серви-
са, и показано, как запустить его через широковещательный приёмник. Также пред-
ставлены практические примеры использования сканера, распознавания образов,
печати и ряда других важных функций в разрабатываемых приложениях.
Глава 7. Сборка и распространение приложений. Здесь рассмотрен порядок созда-
ния apk-пакетов для распространения программ через магазин Google Play, а также
некоторые способы монетизации приложений. Приведен пример создания платного
контента и биллинга.
8 Введение
Рассмотрение каждой темы сопровождается многочисленными несложными при-
мерами, дающими необходимые представления об используемой технологии.
С целью увеличения эффективности изучения материала их имеет смысл воспроиз-
водить в реальной среде разработки. В книге в ряде случаев применяются некото-
рые упрощения. Так, например, в основном тексте, с целью сокращения объема
описательной части, сигнатуры методов могут быть представлены в сокращенном
виде с использованием пустых скобок () либо упоминаются лишь названия мето-
дов, а входные параметры при этом опущены. Для получения полных сведений по
применению тех или иных методов, в том числе для того, чтобы отследить их аргу-
менты, следует обращаться к листингам с примерами использования этих процедур.
Все примеры проектов, приведенных в данной книге, были реализованы и протес-
тированы в средах разработки Microsoft Visual Studio 2017/2019. Вместе с тем воз-
можны отличия в работе представленного кода и в описанных методиках для более
ранних версий Visual Studio.
Надеюсь, книга окажется полезной всем, кто интересуется мобильной разработкой
и хотя бы немного знаком с C#, но пока еще не решается приступить к написанию
своего первого Android-приложения.
Что нужно знать?
Предполагается, что читатели знакомы с основами работы в среде Windows, по-
скольку мы будем использовать для разработки мобильных приложений Visual
Studio для Windows.
Вы также должны уметь работать в среде Android, иметь представления, как уста-
навливать, запускать и удалять приложения, работать с магазином приложений,
производить настройки устройства и сопряжение с ПК.
Необходимо иметь некоторые базовые знания о языке разметки XML, языке управ-
ления реляционными базами данных SQL, об основных синтаксических конструк-
циях языка C# и архитектуре .Net-платформы в целом.
Основные термины и понятия
Определим несколько терминов, чтобы избежать их неправильного толкования.
Термин «гаджет» в широком смысле означает небольшое устройство, приспособ-
ление, предназначенное для облегчения и усовершенствования различных видов
деятельности человека. Гаджеты широко распространены в самых разных сферах:
в спорте — фитнес-трекеры, смарт-браслеты, спортивные устройства, в том числе и
"умная" одежда; в медицине — электронные пластыри, трикодеры, гидрокоптеры,
экзоскелеты. В программном обеспечении зачастую гаджет — небольшое прило-
жение, предоставляющее дополнительную информацию, например прогноз погоды
или курс валют. В данной книге под этим термином следует понимать мобильное
устройство, работающее под управлением операционной системы Android. Этот
термин следует относить именно к аппаратным средствам.
Введение 9
Виджет — это небольшое вспомогательное приложение, которое выполняет опре-
деленную функцию. Иногда так называют элементы управления для построения
макета интерфейса. В целом в книге под этим термином следует понимать именно
примитив графического интерфейса пользователя, имеющий стандартный внешний
вид и выполняющий стандартные действия, элемент управления, компонент ин-
терфейса или контрол. Тем не менее следует обращать внимание на контекст упот-
ребления термина. В одном из разделов будет упоминание о плавающем виджете
для голосового ввода, который представляет собой микропрограмму. Кроме того,
в одной из тем будут рассматриваться так называемые экранные виджеты, которые
тоже являются микроприложениями, а не графическими примитивами.
Термин Activity еще не устоялся в русском языке у разработчиков. Некоторые ис-
пользуют слово "активность", другие — "деятельность" или "действие". Будем по-
нимать под этим термином экранное представление, экран или окно, компонент
приложения, с которым пользователи могут взаимодействовать для выполнения
каких-либо действий.
В Android-приложениях многие операции работают через намерения. Под этим
термином будем понимать программный механизм, который позволяет пользовате-
лям координировать функции различных видов деятельности для достижения цели
задачи. Реализуется через объект обмена сообщениями Intent, с помощью которого
можно запросить выполнение действия.
Жизненный цикл — это стадии процесса, охватывающие различные состояния
системы, начиная с момента возникновения необходимости в такой системе и за-
канчивая ее полным уничтожением. Этот термин применяется в различных облас-
тях знаний, в том числе существует понятие жизненного цикла программного обес-
печения. Однако в данной книге этот термин будет употребляться в контексте ком-
понентов приложения, т. е. это совокупность стадий существования компонента,
которые он проходит за период своего существования. Этот термин часто употреб-
ляется и по отношению к активности в целом.
Лейауты — группа компонентов, используемых для создания макета графического
интерфейса пользователя, которые являются контейнерами для других элементов
управления. Как правило, в тегах таких элементов употребляется лексема Layout.
Об авторе
Умрихин Евгений Дмитриевич — программист-разработчик с 15-летним опытом
работы в крупной региональной страховой компании. Имеет опыт разработки и
внедрения распределенных IT-решений с использованием веб-сервисов и мобиль-
ных платформ. Обладатель ряда авторских свидетельств об официальной регистра-
ции программ для ЭВМ и ученой степени кандидата технических наук.
<0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0>
ГЛАВА 1
ОСВОЕНИЕ ИНТЕГРИРОВАННОЙ СРЕДЫ
РАЗРАБОТКИ (IDE)
Среда разработки — очень важное звено в технологиях разработки приложений.
Без интегрированных инструментов этой среды программирование превращается
в утомительное и тяжелое занятие. Многие компании практикуют кодирование
в усовершенствованных Блокнотах, а потом делают сборку при помощи компиля-
тора. Такой подход, вероятно, оправдан в учебных целях, но в промышленной раз-
работке выглядит довольно странно, тем более что существует множество сред
на любой вкус и кошелек. В частности, для Xamarin возможно использование
Microsoft Visual Studio Community. Это полнофункциональная, расширяемая и бес-
платная интегрированная среда разработки для создания современных приложений
на базе Android, iOS и Windows, а также веб-приложений и облачных служб, хотя и
с некоторыми ограничениями юридического плана. Воспользоваться ею могут
учебные организации, индивидуальные разработчики, небольшие компании, у ко-
торых не более пяти разработчиков. Также бесплатной версией Visual Studio можно
воспользоваться для разработки программного обеспечения с открытым исходным
кодом. Этим требованиям соответствует значительная часть бизнеса, поэтому мы
в данной главе рассмотрим именно эту редакцию.
Знакомство с Visual Studio Community
Интегрированная среда разработки (Integrated Development Environment, IDE) —
это комплекс программных средств, используемый программистами для разработки
программного обеспечения (ПО). Необходимый нам дистрибутив последней вер-
сии для Windows можно скачать с официального сайта https://visualstudio.
microsoft.com. Желательно подготовить полный дистрибутив для offline-установки,
включающий в себя все необходимые Android SDK, несмотря на его значительные
размеры. Это позволит избежать докачки необходимых компонентов во время ин-
сталляции среды разработки. Кроме того, мы получим возможность использовать
его многократно на разных компьютерах. После скачивания веб-установщика,
в случае если требуется создать полный локальный пакет установки со всеми
функциями, нужно выполнить в командной строке Windows:
vs_community.exe --layout c:\vslayout
Здесь веб-установщик запускается с ключом ––layout. Вместе с тем задается каталог,
в который должна произвестись закачка всех пакетов, входящих в состав Visual
12 Глава 1
Studio Community. Создание указанного каталога произойдет автоматически,
если он отсутствовал. Формирование offline-дистрибутива может занять длительное
время. Полная компоновка Visual Studio требует порядка 35 Гбайт дискового про-
странства.
ПРИМЕЧАНИЕ
Для комфортной работы на компьютере разработчика операционная система Windows
должна быть установлена на твердотельном накопителе SSD. На такой же носитель
желательно установить и среду разработки. Для этого в конфигурации оборудования
нужно иметь SSD-диск объемом порядка 500 Гбайт. Кроме этого, компьютер разра-
ботчика должен иметь хотя бы 6-ядерный процессор с частотой 3 ГГц и 8 Гбайт опера-
тивной памяти. При работе с Visual Studio 2019 для работы эмулятора Android нужна
поддержка аппаратной виртуализации и включенный гипервизор.
Установка обычно производится по аналогии с другими программами и не пред-
ставляет сложности. Для запуска установки используется файл vs_setup.exe. После
создания дистрибутива он окажется в папке c:\vslayout. В процессе установки важ-
но выбрать необходимый нам пакет компонентов для мобильной разработки: Раз-
работка мобильных приложений на .NET. После инсталляции мы сможем в ме-
ню Справка → О программе Microsoft Visual Studio увидеть отметку о Xamarin.
Для разработки Android-приложений еще желательно иметь реальное устройство
для тестирования, хотя, как будет показано далее, тестирование можно производить
и на эмуляторе. Для создания Android-приложения в Visual Studio 2019 предназна-
чен шаблон проекта, который называется Приложение для Android (Xamarin).
В предыдущих версиях возможны небольшие отличия. Этот тип проекта предна-
значен для создания нативного приложения, в отличие от проекта Xamarin.Forms,
который предназначен для кроссплатформенных приложений. Выполнив команду
Файл → Создать → Проект, выберите нужный нам тип проекта для C# и в по-
явившемся окне задайте имя проекта — HelloWorld. После этого выберите шаблон
проекта Пустое приложение и укажите минимальную версию Android, с которой
будет совместимо наше будущее приложение. По умолчанию IDE рекомендует ис-
пользовать Android 5.0, что в большинстве случаев является оптимальным выбо-
ром, и поэтому ничего менять не стоит. После задания необходимых параметров
Visual Studio сгенерирует новое решение. В появившемся окне среды разработки
особое внимание следует уделить окну обозревателя решений (см. рис. 1.1), при
помощи которого осуществляется навигация по компонентам решения. В нем так-
же хорошо видна структура проекта.
Содержание проекта
В решение входит единственный проект, названный нами HelloWorld. Его структу-
ра представлена на рис. 1.1.
В проект входят следующие файлы и каталоги, обеспечивающие построение при-
ложения с минимальной функциональностью.
Connected Services — предназначен для подключения различных облачных сер-
висов, используемых в проекте. По умолчанию ничего не содержит, но при под-
Освоение интегрированной среды разработки (IDE) 13
Рис. 1.1. Структура проекта HelloWorld
ключении облачной службы Visual Studio добавит необходимые ссылки, код
подключения и внесет изменения в определенные файлы конфигурации.
Properties — в этой папке содержится файл манифеста AndroidManifest.xml.
В нем определены описания всех требований, необходимых для приложения
Xamarin.Android, в частности указаны его имя, номер версии и используемые
разрешения. Кроме того, в папке Properties еще располагается файл AssemblyInfo.cs,
в котором указываются метаданные сборки .NET. В него обычно рекомендуют
вносить базовые сведения о программе.
Ссылки — эта папка включает сборки, требуемые для разработки и запуска
программы. Выбрав, а затем развернув каталог Ссылки (References), можно
увидеть ссылки на библиотеки .NET, в частности на System, System.Core и
System.Xml, и, кроме того, ссылку на сборку Xamarin — Mono.Android. В этот
каталог в процессе работы с проектом добавляются и другие библиотеки, необ-
ходимые для разработки.
Assets — в эту папку включаются файлы, требуемые в процессе выполнения
приложения, такие как шрифты, локальные файлы данных и текстовые файлы.
Доступ к файлам в этом каталоге осуществляется при помощи создаваемого
экземпляра диспетчера AssetManager.
Resources — в данном каталоге содержатся ресурсы программы. К таковым от-
носятся строки, рисунки и макеты. Для того чтобы обращаться к ресурсам в ко-
де, создается класс Resource, посредством которого и происходит получение
ресурсов для использования в коде. Он также располагается в данной папке.
MainActivity.cs — файл C#, содержащий описание класса главного стартового
экрана приложения.
Ресурсы приложения
Каталог Resources включает ряд подкаталогов, таких как drawable, layout, mipmap
и values. Кроме того, в нем располагается файл Resource.designer.cs. Назначения
данных элементов описываются ниже.
14 Глава 1
drawable — предназначается для размещения графических ресурсов, к примеру
изображений, в том числе растровых. По умолчанию отсутствует в Visual Studio
2019, но этот каталог можно самостоятельно создать при необходимости. Дос-
туп к ресурсам в программном коде из этого каталога возможен посредством
класса Resource.Drawable.
mipmap — каталог, содержащий прорисовываемые файлы для значков запуска
с различной плотностью. Для создания таких значков можно использовать online-
сервис: https://romannurik.github.io/AndroidAssetStudio/icons-launcher.html.
Доступ к ресурсам из этого каталога производится с использованием класса
Resource.Mipmap.
layout — папка, которая включает файлы дизайнера Android (имеющие расши-
рение axml или xml), которые, в свою очередь, определяют визуальный интер-
фейс для каждого экрана, фрагмента либо деятельности. В случае использования
шаблона пустого приложения при создании проекта будет сформирован файл
компоновки, по умолчанию именуемый activity_main.axml. В последней на те-
кущий момент версии среды разработки (Visual Studio 2019) все эти файлы по
умолчанию имеют расширение xml, однако это не имеет принципиального зна-
чения, и нами в примерах будут применяться оба типа файлов. Для доступа
к ресурсам из этого каталога используется класс Resource.Layout.
values — это папка, содержащая XML-файлы, предназначенные для хранения
простых значений, к примеру строк, целых чисел и цветов. При создании проек-
та с использованием шаблона пустого приложения, в частности, будут созданы
файлы с именем strings.xml для хранения текстовых значений и styles.xml для
хранения стилей по умолчанию. В них также можно добавлять ресурсы разме-
ров или цветов. Для доступа к ресурсам из данного каталога можно использо-
вать классы Resource.String для извлечения строк, Resource.Dimension для получения
размеров, Resource.Color для определения цветов и пр.
Resource.designer.cs — это файл, в котором определен класс Resource. Он являет-
ся разделяемым классом и используется для хранения уникальных идентифика-
торов, назначенных каждому ресурсу. Его формирование осуществляется
автоматически при помощи Xamarin.Android. Кроме того, класс Resource воссоз-
дается всякий раз в случае необходимости. Этот файл ни в коем случае не стоит
изменять вручную, потому что Xamarin.Android будет перезаписывать все до-
бавленные в него изменения.
В связи с тем, что Android используется на устройствах с различными разрешения-
ми экрана, требуется иметь в наличии растовые изображения для нескольких типов
разрешений: низкого, среднего, высокого и очень высокого. Это позволит обеспе-
чить оптимальное сочетание качества изображений и производительности на всех
гаджетах. Такие возможности приложения обеспечиваются созданием альтерна-
тивных ресурсов, которые должны храниться в дополнительных вложенных ката-
логах в папке \Resources. Наряду с папкой drawable они создаются отдельно.
drawable-ldpi — каталог, предназначенный для хранения графических ресурсов
для экранов с низкой плотностью.
Освоение интегрированной среды разработки (IDE) 15
drawable-mdpi — каталог, предназначенный для хранения графических ресур-
сов для экранов со средней плотностью.
drawable-hdpi — каталог, предназначенный для хранения графических ресурсов
для экранов с высокой плотностью.
drawable-xhdpi — каталог, предназначенный для хранения графических ресур-
сов для экранов с очень высокой плотностью.
drawable-xxhdpi — каталог, предназначенный для хранения графических ресур-
сов для экранов с еще более высокой плотностью.
Поместив изображения в соответствующие подкаталоги в папке \Resources, система
автоматически произведет выбор подходящего в зависимости от разрешения экрана
устройства, на котором выполняется приложение. При этом файлы изображений
должны быть одноименные. Аналогичные каталоги могут быть созданы и для ката-
лога mipmap.
Альтернативные ресурсы задаются не только для разрешений экранов, но и, к при-
меру, языков локализации, форматов и ориентаций экрана, версий платформы и
многих других свойств конфигурации устройства.
Вместе с тем каталог ресурсов Resources можно дополнять другими элементами,
необходимыми для разработки. Примеры этого будут рассмотрены в последующих
главах. Кроме того, структура этой папки по умолчанию может незначительно от-
личаться в различных версиях Visual Studio и Xamarin.Android.
Проектирование экранных форм
Используя обозреватель решений (см. рис. 1.1), раскройте ветку Resources, а в ней
layout и выберите файл activity_main.axml (он может иметь расширение xml). При
этом IDE примет вид, представленный на рис. 1.2.
В центральной части окна происходит визуальное проектирование макета экрана и
выполняется установка свойств расположенных на нем элементов. Рабочая область
среды разработки поделена на две части. В левой части располагается конструктор
макета (или дизайнер), в котором видно экранное представление. Визуальное кон-
струирование интерфейса происходит путем перетаскивания компонентов из пане-
ли элементов на макет экрана. В правой части основного окна есть редактор кода.
Это XML-разметка компоновки элементов управления. Этот код автоматически
генерируется при изменении макета экрана. Его можно менять, что сопровождается
модификацией визуального представления макета. Таким образом, экранную фор-
му можно проектировать либо при помощи редактора XML, либо посредством кон-
структора. Первый способ предпочтительней, поскольку не все свойства отобра-
жаются в конструкторе во время проектирования, а видны лишь при отладке на ре-
альном устройстве. Кроме того, использование конструктора не лучшим образом
влияет на скорость работы IDE.
Проектирование Android-приложений предполагает разделение пользовательского
интерфейса, данных приложения и управляющей логики на отдельные компонен-
16 Глава 1
ты: представление и код. Таким образом, модификация каждого компонента может
осуществляться независимо.
Еще одним важным окном среды разработки является редактор свойств. На рис. 1.2
он располагается под окном обозревателя решений. В нем отображены свойства
виджета, выбранного в данный момент времени в конструкторе. Также при помощи
этого окна можно задавать начальные свойства элементов интерфейса. Свойств
у элементов обычно немало, но названия большинства интуитивно понятны. Спи-
сок можно представить по категориям или в алфавитной последовательности. Все
свойства можно условно разделить на несколько групп: логические, с фиксирован-
ным набором значений, ресурсы, размеры, строки.
Рис. 1.2. Конструктор экранных форм и XML-разметка в среде разработки
Редактор кода
В обозревателе решений (см. рис. 1.1) дважды щелкните на файле MainActivity.cs.
При этом откроется окно, представленное на рис. 1.3. Это редактор кода, представ-
ляющий собой мощный текстовый редактор со стандартными приемами работы
в редакторах такого типа и, конечно, с множеством встроенных средств повышения
производительности. Среди них стоит отметить IntelliSense, который обычно авто-
матически вызывается при вводе символа ".". Это позволяет сразу видеть инфор-
мацию о методах заданного объекта или параметрах и тут же вставить ее в код.
Основные действия по разработке приложения происходят именно в этом редакто-
ре. По умолчанию в файле MainActivity.cs описывается класс стартовой формы,
который содержит описание всего одного события — создание экранной формы.
Освоение интегрированной среды разработки (IDE) 17
Рис. 1.3. Окно редактора кода
В разработке Android-приложений экранную форму принято называть Activity (чи-
тается "активити", активность, иногда деятельность или действие).
Приложение HelloWorld
Часть работы по созданию этого приложения мы уже сделали, поэтому далее нам
надо выполнить следующее.
1. В обозревателе решений откройте проект HelloWorld и, последовательно рас-
крыв узлы Resources → layout, выберите файл activity_main.axml.
2. В конструкторе Activity отметьте белое поле. При этом в окне свойств для свой-
ства Gravity поставьте флажок для значения center.
3. Раскройте Панель элементов (она выдвигается щелчком по ярлыку с одно-
именным названием в группе вкладок в левой части окна среды разработки)
и в группе элементов Layouts найдите элемент LinearLayout (vertical). Перета-
щите этот элемент на белое поле конструктора и задайте ему свойство Layout
Width равным match_parent.
4. Возьмите на панели элементов TextView и поместите его в область только что
добавленного компонента LinearLayout. Задайте взятому элементу свойство
Text равным значению Hello World, а для свойства Gravity поставьте флажок
для значения center.
5. Аналогичным образом найдите на панели элементов Button и перетащите этот
компонент в область LinearLayout. Задайте свойству Text значение OK.
18 Глава 1
При этом в разделе XML-разметки должен сгенерироваться код, приведенный
в листинге 1.1.
Листинг 1.1. XML-разметка главного экрана приложения
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center" >
<LinearLayout
android:orientation="vertical"
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/linearLayout1" >
<TextView
android:text="Hello World"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textView1"
android:gravity="center" />
<Button
android:text="Ok"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button1" />
</LinearLayout>
</RelativeLayout>
Если у вас получился другой код, то скопируйте листинг 1.1 и замените им XML-
разметку активности. На этом создание визуального интерфейса первого Android-
приложения завершено.
Добавим немного функциональности нашей программе: сделаем так, чтобы при
нажатии кнопки OK приложение закрывалось. Для этого при помощи обозревателя
решений откроем файл MainActivity.cs. При этом мы перейдем к редактору кода.
Если вы используете Visual Studio 2019, то по умолчанию в коде стартовой актив-
ности имеется еще несколько строк, которые на рис. 1.3 отсутствуют. В этом
дополнительном коде происходит инициализация библиотеки Xamarin.Essentials.
Она представляет собой пакет, включающий единые кроссплатформенные API-
интерфейсы для использования в мобильных приложениях. В новых версиях среды
разработки он инсталлируется по умолчанию, а в предыдущих, в случае необходи-
Освоение интегрированной среды разработки (IDE) 19
мости, доустанавливался отдельно при помощи диспетчера пакетов NuGet. С по-
мощью этой библиотеки обеспечивается доступ к таким полезным функциям, как
компас, геокодирование, работа с буфером обмена и многое другое. Подробнее об
этом можно узнать здесь: https://docs.microsoft.com/ru-ru/xamarin/essentials/. Мы
не будем сейчас в нашем проекте использовать эту библиотеку, поэтому удалите
лишние строки таким образом, чтобы код соответствовал рис. 1.3. После строки 16
(см. рис. 1.3) вставьте код, приведенный в листинге 1.2.
Листинг 1.2. Создание экземпляра кнопки и добавление обработчика события Click
для кнопки
17 var btnOk = FindViewById<Button>(Resource.Id.button1);
18 btnOk.Click += delegate
19 {
20 Android.Support.V7.App.AlertDialog.Builder alert = new Android.Support.V7.
App.AlertDialog.Builder(this);
21 alert.SetTitle("Внимание");
22 alert.SetMessage("Вы действительно хотите выйти из приложения?");
23 alert.SetCancelable(false);
24 alert.SetPositiveButton("Да", delegate { Java.Lang.JavaSystem.Exit(0); });
25 alert.SetNegativeButton("Нет", delegate { });
26
27 RunOnUiThread(() =>
28 {
29 alert.Show();
30 });
31 };
Теперь протестируем наше приложение на эмуляторе Android-устройства, но сна-
чала нужно его создать. При помощи главного меню среды разработки выполните
последовательно команды Средства → Android → Android Device Manager.
В открывшемся окне Диспетчера устройств нажмите кнопку Создать. В окне ре-
дактора нового устройства задайте необходимые параметры и также нажмите
кнопку Создать. Редактор устройства содержит довольно много параметров. Их
можно менять в дальнейшем. В нашем случае достаточно все оставить по умолча-
нию. Зададим только свойство Имя и выберем операционную систему (далее ОС).
Назовем наше устройство Pie_Device по имени ОС Android и в качестве выбранной
ОС также выберем Pie 9.0 — API 28. Это достаточно удобно, т. к. тестировать при-
ложение желательно на всех операционных системах, которые оно будет поддер-
живать, и соответственно потребуется создавать эмуляторы всех устройств, из ко-
торых будет формироваться список эмуляторов для развертывания приложения.
Для того чтобы сразу понимать, на каком устройстве производить отладку, жела-
тельно в его имени отобразить название ОС.
После нажатия кнопки Создать примите лицензионное соглашение и вернитесь
к окну Диспетчера устройств. Компьютер разработчика должен иметь доступ
20 Глава 1
в Интернет. При этом начнется закачка образа системы. Дождитесь ее окончания
и закройте диспетчер.
ПРИМЕЧАНИЕ
В процессе работы со средой разработки часто возникает необходимость доступа
в Интернет. Это не только закачка образов системы, но и обновление среды разработ-
ки, Android SDK, поиск и установка NuGet-пакетов, публикация приложения и многое
другое.
На панели инструментов Стандартная нажмите кнопку .
При помощи этой кнопки запускается отладка на только что созданном эмуляторе
pie_device (Android 9.0 — API 28). При этом в окне Вывод среды разработки можно
видеть шаги запуска эмулятора (если он не был запущен), сборки приложения, пуб-
ликации необходимых для работы приложения библиотек Xamarin, публикации и
запуска непосредственно полученной сборки на эмуляторе. На экране эмулятора
(рис. 1.4) можно видеть наше созданное приложение в режиме выполнения. Про-
тестируем его, нажав кнопку OK. После появления диалогового окна с предложе-
нием выхода из приложения нажмите кнопку ДА. При этом приложение должно
Рис. 1.4. Приложение HelloWorld в режиме выполнения
Освоение интегрированной среды разработки (IDE) 21
закрыться. Если у вас что-то не получилось, повторите описанные действия и по-
старайтесь найти ошибку.
Тестировать приложения можно и на реальном устройстве. Есть функции, работа
которых видна только "вживую" на смартфоне или планшете. Для этого подсоеди-
ните к компьютеру имеющиеся устройство при помощи USB-кабеля. Включите
доступ к устройству. Войдите в настройки устройства в раздел Для разработчи-
ков. Установите параметр Отладка по USB в положение Включено. Обычно этого
достаточно, но для удобства включим еще параметр Не выключать экран. На не-
которых устройствах раздел для разработчиков может быть скрыт, и, чтобы его
отобразить, нужно согласно инструкции к смартфону произвести некоторые мани-
пуляции. Например, для устройств Samsung нужно войти в раздел О телефоне
(О планшете), потом перейти к строке Номер сборки и коснуться этой строки
7 раз. После этого система сообщит пользователю, что он стал разработчиком. При
этом на панели Стандартная среды разработки появится кнопка запуска отладки
с названием вашего устройства и версией Android.
ПРИМЕЧАНИЕ
Перед первым запуском приложения на реальном устройстве или эмуляторе в систе-
ме разворачивается несколько новых приложений. В первую очередь это Mono Shared
Runtime. Это среда для выполнения Xamarin-приложений. Кроме того, будет установ-
лен компонент Xamarin.Android API-28 Support. Он обеспечивает поддержку требуемо-
го уровня API (в данном случае API-28). В зависимости от используемой версии SDK
(для целевой системы) в проекте приложения эти пакеты будут различаться. Они мо-
гут доустанавливаться (при необходимости), к примеру в случае, когда версия плат-
формы разработки (SDK) меняется.
Теперь, когда вы получили работающее приложение, изменим заголовок приложе-
ния. Разверните папку values (в папке Resources) и откройте файл strings.xml. Изме-
ните строку имени приложения на Мое первое приложение (листинг 1.3).
Листинг 1.3. Изменение ресурсов приложения
<resources>
<string name="app_name">Мое первое приложение</string>
<string name="action_settings">Settings</string>
</resources>
Протестируйте приложение, запустив его на устройстве или эмуляторе Android.
Локализация приложений
Локализацией называют процесс подготовки программного обеспечения к исполь-
зованию в культурах различных государств. К таким мероприятиям, в частности,
относится перевод с одного языка на другой пользовательского интерфейса и со-
путствующих файлов приложения. Достоинства этого очевидны. В зависимости от
принадлежности к той или иной культуре пользователь будет запускать приложе-
ние на понятном ему языке. Так, если пользователь запустит приложение на уст-
22 Глава 1
ройстве с английским интерфейсом, он увидит текст на знакомом ему английском
языке. Если приложение запустит русскоговорящий пользователь, он увидит текст
на русском языке. По умолчанию разрабатываемое приложение предполагает анг-
лийскую локализацию, хотя в используемом нами ресурсном файле имя приложе-
ния определено на русском языке. В подобных случаях, когда локализация не пре-
дусмотрена в приложении, по умолчанию будет применяться англоязычная версия.
Английский вариант строковых ресурсов хранится в каталоге \Resources\values
в файле strings.xml, который мы правили. Для русскоязычной локали следует соз-
дать новый подкаталог values-ru в том же каталоге \Resources. Он будет предназна-
чен для хранения альтернативных ресурсов для русского языка. Скопируйте файл
\Resources\values\strings.xml и вставьте его в новую папку \Resources\values-ru. Из-
мените его содержимое:
<resources>
<string name="app_name">Мое первое приложение</string>
<string name="action_settings">Настройки</string>
</resources>
А файлу \Resources\values\strings.xml для английской версии задайте такое содер-
жимое:
<resources>
<string name="app_name">My first application</string>
<string name="action_settings">Settings</string>
</resources>
После запуска приложения текст будет на русском языке при условии, что на
вашем эмуляторе или устройстве параметры в настройках соответствуют этому
языку. Как сменить локализацию? Выберите на устройстве либо эмуляторе На-
стройки → Язык и клавиатура → Выбрать язык. Поменяйте язык и повторно
запустите программу.
Ресурсы из каталога \Resources\values являются установками по умолчанию. Они
будут выбраны для отображения при условии, что для текущей локализации гадже-
та система не найдет ресурсы. В рассматриваемом случае для всех локалей, за ис-
ключением русской, для которой ресурсы нами были определены, будет использо-
ваться \Resources\values.
Помимо строковых параметров могут быть локализованы и другие ресурсы. На-
пример, в соответствии с существующими традициями в различных странах может
использоваться своя версия изображения почтового ящика (в частности, с эмбле-
мой почтового рожка). В подобных случаях необходимо создать отдельный каталог
для файлов изображений, например \Resources\drawable-de, включающий графику
только для пользователей из Германии.
Наличие локализованной версии однозначно способно поднять уровень продаж
ваших программ. Помимо обозначенных выше, рекомендуется локализовывать
приложения для языков с наибольшим числом их носителей. Например, желатель-
но также создавать каталоги для испанского языка (values-es), португальского
(values-pt), французского (values-fr). Это наиболее многочисленные языковые груп-
Освоение интегрированной среды разработки (IDE) 23
пы. К этому списку следовало бы причислить локали для китайского рынка прило-
жений, однако в этой стране почти не пользуются устройствами с предустановлен-
ным магазином приложений от Google, и поэтому, несмотря на наличие китайской
локализации, выход приложений на этот рынок (из-за обозначенного обстоятельст-
ва) весьма не прост и имеет свои особенности.
В коде обращаться к ресурсам можно следующим образом:
textView.Text = GetString(Resource.String.app_name);
Система сама подставит нужную строку. Аналогичным образом происходит обра-
щение к ресурсам изображений:
var draw = Android.Support.V4.Content.ContextCompat.GetDrawable(this,
Resource.Drawable.ic_voice_search);
button.SetCompoundDrawablesWithIntrinsicBounds(null, draw, null, null);
В этом случае картинка из папки \drawable (или папки, соответствующей установ-
ленной локализации, если она определена) отобразится в верхней части кнопки.
Принципы работы приложения
и основы архитектуры
Программы для Android отличаются отсутствием единой точки входа, т. е. в при-
ложении нет единственной строки кода, к которой операционная система обраща-
ется для его запуска. Запуск программы будет осуществлен, когда система создает
экземпляр одного из его классов. При этом весь процесс приложения загружается
системой в память. Эта уникальная возможность Android имеет особое значение,
когда речь идет о создании сложных приложений или взаимодействии с операци-
онной системой Android.
Когда наша программа HelloWorld впервые открывается на эмуляторе или на уст-
ройстве, Android создает первое действие (экран или активность). Последнее пред-
ставляет собой особый класс Android, который соответствует одному экранному
представлению и отвечает за отрисовку и функционирование графического интер-
фейса пользователя. Вместе с тем процесс приложения загружается в момент, когда
система создает первую активность программы (рис. 1.5).
Поскольку в Android-приложении линейная очередность выполнения отсутствует
(приложение может быть запущено из многих мест), система позволяет отслежи-
вать классы и файлы, входящие в состав приложения. В приложении HelloWorld
регистрация всех частей программы происходит в соответствующем xml-файле —
манифесте Android. Его предназначение состоит в отслеживании содержимого,
свойств и разрешений программы. Он сообщает о них непосредственно операцион-
ной системе. Программа HelloWorld является фактически одним действием (экра-
ном) и коллекцией ресурсных и вспомогательных пакетных файлов, которые связа-
ны манифестом Android. Наряду с этим файл манифеста отвечает за объявление
имени пакета приложения, который является уникальным идентификатором, опи-
сание программных компонентов, деятельностей, служб, приемников широковеща-
24 Глава 1
тельных сообщений и контент-провайдеров, что дает возможность вызывать классы
реализации каждого отдельного компонента, а также объявляет их намерения.
В файл манифеста включен список разрешений, необходимых для обращения к за-
щищенным частям API, а также для взаимодействия с другими программами. Ма-
нифест объявляет разрешения, которые сторонние приложения обязаны иметь для
взаимодействия с компонентами данного приложения; объявляет минимальный
уровень API Android, необходимый для работы приложения; перечисляет связан-
ные библиотеки.
Рис. 1.5. Запуск приложения Android
Развернем файл манифеста. Для этого в окне обозревателя решений откройте раз-
дел Properties и дважды щелкните на файле AndroidManifest.xml. Его содержимое
представлено в листинге 1.4.
Листинг 1.4. Манифест приложения HelloWorld
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
package="com.companyname.helloworld">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:theme="@style/AppTheme">
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
Освоение интегрированной среды разработки (IDE) 25
Элемент <manifest> представляет собой корневой тег манифеста. По умолчанию
в Visual Studio создается элемент, имеющий четыре атрибута:
xmlns:android — задает пространство имен Android. Оно неизменно;
package — задает уникальное наименование пакета приложения, которое вы оп-
ределили, когда создавали проект;
android:versionCode — задает внутренний номер версии, который используется
при сравнении версий программы. Он должен быть представлен целым числом.
Этот атрибут используется магазином приложений Google Play, чтобы можно
было установить, опубликовали ли вы новую версию или нет. В том случае,
когда будет обнаружена новая версия, сработает триггер обновления на тех гад-
жетах, на которых было инсталлировано ваше приложение. Изначально этому
атрибуту задается значение 1, и по мере выпуска новых версий его нужно уве-
личивать на единицу;
android:versionName — задает номер версии для пользователя. В качестве значения
применяется текст либо текстовый ресурс. Этот номер показывается пользова-
телю.
С помощью тега <uses-sdk> объявляется совместимость нашего приложения с ука-
занной версией (либо более новыми версиями API) операционной системы Android.
При определении совместимости происходит сравнение уровня API, объявленного
приложением, с уровнем API системы мобильного устройства, на которое произво-
дится инсталляция вашего приложения. В данный раздел входит ряд параметров,
определяющихся такими атрибутами:
android:minSdkVersion — задает минимально возможный уровень API, который по-
требуется для выполнения приложения. Платформа Android, установленная на
конкретном мобильном устройстве, будет препятствовать тому, чтобы была
осуществлена установка приложения пользователем, в том случае если уровень
API системы окажется ниже, чем значение, установленное с помощью этого ат-
рибута. Он должен объявляться всегда, к примеру: android:minSdkVersion="11". При
этом если для него установить значение 7, потом вернуть 11, а затем сравнить
внешние виды приложения, то они окажутся отличающимися друг от друга.
android:maxSDKVersion — задает самую позднюю версию системы, которую может
поддерживать ваше приложение. Если установить в этом атрибуте какое-либо
значение уровня API, то программа не будет отображена в магазине приложений
для гаджетов с более новой версией системы. Рекомендуется определять тогда,
когда имеется абсолютная уверенность в том, что программа будет некорректно
выполняться на новой платформе.
targetSDKVersion — задет целевую платформу. Это та платформа, на которой не-
посредственно производятся разработка и тестирование приложения. Осущест-
вив установку значения уровня API, используя этот атрибут, вы даете указание
системе, что для поддержки данной конкретной версии ничего изменять не по-
требуется.
Элемент <application> является одним из ключевых тегов манифеста, который со-
держит описание компонентов приложения, определенных в пакете, таких как сти-
26 Глава 1
ли, значки и пр. Имеет дочерние элементы, которые объявляют каждый из компо-
нентов, доступных в составе приложения. Манифест может содержать только один
тег <application>. В свою очередь в данный раздел включены такие атрибуты:
android:allowBackup — с его помощью задается участие приложения в инфраструк-
туре резервного копирования и восстановления;
android:icon — определяет значок для программы в целом и значок по умолча-
нию для каждого из компонентов приложения;
android:label — отображаемая пользователю метка для программы в целом и
метка по умолчанию для каждого из компонентов приложения;
android:roundIcon — с его помощью определяются круглые значки для програм-
мы. Они появились, начиная с версии Android 7.1;
android:supportsRtl — принимает одно из значений логического типа. Если уста-
новлено true, то объявляется, что приложение имеет поддержку компоновки ин-
терфейса справа налево (RTL);
android:theme — задает ссылку на ресурс стиля, с помощью которого устанавли-
вается тема по умолчанию для всех активностей в приложении.
Довольно часто в манифесте задается раздел <uses-permission>, который запрашивает
разрешения, которые приложению должны быть предоставлены системой для его
нормального функционирования, и многие другие разделы, о которых будет упо-
минаться далее.
Некоторые разделы манифеста приложения можно изменять при помощи графиче-
ского редактора среды разработки — достаточно вызвать окно свойств проекта при
помощи IDE. Для этого в окне обозревателя решений выберите проект HelloWorld,
щелкните правой копкой мыши по выбранному проекту и выберите команду Свой-
ства. Это окно также можно вызвать через главное меню командой Проект →
Свойства:HelloWorld. В появившемся окне выберите раздел Манифест Android.
Описание исходного кода
Исходные коды нашего приложения представлены файлом разметки стартового
экрана (макета) activity_main.axml и файлом, описывающим класс стартового дей-
ствия, MainActivity.cs. Файл разметки приведен в листинге 1.1. Расширение axml
показывает, что это файл дизайнера Android (AXML — это аббревиатура, озна-
чающая Android XML). Имя activity_main задается произвольно в Android. Данный
файл разметки может иметь какое угодно имя. Элемент <RelativeLayout> является
корневым элементом XML-разметки. Он используется для компоновки других эле-
ментов и располагает дочерние элементы относительно позиции других дочерних
элементов разметки или относительно области самой разметки RelativeLayout.
Упомянутый ранее атрибут xmlns:android определяет пространство имен, позволяю-
щее настраивать внешний вид и поведение компонентов в Android-приложении.
А новый атрибут xmlns:tools определяет пространство имен для правильного ото-
Освоение интегрированной среды разработки (IDE) 27
бражения компонентов для просмотра в режиме дизайна. Атрибут xmlns:app нужен
для обозначения пользовательских (кастомных) свойств. Эти атрибуты обычно не
меняются. Кроме них имеются еще:
android:layout_width — задает ширину элемента. Принимает одно из значений
списка или задается произвольно с указанием единицы измерения размера. Зна-
чение match_parent указывает, что ширина равна размеру родителя. Поскольку
у этого элемента родителем является экран, то ширина будет равна ширине эк-
рана. Другие значения этого атрибута: wrap_content — означает, что размер при-
нимает значение в соответствии с размером содержимого (контента); fill_
parent — устарело и переименовано в match_parent в Android API 8 и выше;
android:layout_height — задает высоту элемента. Принимает те же самые значе-
ния, что и android:layout_width;
android:gravity — задает позиционирование содержимого внутри объекта. При-
нимает одно из значений списка. В частности, center означает, что элементы
размещаются по центру.
Внутри описанного элемента содержится еще один элемент компоновки —
<LinearLayout>. Он также представляет собой контейнер и упорядочивает все дочер-
ние элементы в одном направлении: по горизонтали или по вертикали. Все элемен-
ты расположены один за другим. Направление разметки указывается с помощью
атрибута android:orientation, который принимает одно из значений списка; в частно-
сти, vertical означает, что все элементы располагаются в столбик — по одному эле-
менту на каждой строке. У этого элемента задано еще несколько новых атрибутов:
android:minWidth — минимально возможная ширина элемента. В нашем случае
25 пикселов (px). Размер можно задавать и в других единицах измерения;
android:minHeight — минимально возможная высота элемента;
android:id — идентификатор элемента. Имеет значение @+id/linearLayout1. Когда
задается свойство id элемента LinearLayout, Android Designer производит сопос-
тавление элемента управления LinearLayout с классом Resource и назначает ему
идентификатор ресурса linearLayout1. Сопоставляя визуальный элемент управ-
ления с классом, можно находить и использовать LinearLayout, а также осталь-
ные элементы управления в коде приложения, в частности в классе MainActivity
файла MainActivity.cs.
LinearLayout содержит два элемента управления: TextView и Button. Для простого
вывода текста на экран предназначен элемент TextView. Он отображает текст (без
возможности его редактирования) при помощи атрибута android:text. В нашем слу-
чае его значение — "Hello World". Остальные атрибуты этого элемента аналогичны
рассмотренным выше атрибутам для других элементов. Элемент Button представ-
ляет собой кнопку. Его ключевой особенностью является возможность взаимодей-
ствия с пользователем через нажатия. Имеет такие же атрибуты, что и остальные
элементы.
Рассмотрим теперь класс MainActivity. Исходный код класса представлен на рис. 1.3.
Также нами был добавлен некоторый код, представленный в листинге 1.2. В стро-
28 Глава 1
ках 1–5 рис. 1.3 задаются используемые в документе пространства имен.
В строке 7 объявляется наше пространство имен. По умолчанию оно идентично на-
именованию проекта. Внутри нашего пространства имен находится описание клас-
са MainActivity. В строке 10 располагается объявление класса, который наследуется
от подкласса AppCompatActivity. Это активность. Она снабжена атрибутом [Activity]
в строке 9. Данный атрибут регистрирует действие в манифесте Android, сообщая
системе, что этот класс относится к приложению HelloWorld, которым управляет
манифест. Свойство Label определяет текст, отображаемый в верхней части экрана.
Свойство MainLauncher сообщает системе Android, что активность должна отобра-
жаться при запуске приложения. Оно становится важным при добавлении в прило-
жение дополнительных действий (экранных представлений или активностей).
Свойство Theme устанавливает набор атрибутов, стилей, который определяет внеш-
ний вид активности и определяется в ресурсах приложения. В строке 12 определя-
ется обработчик события OnCreate жизненного цикла деятельности, возникающего
при создании экрана. В приложении HelloWorld первая задача метода OnCreate за-
ключается в загрузке пользовательского интерфейса, созданного в Android Designer
(макета). В строке 14 вызывается метод создания Activity класса-родителя, далее
идет строка комментария. Для того чтобы загрузить пользовательский интерфейс,
вызывается метод SetContentView в строке 16, в который передается идентификатор
ресурса, связанный с файлом разметки: activity_main.axml. Макету активности
соответствует идентификатор Resource.Layout.activity_main. При запуске действия
MainActivity оно создает представление на основе содержимого файла activity_
main.axml.
После подготовки файла макета рассмотрим листинг 1.2, который мы вставили
в процедуру OnCreate. В строке 17 вызывается функция FindViewById, в которую пере-
дается идентификатор ресурса элемента управления, и которая ищет элемент
управления по его идентификатору и возвращает его экземпляр. Теперь, имея объ-
ект btnOk, можно в строке 18 определить обработчик события Click, возникающего
при нажатии кнопки. Событие определяется при помощи делегата. Делегаты — это
указатели на методы. С их помощью мы можем вызывать данные методы. В строке
20 создается экземпляр диалогового экрана, и далее в строках 21–25 определяются
его свойства. В строке 21 задается заголовок диалога, в строке 22 — сообщение
диалога, в строке 23 — возможность отменить диалог. В нашем случае отменить
диалог будет нельзя. В строке 24 задаются команды, выполняемые при нажатии на
кнопку диалога, в случае если пользователь соглашается выполнить действие. При
этом задается надпись кнопки и при помощи делегата определяется последователь-
ность команд, которая выполняется при нажатии кнопки: выход из приложения.
В строке 25 определяется последовательность команд, если пользователь отказался
выполнять действие диалога. Также задается надпись этой кнопки, а через делегат
определяется последовательность операторов, выполняемых при ее нажатии. В на-
шем случае внутри анонимного метода, определенного делегатом, ничего не зада-
но, т. е. диалог просто закроется, ничего не выполнив.
В строках 27–30 при помощи метода RunOnUiThread производится отображение диа-
лога (строка 29). Этот метод используется для выполнения действия в потоке UI
Освоение интегрированной среды разработки (IDE) 29
(user interface — пользовательского интерфейса). Метод широко применяется для
создания многопоточных приложений с использованием асинхронного программи-
рования, и это важно при выполнении длительных операций обработки данных, что
позволяет не зависать приложению. Как правило, перед запуском длительной опе-
рации в пользовательском интерфейсе отображают анимационную картинку, сим-
волизирующую выполнение процедуры, убирают основные элементы взаимодейст-
вия, затем длительную операцию запускают асинхронно. В завершении выполне-
ния этой операции вызывают метод RunOnUiThread, в котором убирают анимацию и
вновь отображают элементы, скрытые перед запуском асинхронной процедуры,
и полученный результат. Стоит отметить, что в нашем простом приложении не ис-
пользуется многопоточность, поэтому диалог может быть отображен и без приме-
нения метода RunOnUiThread, а использование его в данном примере обусловлено
лишь учебными целями. Особенности этого метода в асинхронном программирова-
нии будут рассмотрены далее.
Тестирование и отладка приложения
Среда разработки содержит ряд отладочных средств, которые помогут сделать при-
ложения более устойчивыми. Отладочные средства вызываются из меню Отладка
главного меню IDE или панели инструментов Отладка. Для выявления проблем
в сложном коде можно устанавливать точки останова, выполнять код пошагово или
выводить сведения в окне журнала. Рассмотрим, как осуществить пошаговое вы-
полнение программы и осуществлять просмотр значений переменных:
1. Откройте созданный проект HelloWorld и отобразите при помощи обозревателя
решений в редакторе кода файл MainActivity.cs (см. рис. 1.3).
2. Дополните процедуру обработки события Click экземпляра кнопки btnOk строкой:
btnOk.Text = "Закрыть?";. Добавьте эту строку сразу после строки 19 листинга 1.2.
В этой строке надпись на кнопке меняет свое значение.
3. Установите курсор на добавленную строчку и нажмите клавишу <F9>. При этом
будет установлена точка прерывания на поле слева от наружной строки.
4. Запустите приложение клавишей <F5>. После запуска приложения на эмуляторе
нажмите кнопку OK. Программа должна остановиться на строке, в которой на-
ходится точка прерывания.
5. Выделите мышью текст btnOk.Text, который был добавлен в листинг 1.2, и вы-
полните команду Быстрая проверка из меню Отладка.
6. В открывшемся диалоговом окне нажмите кнопку Добавить контрольное зна-
чение, чтобы добавить выделенное выражение в окно просмотра, а затем кнопку
Закрыть.
7. Для выполнения программы в пошаговом режиме нажимайте клавишу <F10>
(с обходом метода) или <F11> (с заходом внутрь метода, если нужно перейти
к коду реализации какой-либо функции, встречающейся на пути отладчика,
и отследить ее работу). При этом в окне контрольных значений можно видеть
30 Глава 1
изменения выражения. В частности, напротив свойства Text экземпляра btnOk
можно видеть его значение.
8. Для получения представления о пошаговом выполнении программы и изме-
нении значения выражения перезапустите программу, нажав комбинацию
клавиш <Ctrl>+<Shift>+<F5>, нажмите кнопку OK. Как только программа
остановится, обратите внимание на контрольное значение выражения. Оно
равно "Ok", т. е. значению, заданному в макете экрана.
9. Нажмите клавишу <F10> или <F11>. При этом в окне контрольных значений
свойство Text изменилось на значение "Закрыть?".
10. Продолжите выполнение программы, нажав клавишу <F5>.
11. Завершите процесс отладки комбинаций клавиш <Shift>+<F5>.
Несмотря на наличие арсенала отладочных средств в среде разработки, желательно
разрабатывать специальные текстовые утилиты, предназначенные для "прогона"
программного кода.
В последующих главах мы более детально рассмотрим особенности архитектуры
экранных форм, жизненный цикл Activity и основные компоненты создания визу-
ального интерфейса.
<0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0>
ГЛАВА 7
СБОРКА И РАСПРОСТРАНЕНИЕ
ПРИЛОЖЕНИЙ
По завершении всех работ, связанных с разработкой приложения, включающих
тесты и отладку, его можно публиковать. Смысл публикации состоит в формирова-
нии файла, имеющего расширение apk (Android Package) и представляющего собой
так называемый инсталляционный пакет программы, который в дальнейшем нуж-
но разместить в Google Play Market либо прочих внешних ресурсах.
Создание подписанного apk
По умолчанию файл с вышеуказанным расширением будет создан во время отлад-
ки. Он находится в каталоге соответствующего проекта по пути ...\<Название_
проекта>\bin\Debug и называется <Имя_пакета>.apk. Это отладочная, или debug-,
версия пакета. Однако этой версии файла может оказаться недостаточно для пол-
ноценного распространения. Для того чтобы файл был опубликован должным обра-
зом, следует дополнительно подготовить проект к релизу. В частности, с этой це-
лью в файле манифеста приложения у тега <manifest> указываются атрибуты
android:versionCode и android:versionName. Также на данном этапе имеет смысл задать
уникальный значок для программы. Он будет отображаться на одном из рабочих
экранов дисплея мобильного устройства. Кроме этого, при помощи атрибута
android:label тега <application> следует задать название приложения.
В файле манифеста важно указать имя пакета (атрибут android:package элемента
<manifest>), необходимое для работы программы в будущем. Стандартно в Visual
Studio 2019 пакеты приложений начинаются с com.companyname.[название_
проекта]. Следует непременно заменять данное имя, поскольку оно будет являться
уникальным идентификатором вашей программы. К примеру, в моем случае в ма-
нифесте, представленном далее, пакет имеет наименование com.eustudio.sqlite.
До формирования релиз-версии можно определить требования к API. В частности,
к ним относится минимально допустимая версия Android, а также другие парамет-
ры. Это делается путем установки в файле манифеста соответствующих атрибутов
у тега <uses-sdk>.
android:minSdkVersion — минимальная версия Android;
android:targetSdkVersion — оптимальная версия API;
android:maxSdkVersion — максимальная версия системы.
306 Глава 7
Например, пусть минимальная версия — KitKat 4.4, а оптимальная — Oreo 8.1:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
android:installLocation="preferExternal"
package="com.eustudio.sqlite">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="27" />
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:theme="@style/AppTheme">
</application>
</manifest>
В ряде случаев в манифест помещают информацию о том, что приложение поддер-
живает различные разрешения экранов, при помощи такого элемента:
<supports-screens android:anyDensity="true" android:largeScreens="true"
android:normalScreens="true" android:resizeable="true" android:smallScreens="true"
android:xlargeScreens="true" />
Это может быть важно, если вы хотите осуществить публикацию своего приложе-
ния в Google Play для планшетов. Без этого элемента пользователи планшетов мо-
гут не увидеть вашу программу в магазине. При этом атрибут android:anyDensity
сообщает системе, что приложение включает ресурсы для обеспечения поддержки
любой плотности дисплея, а атрибут android:resizeable указывает на то, что размеры
приложения можно изменять для любых экранов. Смысл использования остальных
атрибутов этого тега вполне очевиден. Однако в ряде случаев этот тег может быть
опущен и приложение все равно будет отображено для планшетов. Для этого быва-
ет достаточно правильно представить описания приложения в магазине.
После окончания всех подготовительных работ приложение обязательно подписы-
вается сертификатом, с помощью которого производится идентификация автора
программы. Когда производятся тестовые запуски приложения при помощи Visual
Studio и программа устанавливается на эмулятор либо реальное устройство, при-
ложение подписывается самостоятельно. Автоматически созданный подписанный
пакет <Имя_пакета>-Signed.apk располагается в папке ...\<Название_проекта>
\bin\Debug. Однако, чтобы сформировать релиз-версию, надо дополнительно вы-
полнить некоторые действия.
При формировании сертификата нужно иметь в виду, что во время обновления вер-
сии программы в магазине приложений система непременно сравнит предыдущую
и новую версии сертификата. При этом обновление произойдет только в том слу-
чае, если будет обнаружено совпадение обеих версий. Но когда новый сертификат
отличается от ранее предоставленного, система воспримет программу как новую,
совершенно не связанную с предыдущей версией. В такой ситуации приложение
может быть опубликовано, только если имя пакета будет отличаться от предыду-
щей версии.
В Visual Studio при помощи диспетчера конфигураций установим релиз-конфи-
гурацию проекта. Диспетчер конфигураций можно открыть через обозреватель
Сборка и распространение приложений 307
решений. При этом надо вызвать для всего решения (не проекта) контекстное
меню, выполнить команду Свойства и в появившемся окне свойств решения по-
следовательно открыть узлы Свойства конфигурации → Конфигурация. В спи-
ске проектов установите релиз-конфигурации для требуемых проектов. Зачастую
это применяется ко всем проектам, входящим в решение.
Перед сборкой релиз-версии необходимо установить настройки компоновщика и
поддерживаемые архитектуры приложения. Для этого отобразите свойства проекта
мобильного приложения Android и в открывшемся окне перейдите на вкладку
Параметры Android.
При установке режима Release отключается общая среда выполнения и включается
связывание. При этом в apk-файле публикуются только те части Xamarin.Android,
которые потребуются во время выполнения программы. Для того чтобы опреде-
лить, какие узлы, типы и члены типов используются или на которые ссылается
приложение Xamarin.Android, компоновщик использует статический анализ. Благо-
даря этому он отбрасывает все сборки, типы и элементы, которые не используются
(или на которые элементы не ссылаются). В свою очередь, это приводит к значи-
тельному уменьшению размера упаковки. В раскрывающемся списке Связывание
можно установить такие параметры компоновщика:
Нет — компоновщик отключен, и компоновка выполнена не будет;
Только сборки пакета SDK — в данном варианте в компоновку будут включе-
ны только сборки, требуемые для Xamarin.Android. Остальные сборки не будут
включаться в пакет для распространения;
Сборки пакета SDK и пользователя — в данном варианте в пакет для распро-
странения будут включаться все сборки, которые используются приложением, а
не только необходимые для Xamarin.Android.
ПРИМЕЧАНИЕ
При создании упаковки нередко возможно возникновение нежелательных побочных
эффектов, поэтому перед окончательной публикацией нужно еще раз произвести
установку полученного apk и тестирование приложения в режиме выпуска на реаль-
ном мобильном устройстве.
При подготовке приложения Xamarin.Android к выпуску необходимо указать под-
держиваемые архитектуры процессоров. Один apk-файл может включать код для
нескольких различных архитектур. Если параметр Создание одного пакета (APK)
для каждого выбранного ABI включен, один apk-пакет создается для каждого
поддерживаемого ABI (Application Binary Interface), а не один большой apk-пакет
для всех поддерживаемых ABI. Этот параметр доступен, только если проект на-
строен для режима Release. По умолчанию параметр отключен. Нажимаем на кноп-
ку Дополнительно и в списке поддерживаемые архитектуры отмечаем две:
armeabi-v7a и arm64-v8a. Чем больше архитектур отметить, тем больше будет раз-
мер apk-файла. До недавнего времени достаточно было выбрать только armeabi-v7a,
но если вы хотите распространять приложения через Google Play, то с некоторых
пор эта компания стала требовать наличие 64-разрядной версии приложения для
публикации в своем магазине. Отказ от поддержки armeabi-v7a может оказаться
308 Глава 7
нежелательным, т. к. все еще существуют и успешно работают на старой архитек-
туре некоторое количество гаждетов, и мы не можем себе позволить игнорирование
имеющейся аудитории пользователей этих устройств. При этом размер apk-файла
станет большим, а для недорогих устройств с маленьким количеством встроенной
памяти это может оказаться критичным при выборе именно вашего приложения,
поэтому в таких случаях рекомендуют делать apk для каждой архитектуры свой,
включив параметр Создание одного пакета (APK) для каждого выбранного ABI.
Однако сопровождение различных apk для одного и того приложения станет слож-
нее.
ПРИМЕЧАНИЕ
Пожалуй, из недостатков Xamarin.Android стоит отметить слегка увеличенный размер
apk, но следует ожидать, что со временем компоненты мобильных устройств (в част-
ности, память) станут доступнее (это подтверждается имеющейся тенденцией),
и пользователи при выборе приложения в магазине не будут обращать внимание на
его размер. При этом уже сейчас фактор объема памяти не является существенной
проблемой.
Далее для Xamarin-проекта нужно выполнить архивацию. Это можно сделать, вы-
звав контекстное меню для проекта мобильного приложения Xamarin и выбрав
команду Архивация. Вслед за этим откроется диспетчер архивов с только что соз-
данным архивом приложения. Для создания apk-файла для распространения нужно
в диспетчере архивов нажать кнопку Распространение, а в открывшемся окне вы-
брать канал распространения. Выберите Специальный, т. к. это более универсаль-
ный вариант, нежели канал Google Play. На следующем шаге нужно задать удосто-
верение подписывания. Если его еще нет, то его следует создать, нажав кнопку +.
При этом откроется окно хранилища ключей (рис. 7.1).
Заполните поля аналогично примеру, представленному на рис. 7.1. Пароль должен
отвечать определенным требованиям сложности, и до тех пор, пока он не будет им
соответствовать, кнопка Создать будет заблокирована. После создания ключа от-
кроется обновленный список удостоверений (рис. 7.2).
Пакет для распространения каждого приложения должен быть подписан своим
удостоверением, поэтому его нужно создавать для каждого своего приложения.
Выберите из списка на рис. 7.2 необходимое для вашего приложения удостовере-
ние и нажмите кнопку Сохранить как. При этом должно будет появиться окно
ввода пароля для выбранного удостоверения. Внесите пароль, заданный в окне
хранилища ключей (см. рис. 7.1), и далее укажите путь каталога, в который нужно
поместить apk-файл (рис. 7.3).
Оптимальное место для расположения пакета для распространения — это каталог
проекта или решения. Если требуется, то можно изменить имя файла, оставив не-
изменным расширение, и после этого загрузить приложение в Play Market либо вы-
ложить на любой ресурс в Интернете. Иногда приложение можно скопировать сра-
зу на устройство, после чего оно может быть тут же инсталлировано при помощи
встроенного установщика пакетов. В этом случае важно учесть, что если программа
не из Play Market, то в параметрах телефона или планшета нужно дать разрешение
на установку приложений из других источников. Для этого требуется выполнить
Сборка и распространение приложений 309
Рис. 7.1. Создание хранилища ключей
Рис. 7.2. Список удостоверений подписывания
310 Глава 7
Рис. 7.3. Выбор расположения пакета для распространения
последовательность команд Безопасность → Неизвестные источники (Разре-
шить установку приложений из других источников).
Следует помнить установленный пароль ключа подписывания, иначе вы утратите
возможность создавать обновленные версии своего приложения. Конечно, всегда
можно создать другой ключ, но это будет считаться уже другим приложением, и вы
не сможете его обновить в Google Play. При этом также утратится вся статистика
установок, оценок и отзывов, что играет немаловажную роль в рейтинге приложе-
ния в магазине, а значит, и его нахождении в топе поисковой выдачи.
Кроме того, важно сохранить в надежное место файл хранилища ключей .keystore.
По умолчанию они создаются в профиле пользователя %USERPROFILE%\AppData\
Local\Xamarin\Mono for Android\Keystore\eustudio_sqlite. Вместо каталога eustudio_
sqlite может быть любой другой в зависимости от названия удостоверения подпи-
сывания. Скопируйте каталог с файлами *.keystore и *.keyInfo в надежное место на
случай, если придется разворачивать решение на другом компьютере или возник-
нет необходимость переустановки системы. Потеря этих файлов также чревата ут-
ратой возможности обновлять приложение. При необходимости удостоверение
подписывания всегда можно проимпортировать из этих файлов при помощи кноп-
ки Импорт (см. рис. 7.2).
Сборка и распространение приложений 311
Публикация приложения в Play Market
С целью предоставления как можно большему числу пользователей возможности
найти наше приложение стоит разместить его на внешних специализированных
ресурсах, таких как онлайн-магазин Google Play Market либо других подобных
платформах. Среди подобных сервисов Google Play является одним из крупнейших.
Рассмотрим, как осуществить публикацию в этом онлайн-магазине.
Сначала нужно зарегистрироваться в Play Marker в качестве разработчика. Осу-
ществим переход по ссылке https://play.google.com/apps/publish/signup/. С по-
мощью данного ресурса аккаунт Google можно связать с консолью разработчика
(рис. 7.4).
Рис. 7.4. Создание аккаунта разработчика
Здесь имеется возможность как создать совершенно новый аккаунт, так и привязать
к консоли уже существующий. Каждый новый разработчик должен внести при ре-
гистрации $25. Поставьте флажок, что вы согласны с лицензионным соглашением,
а затем нажмите на кнопку ОПЛАТИТЬ внизу страницы. Для оплаты регистраци-
онного сбора подойдет любая карта одной из платежных систем Visa/MasterCard и
пр. Также есть возможность использовать виртуальные карты, созданные при по-
мощи WebMoney, Яндекс-Деньги, Qiwi или других подобных сервисов. Такие кар-
312 Глава 7
ты обладают той же функциональностью, что и обычные банковские карты. Далее
вводим реквизиты карты и персональные данные, а затем выбираем Купить. После
оплаты происходит переход на страницу заполнения формы профиля, где вносятся
личные данные. Нажимаем на кнопку в нижней части страницы и переходим в ка-
бинет созданного профиля в консоли разработчика (рис. 7.5).
Рис. 7.5. Общий вид консоли разработчика Google Play
На обработку оплаты обычно требуется некоторое время, поэтому, пока не про-
изойдет проверка факта оплаты, права пользователя консоли разработчика будут
оставаться ограниченными. Между тем загрузка apk-файла уже возможна, но окон-
чательная публикация приложения произойдет только после завершения всех тран-
закций, связанных с оплатой.
На рис. 7.5 представлена консоль с уже имеющимися несколькими приложениями.
Для загрузки файла нового приложения нажмем кнопку Новое приложение. После
появления диалогового окна введите название и нажмите кнопку Создать. Далее
откроется страница приложения, где мы уже непосредственно загружаем файл про-
граммы и указываем для нее все требуемые описания.
При необходимости опубликовать новый релиз приложения нужно выбрать в спи-
ске приложений (см. рис. 7.5) нужное, открыть последовательно узлы Управление
релизом → Версии приложения, щелкнуть по ссылке Настроить в разделе Рабо-
чая версия и после перехода на следующую страницу консоли нажать кнопку
Создать выпуск. Затем можно выбрать apk-файл на своем компьютере, указать
остальные параметры рабочей версии и завершить публикацию (рис. 7.6).
314 Глава 7
нии нужно пройти регистрацию и произвести оплату. В зависимости от расходов на
рекламу своего приложения мы будем получать установки. Чем больше затрачива-
ется денежных средств на кампанию, тем больше установок и тем более популяр-
ным становится приложение. В какой-то момент от рекламной кампании и вовсе
можно будет отказаться, если, конечно, приложение окажется полезным для поль-
зователей. Таких приложений единицы. В случае обычного, заурядного прило-
жения прекращение рекламной кампании, как правило, приводит к оттоку пользо-
вателей. Если вы заинтересованы в росте популярности своего детища, нужно
постоянно платить за продвижение и, чтобы как-то окупить затраты, можно вос-
пользоваться одним из способов монетизации. Но делать это надо одновременно
с повышением качества контента. И тогда можно даже немного заработать.
Монетизация мобильных приложений
Разработка приложений осуществляется с различными целями. В ряде случаев
компаниям для получения дополнительного дохода требуется привлечение новых
клиентов или увеличение лояльности имеющихся. Часто мобильные сервисы пред-
ставляют собой один из маркетинговых каналов для бизнеса, который показывает
неплохой экономический эффект уже сразу после внедрения. Создавая что-то свое,
разработчики желают приобщиться к огромному рынку, в котором стоимость ряда
приложений (к примеру, WhatsApp) доходит до миллиардов долларов. При опреде-
ленных трудозатратах в этой сфере действительно имеется возможность что-то за-
работать. Одним из распространенных способов монетизации приложений является
мобильное приложение с рекламой. В этом случае надо найти рекламодателей для
показа релевантной рекламы в своих разработках. Приложение может иметь бан-
нер, на котором пользователи нажимают, а владелец приложения зарабатывает
деньги. Следует учесть, что основным продуктом в отрасли является AdMob от
Google, предлагающий SDK для мобильных приложений, который может быть ин-
тегрирован в приложение за считаные минуты. Однако один из недостатков биб-
лиотеки для Android заключается в том, что она является частью сервисов Google
Play. Ее использование может увеличить размер вашего приложения.
Рассмотрим один из SDK для Android — Ads Lite, который представляет облег-
ченную версию, позволяет сократить размер приложения и уменьшить количество
необходимых зависимостей.
Прежде чем можно будет интегрировать SDK, нам нужно настроить наше прило-
жение в AdMob. Если вы еще не имеете учетной записи AdMob, нужно зарегистри-
роваться на сайте https://admob.google.com. После того как вы создали учетную
запись, можно просто нажать кнопку Добавить приложение в меню Приложения,
чтобы найти наше приложение в магазине приложений или добавить его вручную.
Выберите ручной процесс, если вы не опубликовали свое приложение в Google Play.
Следующим шагом является выбор формата рекламы, который нужно интегриро-
вать в приложение. Самый простой формат для интеграции — это баннер. Он ис-
пользуется во многих приложениях. Мы можем установить частоту показа объяв-
лений и задать тип рекламы в них. Затем можно связаться с Firebase для расширен-
ной аналитики или пропустить этот пункт.
Сборка и распространение приложений 315
На этом этапе мы можем добавить дополнительные рекламные блоки или получить
инструкции по установке. Если мы хотим добавить баннеры во многие активности,
то рекомендуется создать соответствующее количество рекламных блоков. Вер-
нувшись в раздел Приложения, мы должны запомнить идентификатор рекламного
блока, а перейдя в раздел Настройки приложения — идентификатор приложения.
Они понадобятся для интеграции в коде.
Ads Lite SDK представляет собой комплект для разработчика, введенный с Google
Play services версии 9.6.1. Это облегченный пакет для показа рекламных объявле-
ний, поскольку имеет существенно меньше зависимостей в отличие от стандартно-
го Ads SDK. Однако для него требуются библиотеки поддержки Android с мини-
мальной версией 24.2.1. Благодаря использованию соответствующего NuGet-пакета
(рис. 7.7) Ads Lite могут быть добавлены к проектам нативных приложений
Xamarin.Android.
Рис. 7.7 Установка компонентов Ads Lite
После добавления SDK необходимо обновление манифеста нашего приложения.
В частности, требуется включить в него несколько разрешений и дефолтные рек-
ламные активности. Только в этом случае появится возможность старта сервиса.
Для корректного показа нативной рекламы Ads Lite SDK требуют наличия разре-
шений на доступ в Интернет и проверку состояния сети. Можно добавить их непо-
средственно в Android Manifest вручную:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
А внутри тега приложения <application...>...</application> нужно добавить специ-
фический узел activity:
<activity android:name="com.google.android.gms.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|
smallestScreenSize" android:theme="@android:style/Theme.Translucent" />
Теперь можно добавлять элемент AdView в приложении. Это делается довольно
просто. Необходимо открыть файл макета, где будет находиться реклама, и в кор-
невом узле добавить кастомные xmlns для нашей рекламы под атрибутом xmlns:ads,
или это можно сделать непосредственно в элементе AdView:
<com.google.android.gms.ads.AdView
xmlns:ads="http://schemas.android.com/apk/res-auto"
android:id="@+id/adView"
android:layout_width="match_parent"
<0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0>
ЗАКЛЮЧЕНИЕ
К сожалению, полное описание Android SDK и Xamarin заняло бы несколько тол-
стых книг, а здесь представлены лишь основы, освоив которые можно приступать
к разработке несложных приложений. Однако главные особенности разработки
мобильных приложений для Android были рассмотрены. В частности, описана
работа с Visual Studio Community 2017/2019, показано, как создавать проекты
Xamarin.Android, рассмотрена их структура, разобрана анатомия экранных пред-
ставлений, используемых в Android, разобраны примеры работы с основными ком-
понентами для построения визуальных интерфейсов. Важной частью разработки
любого приложения является хранение и обработка данных, что было рассмотрено
в главах, посвященных хранению информации в файлах, СУБД и получению дан-
ных посредством различных веб-служб. Приведены примеры работы с телефонией,
службой отправки сообщений, контактами, уведомлениями, камерой, службой оп-
ределения местоположения; показана организация функций приложения через сер-
висы и запуск их через широковещательные приёмники, а также экранные видже-
ты. Представлены методы распознавания голоса, работы со сканером, распознава-
ния образов, печати, а также ряда других возможностей платформы, и, наконец,
рассмотрены основные аспекты создания релиз-версии программы, публикации и
монетизации приложений.
В сочетании с опытом, который непременно появится, официальной документаци-
ей и публикациями на всевозможных специализированных ресурсах разработчиков
можно создавать мобильные приложения любой сложности. Следует понимать, что
Xamarin.Android — такое же полноценное средство нативной разработки Android-
приложений, как Java или Kotlin, сейчас интенсивно развивается и использует те же
самые SDK. Всё, что можно сделать на Java для Android, можно реализовать и на
C#. Вместе с тем Xamarin.Android позволяется сделать "обертку" или так называе-
мую библиотеку привязок для любого Java-класса и использовать ее в проекте.
Хотя нами данный тип проектов и не рассматривался, но при необходимости этим
всегда можно воспользоваться.
Рассмотренная в книге технология появилась уже давно, прошла достаточный эво-
люционный путь развития вместе с Android и является вполне подходящей для ис-
пользования в разработке коммерческих приложений. Кроме того, в распоряжении
разработчика оказываются все библиотеки .Net, что также дает этой технологии
определенные преимущества. Ведь .Net Framework позволяет решать довольно
330 Заключение
широкий спектр задач: разработка настольных приложений, разработка клиент-
серверных приложений, игр и, конечно, мобильных приложений для различных
операционных систем. При этом если имеется программный код для .Net, нарабо-
танный за долгие годы, то его можно легко адаптировать для использования
в Xamarin-проекте.
Xamarin имеет чрезвычайно высокий потенциал применения. Платформа базирует-
ся на Mono — альтернативном воплощении .Net и является свободным программ-
ным обеспечением. Этот проект включает в себя компилятор языка C#, среду ис-
полнения, а также ряд ключевых библиотек .Net.
Для бизнеса использование рассмотренной платформы может оказаться особенно
выгодным, если компания уже имеет опыт разработки под Windows на .Net и
значительную IT-инфраструктуру, завязанную на "экосистему Microsoft". Таких
компаний немало по всему миру, и нет никакой необходимости выискивать допол-
нительные (нередко значительные) средства, переходя на незнакомые для себя тех-
нологии, или оплачивать работу сторонних специалистов. Кроме того, преимуще-
ством может стать простота освоения Xamarin, связанная с тем, что не придется
учить дополнительный язык. Достаточно того, что вы знакомы с языком C#, знать
базовые принципы платформы .Net и изучить ряд классов, относящихся к Android
SDK. При этом если требуется разработать приложение не только для Android, то
выгода становится еще более очевидной. Несмотря на то что в книге рассмотрен
лишь фреймворк для Android, значительная часть кода, написанная для .Net, может
быть использована в проектах Xamarin.iOS и Xamarin.Forms.
Для Xamarin можно использовать официальную документацию, представленную на
https://docs.microsoft.com/ru-ru/xamarin/, в которой имеются инструкции, описа-
ния и коды практических примеров, демонстрирующих применение платформы.
Если в ней найти ответ на свои вопросы не получится, можно обратиться к сущест-
вующим сообществам, к примеру, на официальном сайте или же на других порта-
лах, таких как https://stackoverflow.com, https://www.c-sharpcorner.com, https://
github.com и пр.
У Xamarin существует собственный магазин сторонних компонентов. Он интегри-
рован в IDE. При помощи диспетчера NuGet-пакетов к проекту легко можно под-
ключать требуемые библиотеки. Они могут быть разработаны как специалистами
Xamarin, так и другими независимыми инженерами. База компонентов регулярно
пополняется. По большей части репозиторий представлен бесплатными пакетами.
Все их можно условно поделить на две группы. К первой группе относятся допол-
нительные компоненты для построения графического интерфейса, а ко второй —
библиотеки классов. К примеру, одна из известных библиотек для работы
с JSON — Json.NET (Newtonsoft.Json), портированная для Mono, была рассмотрена
в книге.
Таким образом, можно утверждать, что Xamarin на данный момент является конку-
рентным инструментом для разработки мобильных приложений. При этом продол-
жается работа по улучшению и развитию платформы, а значит, число использую-
Заключение 331
щих ее программистов будет расти, особенно с появлением бесплатной редакции
Visual Studio Community.
Несмотря на то что в IT-сфере знания довольно быстро устаревают и, возможно,
в ближайшее время появятся новые мобильные операционные системы, новые
фреймворки, полученный опыт всегда может оказаться полезным в их освоении,
тем более что теперь кросс-платформенность Mono не вызывает вопросов.
Наконец, хотелось бы напомнить, что опыт приходит с практикой. В мобильной
разработке не надо долго думать о том, какой проект реализовать. Попробуйте
заменить хотя бы одно стороннее приложение, установленное из магазина прило-
жений, своим.
Удачи!
<0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0> <0>
ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ
A H
ABI 307 HttpClient 212
ActionBar См. Панель действий
ActionImageCapture 243 I
Activity 17, 31
AdMob 314 IDE См. Интегрированная среда разработки
AlarmManager См. Диспетчер оповещений In-App Purchasing 323
AlertDialog 57 IntelliSense 16
ANR-ошибки 135 Intent 41
ArrayAdapter 94 Intent.ActionCall 220
ASMX 195 Intent.ActionDial 220
AudioManager 303 Intent.ActionSend 119, 222
AXML 26 Intent.CreateChooser 118
Internet Information Services 199
B InterstitialAd 316
Back Stack 31 J
BILLING 323
Bitmap 243, 244 JSON 208
BLOB-поле 245
L
C
Layout 60
ContactsContract 226
ContentResolver 227 M
ContentValues 185, 234
CRUD 198 MediaRecorder 301
MenuInflater 112
D
N
DataSet 199
DatePickerDialog 109 NewtonSoft 208
Newtonsoft.Json 44
F NotificationManager 262
NuGet 44
FileStream 168 NuGet-пакет
Fragment 126
Xamarin.GooglePlayServices.Vision 271
Предметный указатель 333
O SOAP 195
SQL 174
Optical Character Recognition (OCR) См. SQLiteCursor 175
Оптическое распознавание символов SQLiteDatabase 175
SQLiteOpenHelper 175
P SQLiteQueryBuilder 175
SQLiteStatement 175
PDF-документ 287 StreamReader 169
PendingIntent 263, 281 SupportFragmentManager 127
Plugin.InAppBilling 323
Pull-to-Refresh 140 T
R TelephonyManager См. Диспетчер
телефонии
ReadableDatabase 181
RecognizerIntent.ActionRecognizeSpeech 251 TimePickerDialog 109
Resources 13, 21
RESTFUL 207 W
S WebMethod 196
WritableDatabase 181
SimpleCursorAdapter 181
SmsManager 225
А Г
Адаптер печати PrintDocumentAdapter 284 Группировка данных в ListView 101
Адаптеры 94
Активность См. Activity Д
◊ свойства 38
Анимация свойств 91 Действие См. Activity
Архивация 308 Делегаты 28
Атрибут [Activity] 38 Десериализация 46
Аудиодиспетчер 303 Диаграммы Microcharts 152
Диалог 57
Б Дизайн материальный 164
Диспетчер:
Библиотека ZXing 264 ◊ оповещений 290
◊ печати PrintManager 284
В ◊ телефонии 293
Веб-сервис См. веб-служба З
Веб-служба 194
Вес элемента 61 Заставка экранная 142
Виджеты экранные 276
334 Предметный указатель
И ◊ GetLong 43
◊ GetString 43, 177
Интегрированная среда разработки 11 ◊ GetStringExtra() 49
Интерфейс: ◊ GetView 99
◊ ISharedPreferences 53 ◊ Inflate 112, 126
◊ ISharedPreferencesEditor 53 ◊ Insert 96, 185, 234
◊ MoveToFirst 175
К ◊ MoveToNext 177, 227
◊ NotifyDataSetChanged 97
Камера 240 ◊ ObtainStyledAttributes 150
Класс: ◊ OnActivityResult 48, 243, 251
◊ BroadcastReceiver 259 ◊ OnBackPressed 133
◊ FragmentPagerAdapter 147 ◊ OnBind 252
◊ LocationManager 239 ◊ OnContextItemSelected 114
Ключевое слово: ◊ OnCreate 32, 178, 252
◊ async 135 ◊ OnCreateContextMenu 114
◊ await 135 ◊ OnCreateOptionsMenu 112
Компонент: ◊ OnDestroy 34, 252
◊ MediaPlayer 257 ◊ OnDraw 150
◊ Ringtone 253 ◊ OnKeyDown 133
◊ ShortcutBadger 289 ◊ OnLayout 287
◊ собственный 148 ◊ OnMeasure 150
Компоновщик 307 ◊ OnOptionsItemSelected 112
Контекстная панель действий 119 ◊ OnPause 32
◊ OnPrepareOptionsMenu 112
Л ◊ OnReceive 259
◊ OnRequestPermissionsResult 173, 222
Локализация приложений 21 ◊ OnRestart 34
Лэйауты См. Layout ◊ OnRestoreInstanceState 32
Лямбда-выражение 69, 199, 206, 303 ◊ OnResume 32
◊ OnSaveInstanceState 34
М ◊ OnStart 32
◊ OnStartCommand 252
Манифест 23 ◊ OnStop() 34
Меню 111 ◊ OnUpgrade 178
◊ контекстное 114 ◊ OnWrite 287
Метод 133 ◊ OpenOrCreateDatabase 175
◊ Add 96 ◊ PostAsync 212
◊ CheckSelfPermission 174 ◊ PurchaseAsync 326
◊ Delete 185 ◊ Put 185
◊ DeleteAsync 212 ◊ PutAsync 212
◊ Detect 274 ◊ Query 227
◊ Dismiss 59 ◊ RawQuery 175
◊ ExecSQL 175 ◊ RegisterForContextMenu 115
◊ FindViewById 28 ◊ Remove 96
◊ Finish 34, 51 ◊ RequestLocationUpdates 239
◊ Get 43 ◊ RunOnUiThread 28, 139
◊ GetAsync 212 ◊ SetContentView 28, 46
◊ GetDefaultSharedPreferences 53 ◊ SetDropDownViewResource 108
◊ GetDropDownView 108 ◊ SetImageBitmap 87
◊ GetInt 43, 177
Предметный указатель 335
◊ SetImageResource 86 С
◊ SetImageURI 248
◊ SetResult 51 Свойство:
◊ SetView 59 ◊ Adapter 95
◊ Sort 97 ◊ Checked 78
◊ StartActivity 41 ◊ Position 96
◊ StartActivityForResult 46, 48, 243, 251 ◊ Progress 79
◊ Update 185 ◊ Window 40
◊ асинхронный 135 Сервисы:
Методы HTTP 208 ◊ Android 252
◊ Google 275
Н Сериализация 44
Сканер чеков 264
Намерение См. Intent Событиe 28, 69
◊ неявное 42, 258 ◊ Click 28
◊ явное 42 ◊ CheckedChange 78
◊ Close 133
О ◊ ItemClick 95
◊ ItemLongClick 96
Обозреватель решений 12 ◊ ItemSelected 108
Оператор: ◊ KeyPress 69
◊ INSERT 177 ◊ LongClick 124
◊ SELECT 177 ◊ NavigationItemSelected 162
Отладка 29 ◊ ProgressChanged 79
Отправка СМС 222 ◊ QueryTextChange 133, 192
◊ QueryTextSubmit 133
П ◊ Refresh 141
◊ TextChanged 69
Пакет apk 305 Создание меню См. элементы меню
Панель действий 116, 133 Сообщение всплывающее:
Переменные статические 56 ◊ Toast 49, 59
Печать данных 284 ◊ Snackbar 162
Построение диаграмм 151 Списки 94
Приёмник широковещательных сообщений Стилизация элементов управления 134
Структура проекта 12
257, 278 СУБД SQLite 174, 280
Провайдер:
◊ контента См. ContentResolver Т
◊ метоположения 239
Проверка версии API 174 Телефонные звонки 219
Проектирование макета экрана 15 Точка прерывания 29
Р У
Распознавание: Уведомления 261
◊ речи 248 Удостоверение подписывания 308
◊ символов оптическое 270
Редактор: Ф
◊ кода 16
◊ свойств 16 Фигуры геометрические 88
Ресурсы приложения 13, 95 Фильтр намерений 257, 278
336 Предметный указатель
Флаг: ◊ ImageView 86, 241
◊ ClearTop 55 ◊ include 65
◊ KeepScreenOn 41 ◊ LinearLayout 27, 60
◊ ReorderToFront 55 ◊ ListView 94
◊ ShowWhenLocked 41 ◊ NavigationView 160
◊ SingleTop 55 ◊ PagerTabStrip 147
◊ TurnScreenOn 41 ◊ ProgressBar 137
◊ RadioButton 78
Э ◊ RadioGroup 78
◊ RelativeLayout 26, 63
Экран диалога 28 ◊ ScrollView 67
Элемент: ◊ SeekBar 79
◊ AdViews 315 ◊ Spinner 107
◊ AppBarLayout 158 ◊ string-array 95
◊ application 25 ◊ SwipeRefreshLayout 140
◊ Button 69 ◊ TableLayout 63
◊ ChartView 152 ◊ TableRow 64
◊ CheckBox 78 ◊ TextView 67
◊ CoordinatorLayout 158 ◊ TimePicker 109
◊ DatePicker 109 ◊ Toolbar 116
◊ DrawerLayout 160 ◊ ViewPager 145
◊ EditText 68 ◊ меню 110
◊ FloatingActionButton 158 Эмулятор 19
◊ FrameLayout 62