13,99 €
Познакомьтесь с возможностями программирования Android на языке Kotlin! Множество примеров приложений с четкими объяснениями ключевых концепций и API позволят легко разобраться в самых трудных задачах. Эта книга посвящена прикладным методам разработки приложений на Kotlin, и подойдет для всех версий Android от 5.0 (Lollipop) до 8.1 (Oreo) и выше. Используйте Android Studio для создания приложений, чтобы проверять код на каждом этапе, интегрировать его с другими приложениями, работать с изображениями, воспроизводить аудио и делать многое другое. Каждая глава продумана (и протестирована) так, чтобы вы смогли получить максимум опыта и знания, необходимые для разработки под Android.
Das E-Book können Sie in Legimi-Apps oder einer beliebigen App lesen, die das folgende Format unterstützen:
Seitenzahl: 615
Veröffentlichungsjahr: 2023
Переводчик С. Черников
Художник В. Мостипан
Корректоры М. Молчанова (Котова), Г. Шкатова
Билл Филлипс, Крис Стюарт, Кристин Марсикано, Брайан Гарднер
Android. Программирование для профессионалов. 4-е издание. — СПб.: Питер, 2020.
ISBN 978-5-4461-1657-7
© ООО Издательство "Питер", 2020
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
Посвящается Филу, Ною и Сэму за их любовь и поддержку на протяжении работы над всеми изданиями этой книги.
К. М.
Посвящается моей жене Карли за поддержку во всех начинаниях и за напоминание о том, что действительно важно.
Б. Г.
Посвящается старому проигрывателю на моем рабочем столе. Благодарю тебя за то, что ты был со мной все это время. Обещаю скоро купить тебе новую иглу.
Б. Ф.
Посвящается моему отцу Дэвиду, научившему меня тому, как важно упорно работать, и моей матери Лизе, которая требовала, чтобы я всегда поступал правильно.
К. С.
В четвертом издании книги мы скажем то же, что и всегда: книги создаются не только авторами. Своим существованием они обязаны многочисленным помощникам и коллегам, без которых мы не смогли бы представить и написать весь этот материал.
• Спасибо Брайану Харди (Brian Hardy), которому вместе с Биллом Филлипсом (Bill Phillips) хватило смелости воплотить в реальность самое первое издание этой книги. Начав с нуля, Брайан и Билл сделали замечательный проект.
• Спасибо Эрику Максвеллу (Eric Maxwell), который в одиночку написал раздел «Для любознательных» о внедрении зависимостей, за улучшение информирования по нашим каналам, а также за исправление многочисленных замечаний редакторов на некоторых страницах этой книги.
• Спасибо Дэвиду Гринхалгу (David Greenhalgh) и Джошу Скину (Josh Skeen) за их бесценный опыт, пригодившийся нам, когда мы «котлинизировали» эту книгу и узнавали, как стать разработчиками Android в мире Kotlin.
• Спасибо Джереми Шерману (Jeremy Sherman) за его неожиданные познания в Android, пригодившиеся как раз тогда, когда это было нужно больше всего. Спасибо, Джереми, за ваши подробные и вдумчивые обзоры, а также за то, что позволили нам процитировать вас в одном из разделов.
• Спасибо Брайану Линдси (Bryan Lindsey), нашему эксперту по LiveData (и многим другим вопросам, связанным с Android). Спасибо за особое внимание, которое вы уделили приложениям BeatBox и PhotoGallery.
• Спасибо Эндрю Бейли (Andrew Bailey), лучшему воплощению интеллигенции на свете, за то, что много раз выслушивал и помогал нам принимать непростые концептуальные решения. Также спасибо за помощь в добавлении обновлений Oreo в нашу книгу.
• Спасибо Джейми Ли (Jamie Lee), нашему экстраординарному стажеру-разработчику-редактору. Спасибо за редактирование иллюстраций, обзор решений и внесение замечаний. Ваше внимание к деталям бесценно и уникально.
• Спасибо Эндрю Маршаллу (Andrew Marshall) за активное содействие в улучшении книги, за быстрое создание одного из наших классов, а также за быстрое включение в процесс и помощь в редактировании иллюстраций.
• Спасибо Заку Саймону (Zack Simon), нашему фантастически талантливому дизайнеру с вкрадчивым голосом, который украсил изящную шпаргалку, приложенную к этой книге. Если вам она понравится, вы должны найти Зака и сообщить ему об этом. А мы от себя поблагодарим Зака прямо здесь: спасибо, Зак!
• Спасибо нашему редактору Элизабет Холадей (Elizabeth Holaday). Легендарный битник Уильям Берроуз порой писал так: нарезал рукопись на фрагменты, подбрасывал в воздух и складывал их так, как они упали. Если бы не Элизабет, мы бы тоже скатились до таких методов, отчасти от путаницы, отчасти от простодушного воодушевления. Благодарим за то, что внесла в нашу работу точность и ясность и помогла сфокусироваться.
• Спасибо Элли Фолькхаузен (Ellie Volckhausen) за дизайн обложки этой книги.
• Анна Бентли (Anna Bentley) — наш замечательный редактор и корректор. Спасибо за то, что отшлифовали текст этой книги.
• Крис Лопер (Chris Loper) из IntelligentEnglish.com сверстал и подготовил печатную и электронную версии книги. Его инструментарий DocBook также существенно упростил нашу жизнь.
• Спасибо Аарону Хиллегасу (Aaron Hillegass), Стейси Генри (Stacy Henry) и Эмили Герман (Emily Herman). С практической точки зрения было бы невозможно проделать всю эту работу без Big Nerd Ranch, компании Аарона под бесстрашным руководством Стейси и Эмили в роли исполнительного и операционного директоров. Благодарим вас!
Остается лишь поблагодарить наших студентов. Между нами существует обратная связь: мы преподаем материал, они высказывают свое мнение. Без этой обратной связи книга не появилась бы на свет и не была бы переиздана. Если книги Big Nerd Ranch действительно отличаются от других (как мы надеемся), то именно благодаря этой обратной связи. Спасибо вам!
Начинающему программисту Android предстоит основательно потрудиться. Изучать Android — все равно что жить в другой стране: даже если вы говорите на местном языке, на первых порах вы все равно не чувствуете себя как дома. Такое впечатление, что все окружающие понимают что-то такое, чего вы еще не усвоили. И даже то, что уже известно, в новом контексте оказывается попросту неправильным.
У Android существует определенная культура. Носители этой культуры общаются на Kotlin или Java (или сразу на обоих), но знать Kotlin или Java недостаточно. Чтобы понять Android, необходимо изучить много новых идей и приемов. Когда оказываешься в незнакомой местности, полезно иметь под рукой путеводитель.
Здесь на помощь приходим мы.
Мы, сотрудники Big Nerd Ranch, считаем, что каждый программист Android должен:
• писать приложения для Android;
• понимать, что он пишет.
Эта книга поможет вам в достижении обеих целей. Мы обучали тысячи профессиональных программистов Android. Мы проведем вас по пути разработки нескольких Android-приложений, описывая новые концепции и приемы по мере надобности. Если на пути нам встретятся какие-то трудности, если что-то покажется слишком сложным или нелогичным, мы постараемся объяснить, почему все именно так и не иначе.
Такой подход позволит вам с ходу применить полученные сведения, вместо того чтобы, накопив массу теоретических знаний, разбираться, как же их использовать на практике. Перевернув последнюю страницу, вы будете обладать опытом, необходимым для дальнейшей работы в качестве Android-разработчика.
Для работы с этой книгой читатель должен быть знаком с языком Kotlin, включая такие концепции, как классы и объекты, интерфейсы, слушатели, пакеты, внутренние классы, анонимные внутренние классы и обобщенные классы.
Без знания этих концепций вы почувствуете себя в джунглях начиная со второй страницы. Лучше начните с вводного учебника по Kotlin и вернитесь к этой книге после его прочтения. Сегодня существует много превосходных книг для начинающих; подберите нужный вариант в зависимости от своего опыта программирования и стиля обучения. Мы рекомендуем книгу Kotlin Programming: The Big Nerd Ranch Guide1.
Если вы хорошо разбираетесь в концепциях объектно-ориентированного программирования, но успели малость подзабыть Kotlin, скорее всего, все будет нормально. Мы приводим краткие напоминания о некоторых специфических возможностях Kotlin (таких как интерфейсы и анонимные внутренние классы). Держите учебник по Kotlin наготове на случай, если вам понадобится дополнительная информация во время чтения.
В этом издании мы провели капитальный ремонт и изменили буквально каждую главу. Самое большое изменение заключается в том, что программы теперь написаны на Kotlin, а не на Java. Поэтому неофициальным рабочим названием этого издания было «Android 4K».
Еще одно радикальное изменение — включение библиотек компонентов Android Jetpack. Теперь мы используем Jetpack-библиотеки (их еще называют AndroidX) вместо Support Library. Кроме того, мы включили новые API Jetpack, где это было уместно. Например, мы используем ViewModel для сохранения состояния пользовательского интерфейса при вращении. Мы используем Room и LiveData для реализации базы данных и запросов данных из нее. А для планирования фоновой работы мы используем WorkManager. И это лишь часть нововведений. В этой книге компоненты Jetpack в той или иной мере вплетены во все проекты.
Чтобы сфокусироваться на том, как разрабатываются современные приложения для Android, в этой книге используются библиотеки сторонних разработчиков, а не только API в пределах данного фреймворка или Jetpack. Один из примеров — отказ от HttpURLConnection и других сетевых API нижнего уровня в пользу использования Retrofit и его зависимых библиотек. Мы тем самым сильно отходим от наших предыдущих книг, но считаем, что такой подход подготовит вас к погружению в профессиональную разработку приложений после прочтения нашей книги. Выбранные библиотеки мы используем в повседневной жизни, разрабатывая приложения на Android для наших клиентов.
Официальная поддержка языка Kotlin для разработки под Android была объявлена на Google I/O в 2017 году. До этого существовало небольшое движение разработчиков Android, использующих Kotlin, несмотря на отсутствие официальной поддержки. С 2017 года Kotlin получил широкое распространение, и сегодня это наиболее предпочтительный язык для разработчиков на Android. Мы в Big Nerd Ranch используем Kotlin во всех наших проектах по разработке приложений, даже для старых проектов, которые в основном написаны на Java.
Взлеты и падения Kotlin весьма заметны. Команда разработчиков фреймворка Android начала добавлять в код старой платформы аннотации @nullable. Они также выпускают все больше и больше расширений Kotlin для Android. На момент написания этого абзаца Google уже добавляет примеры Kotlin в официальную документацию Android.
Фреймворк Android был первоначально написан на Java. Это означает, что большинство классов Android, с которыми вы взаимодействуете, — это классы Java. К счастью, Kotlin совместим с Java, поэтому проблем с этим не возникнет.
Листинги API мы тоже приводим на Kotlin, даже если внутри они реализованы на Java. Вы можете посмотреть листинги Java API, найдя интересующий вас класс на странице developer.android.com/reference.
Будь вы фанат Kotlin или Java, эта книга научит вас, как писать приложения для Android. Знания и опыт, полученные при разработке приложений для платформы Android, отлично транслируются на любой язык.
Эта книга не справочник. Мы старались помочь в преодолении начального барьера, чтобы вы могли извлечь максимум пользы из существующих справочников и пособий. Книга основана на материалах пятидневного учебного курса в Big Nerd Ranch. Соответственно предполагается, что вы будете читать ее с самого начала. Каждая глава базируется на предшествующем материале, и пропускать главы не рекомендуется.
На наших занятиях студенты прорабатывают эти материалы, но в обучении также важно и другое — ваш настрой и обстановка.
Желательно, чтобы ваша учебная среда была похожа на нашу. В частности, стоит хорошенько высыпаться и найти спокойное место для работы. Следующие факторы тоже сыграют положительную роль:
• Создайте учебную группу с друзьями или коллегами.
• Выделяйте время, когда вы будете заниматься исключительно чтением книги.
• Примите участие в работе форума книги на сайте forums.bignerdranch.com.
• Найдите специалиста по Android, который поможет вам в трудный момент.
В этой книге мы напишем семь приложений для Android. Два приложения очень просты, и на их создание уходит всего одна глава. Другие приложения часто оказываются более сложными, а самое длинное приложение занимает 11 глав. Все приложения спроектированы так, чтобы продемонстрировать важные концепции и приемы и дать опыт их практического применения.
GeoQuiz
В первом приложении мы исследуем основные принципы создания проектов Android, activity, макеты и явные интенты. Вы также научитесь без проблем работать с конфигурацией.
CriminalIntent
Самое большое приложение в книге предназначено для хранения информации о проступках ваших коллег по офису. Вы научитесь использовать фрагменты, интерфейсы «главное-детализированное представление», списковые интерфейсы, меню, камеру, неявные интенты и многое другое.
BeatBox
Наведите ужас на своих врагов и узнайте больше о фрагментах, воспроизведении мультимедийного контента, архитектуре MVVM, связывании данных, тестировании, темах и графических объектах.
NerdLauncher
Нестандартный лаунчер раскроет тонкости работы системы интентов, процессов и задач.
PhotoGallery
Клиент Flickr для загрузки и отображения фотографий из общедоступной базы Flickr. Приложение демонстрирует работу со службами, многопоточное программирование, обращения к веб-службам и т.д.
DragAndDraw
В этом простом графическом приложении рассматривается обработка событий касания и создание нестандартных представлений.
Sunset
В этом крохотном приложении вы создадите красивое представление заката над водой, а заодно освоите тонкости анимации.
Многие главы завершаются разделом с упражнениями. Это ваша возможность применить полученные знания, покопаться в документации и отработать навыки самостоятельного решения задач.
Мы настоятельно рекомендуем выполнять упражнения. Сойдя с проторенного пути и найдя собственный способ, вы закрепите учебный материал и приобретете уверенность в работе над собственными проектами.
Если же окажетесь в тупике, вы всегда сможете обратиться за помощью на форум forums.bignerdranch.com.
В конце многих глав также имеется раздел «Для любознательных». В нем приводятся углубленные объяснения или дополнительная информация по темам, представленным в главах. Содержимое этих разделов читать необязательно, но мы надеемся, что оно покажется вам интересным и полезным.
Все листинги с кодом и разметкой XML напечатаны моноширинным шрифтом. Код или разметка XML, которые вы должны ввести, выделяются жирным шрифтом. Код или разметка XML, которые нужно удалить, зачеркиваются. Например, в следующей реализации функции вызов Toast.makeText(...).show() удаляется, а вместо него добавляется вызов checkAnswer(true).
trueButton.setOnClickListener { view: View ->
Toast.makeText(
this,
R.string.correct_toast,
Toast.LENGTH_SHORT
)
.show()
checkAnswer(true)
}
Мы будем говорить о версиях Android, широко используемых на момент написания книги. Для данного издания это версии Android 5.0 (Lollipop, API уровня 21) — Android 9.0 (Pie, API уровня 28). Несмотря на то что более старые версии все еще используются, нам кажется, что усилия, требуемые для поддержки этих версий, того не стоят.
Если вы хотите получить информацию о поддержке версий Android ранее 5.0, вы можете почитать предыдущие издания этой книги. Третье издание было нацелено на Android 4.4 и выше, второе — на Android 4.1 и выше, а первое — на Android 2.3 и выше.
Даже после выхода новых версий Android приемы, изложенные в книге, будут работать благодаря политике обратной совместимости Android (подробности см. в главе 7). На сайте forums.bignerdranch.com будет публиковаться информация об изменениях, а также комментарии по поводу использования материала книги с последними версиями.
Если вам понравилась книга, ознакомьтесь с другими книгами издательства «Питер» по адресу www.piter.com. На веб-сайте издательства вы найдете подробную информацию о наших книгах.
Ваши замечания, предложения, вопросы отправляйте по адресу электронной почты [email protected] (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
1 Скин Джош, Гринхол Дэвид. Kotlin. Программирование для профессионалов. — СПб.: Питер, 2020. — 464 с.: ил. — Примеч. ред.
Прежде всего вам понадобится Android Studio — интегрированная среда разработки для Android-программирования, созданная на базе популярной среды IntelliJ IDEA.
Установка Android Studio включает в себя:
Android SDK
последнюю версию Android SDK.
Инструменты и платформенные средства Android SDK
средства отладки и тестирования приложений.
Образ системы для эмулятора Android,
который позволяет создавать и тестировать приложения на различных виртуальных устройствах.
На момент написания книги среда Android Studio находилась в активной разработке и часто обновлялась. Учтите, что ваша версия Android Studio может отличаться от описанной в книге. За информацией об отличиях обращайтесь на сайт forums.bignerdranch.com.
Пакет Android Studio доступен на сайте разработчиков Android по адресу developer.android.com/studio.
Возможно, вам также придется установить пакет Java Development Kit (JDK8), если он еще не установлен в вашей системе; его можно загрузить на сайте www.oracle.com.
Если у вас все равно остаются проблемы, обратитесь по адресу developer.android.com/studio за дополнительной информацией.
Android Studio предоставляет SDK и образ эмулируемой системы для последней платформы. Однако не исключено, что вы захотите протестировать свои приложения в более ранних версиях Android.
Компоненты любой платформы можно получить при помощи инструмента Android SDK Manager. В Android Studio выполните команду Tools⇒SDKManager. (Меню Tools отображается только при наличии открытого проекта. Если вы еще не создали проект, SDK Manager также можно вызвать из окна AndroidWelcome; в разделе QuickStart выберите вариант Configure⇒SDKManager, как показано на рис. 1.)
Рис. 1. Android SDK Manager
Выберите и установите каждую версию Android, которая будет использоваться при тестировании. Учтите, что загрузка этих компонентов может потребовать времени.
Android SDK Manager также используется для загрузки новейших выпусков Android — например, новой платформы или обновленных версий инструментов.
Эмулятор удобен для тестирования приложений. Тем не менее он не заменит реальное устройство на базе Android для оценки быстродействия. Если у вас имеется физическое устройство, мы рекомендуем время от времени использовать его в ходе работы с книгой.
В этой главе мы обновим приложение GeoQuiz и включим в него дополнительные вопросы (рис. 2.1).
Рис. 2.1. Больше вопросов!
Для этого в проект GeoQuiz будет добавлен класс Question. Экземпляр этого класса инкапсулирует один вопрос с ответом «да/нет».
Затем мы создадим группу объектов Question, с которым будет работать класс MainActivity.
На панели Project щелкните правой кнопкой мыши по пакету com.bignerdranch.android.geoquiz и выберите команду New⇒KotlinFile/Class в контекстном меню. Введите имя класса Question, выберите пункт Class в раскрывающемся списке Kind и нажмите кнопку OK (рис. 2.2).
Рис. 2.2. Создание класса Question
Android Studio создаст файл Question.kt. Добавьте в этот файл две переменные и конструктор.
Листинг 2.1. Добавление класса Question (Question.kt)
class Question {
}
data class Question(@StringRes val textResId: Int, val answer: Boolean)
Класс Question содержит два вида данных: текст вопроса и правильный ответ (да/нет).
Аннотация @StringRes не обязательна, но мы рекомендуем включить ее по двум причинам. Во-первых, аннотация помогает встроенному в Android Studio инспектору кода (под названием Lint) проверить во время компиляции, что в конструкторе используется правильный строковый идентификатор ресурса. Это предотвращает сбои во время выполнения, когда конструктор используется с недействительным идентификатором ресурса (например, если идентификатор указывает не на строку). Во-вторых, аннотация делает ваш код более читаемым для других разработчиков.
Почему textResId — это Int, а не String? Потому что переменная textResId содержит идентификатор (всегда Int) строкового ресурса.
Мы используем ключевое слово data для всех классов моделей в этой книге. Тем самым мы намекаем на то, что класс предназначен для хранения данных. Кроме того, с такими классами компилятор работает дополнительно, например, автоматически определяет такие полезные функции, как equals(), hashCode(), и вводит красивое форматирование через toString().
Класс Question готов. Через некоторое время мы изменим MainActivity для работы с функцией Question. Но сначала давайте посмотрим, как будут вместе работать кусочки GeoQuiz.
Класс MainActivity должен создать список объектов Question. В процессе работы он взаимодействует с TextView и тремя виджетами Button для вывода вопросов и предоставления обратной связи на ответы пользователя. Отношения между этими объектами изображены на рис. 2.3.
Рис. 2.3. Диаграмма объектов GeoQuiz
Вероятно, вы заметили, что объекты на рис. 2.3 разделены на три области: «Модель», «Контроллер» и «Представление». Android-приложения строятся на базе архитектуры, называемой «Модель — Представление — Контроллер», или сокращенно MVC (Model-View-Controller). Согласно канонам MVC, каждый объект приложения должен быть объектом модели, объектом представления или объектом контроллера.
• Объект модели содержит данные приложения и «бизнес-логику». Классы модели обычно проектируются для моделирования сущностей, с которыми имеет дело приложение: пользователь, продукт в магазине, фотография на сервере, вопрос «да/нет» и т.д. Объекты модели ничего не знают о пользовательском интерфейсе; их единственная цель — хранение и управление данными.
В приложениях Android классы моделей обычно создаются разработчиком для конкретной задачи. Все объекты модели в вашем приложении составляют его уровень модели.
Уровень модели GeoQuiz состоит из класса Question.
• Объекты представлений умеют отображать себя на экране и реагировать на ввод пользователя, например касания. Простейшее правило: если вы видите что-то на экране, значит, это представление.
Android дает широкий набор настраиваемых классов представлений. Разработчик также может создавать собственные классы представлений. Объекты представления в приложении образуют уровень представления.
В GeoQuiz уровень представления состоит из виджетов, заполненных по содержимому файла res/layout/activity_main.xml.
• Объекты контроллеров связывают объекты представления и модели; они содержат «логику приложения». Контроллеры реагируют на различные события, инициируемые объектами представлений, и управляют потоками данных между объектами модели и уровнем представления.
В Android контроллер обычно представляется подклассом Activity или Fragment. (Фрагменты рассматриваются в главе 8.)
Уровень контроллера GeoQuiz в настоящее время состоит только из класса MainActivity.
На рис. 2.4 показана логика передачи управления между объектами в ответ на пользовательское событие, такое как нажатие кнопки. Обратите внимание: объекты модели и представления не взаимодействуют друг с другом напрямую; в любом взаимодействии участвуют «посредники» — контроллеры, получающие сообщения от одних объектов и передающие инструкции другим.
Приложение может обрастать функциональностью до тех пор, пока не станет слишком сложным для понимания. Разделение кода на классы упрощает проектирование и понимание приложения в целом; разработчик мыслит в контексте классов, а не отдельных переменных и функций.
Рис. 2.4. Взаимодействия MVC при получении ввода от пользователя
Аналогичным образом разделение классов на уровни модели, представления и контроллера упрощает проектирование и понимание приложения; вы можете мыслить в контексте уровней, а не отдельных классов.
Приложение GeoQuiz нельзя назвать сложным, но преимущества разделения уровней видны и здесь. Вскоре мы обновим уровень представления GeoQuiz и добавим в него кнопку NEXT. При этом нам совершенно не нужно помнить о только что созданном классе Question.