АЛЕКСЕЙ ГОЛОЩАПОВ Android программирование для мобильных устройств АРХИТЕКТУРА ANDROID КОМПОНЕНТЫ ПРИЛОЖЕНИИ ANDROID РАЗРАБОТКА ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА И СЛУЖБ РАБОТА С ДАННЫМИ ГРАФИКА И АНИМАЦИЯ +OCD Алексей Голощапов Google Android программирование для мобильных устройств Санкт-Петербург «БХВ-Петербург» 2011 Голощапов А. Л. Г61 Google Android: программирование для мобильных устройств. — СПб.: БХВ-Петербург, 2011. — 448 c.: ил. + CD-ROM — (Профессиональное программирование) ISBN 978-5-9775-0562-8 Рассмотрена разработка программ для мобильных устройств под управлением операционной системы Google Android. Приведены базовые сведения о платформе Android. Описано программное обеспечение, необходимое для разработки Android-пpилoжeний. Рассмотрены основные компоненты приложений, использование базовых виджетов и виджетов-списков, создание и вызов уведомлений из приложения, работа с файлами, способы хранения и обработки данных, создание служб в Android и др. Показано применение графических ресурсов и создание анимации в приложениях с использованием возможностей Android SDK. На компакт-диске приведены примеры из книги. Для программистов Екатерина Кондукова Игорь Шишигин Гоигорий Добин Владимир Красовский Ольги Сергиенко Зинаида Дмитриева Инны Тачиной Елены Беляевой Николай Тверских УДК 681.3.068 ББК 32.973.26-018.1 Группа подготовки издания: Главный редактор Зам. главного редактора Зав. редакцией Редактор Компьютерная верстка Корректор Дизайн серии Оформление обложки Зав. производством Лицензия ИД № 02429 от 24.07.00. Подписано в печать 27 10.10. Формат 70xl00Vie. Печать офсетная. Усл. печ. л. 36,12. Доп. тираж 2000 экз. Заказ № 546 "БХВ-Петербург", 190005, Санкт-Петербург, Измайловский пр., 29. Санитарно-эпидемиологическое заключение на продукцию № 77.99.60.953.Д.005770.05.09 от 26.05.2009 г. выдано Федеральной службой по надзору в сфере защиты прав потребителей и благополучия человека. Отпечатано с готовых диапозитивов ISBN 978-5-9775-0562-8 в ГУП "Типография "Наука" 199034, Санкт-Петербург, Элиния, 12 © Голощапов А. Л., 2010 УДК 681.3.068 ББК 32.973.26-018.1 Г61 ©Оформление, издательство "БХВ-Петербург", 2010 Оглавление Введение 1 На кого рассчитана эта книга 1 Краткое описание глав 2 Исходные коды примеров 6 Благодарности 6 Глава 1. Базовые сведения о платформе Android 7 1.1. Уровень ядра 7 1.1.1. Драйвер IPC 8 1.1.2. Управление энергопотреблением 9 1.1.3. Драйверы оборудования 9 1.2. Уровень библиотек 10 1.2.1. Системная библиотека libc 10 1.2.2. Менеджер поверхностей 10 1.2.3. Функциональные библиотеки 11 1.3. Среда выполнения 12 1.3.1. Dalvik Virtual Machine 12 1.3.2. Core Libraries 13 1.4. Уровень каркаса приложений 13 1.5. Уровень приложений 14 Глава 2. Среда разработки 15 2.1. Создание среды разработки 15 2.1.1. Системные требования 15 2.1.2. УстановкаЮК 16 2.1.3. Установка Eclipse 17 2.1.4. Установка Android SDK 17 2.1.5. Установка Android Development Tools 18 2.2. Обзор Android SDK 21 2.2.1. Версии SDK и Android API Level 21 2.2.2. Инструменты для разработки и отладки приложений 22 2.2.3. Android Virtual Device 23 Глава 3. Первое приложение для Android 31 3.1. Создание проекта в Eclipse 31 3.2. Структура проекта 35 3.2.1. Каталог ресурсов 36 Подкаталог res/layout/ 37 Подкаталог res/drawable/ 37 Подкаталог res/values/ 37 3.2.2. Файл R.java 38 3.2.3. Файл HelloAndroidActivity.java 39 3.2.4. Файл AndroidManifest.xml 40 Глава 4. Компоненты Android-пpилoжeния 43 4.1. Деятельность 43 4.2. Службы 44 4.3. Приемники широковещательных намерений 44 4.4. Контент-провайдеры 45 4.5. Процессы и потоки 45 4.5.1. Жизненный цикл процессов 45 4.5.2. Приоритет и статус процессов 46 4.6. Жизненный цикл компонентов приложения 48 4.6.1. Активация компонентов 49 4.6.2. Завершение работы компонентов 49 4.7. Файл AndroidManifest.xml 49 4.7.1. Общая структура манифеста 51 52 52 53 53 53 53 54 54 54 54 4.7.2. Структура элемента 55 56 56 56 57 57 57 57 58 58 58 58 59 59 Глава 5. Графический интерфейс пользователя 61 5.1. Деревья представлений 62 5.2. Разметка 62 5.2.1. Объявление в XML 64 5.2.2. ХМЬ-элементы и атрибуты 65 5.3. Инициализация представлений 67 5.4. Стандартные разметки 68 5.4.1. FrameLayout 68 5.4.2. LinearLayout 70 5.4.3. TableLayout 74 5.4.4. RelativeLayout 78 5.5. Отладка интерфейса с помощью Hierarchy Viewer 81 5.5.1. Layout View 82 5.5.2. Pixel Perfect View 83 Глава 6. Базовые виджеты 85 6.1. Текстовые поля 85 6.1.1. TextView 86 6.1.2. EditText 90 6.2. Добавление полос прокрутки 92 6.3. Отображение графики 95 6.4. Обработка событий 97 6.5. Кнопки и флажки 98 6.5.1. Button 99 6.5.2. RadioButton и RadioGroup 106 6.5.3. CheckBox 109 6.5.4. ToggleButton 112 6.5.5. ImageButton 115 6.6. Закладки 117 6.7. Индикаторы и слайдеры 120 6.7.1. ProgressBar 121 6.7.2. SeekBar 125 6.7.3. RatingBar 129 6.8. Компоненты отображения времени 133 6.%A.AnalogClock и DigitalClock 134 6.8.2. Chronometer 135 Глава 7. Виджеты-списки и привязка данных 139 7.1. Адаптеры данных 139 7.2. Текстовые поля с автозаполнением 140 7.2.1. AutoCompleteTextView 140 7.2.2. MultiAutoCompleteTextView 143 7.3. Отображение данных в списках 146 13A.ListView 147 7.3.2. Spinner 149 7.3.3. GridView 153 7.4. Отображение графики в списках 157 7.4.1. Отображение графики в GridView 157 7.4.2. Gallery 161 7.4.3. SlidingDrawer 164 7.5. Создание списка с собственной разметкой 170 Глава 8. Уведомления 175 8.1. Всплывающие уведомления 175 8.2. Создание собственных всплывающих уведомлений 179 8.3. Уведомления в строке состояния 182 8.4. Создание собственных уведомлений для строки состояния 187 Глава 9. Диалоговые окна 191 9.1. Создание диалоговых окон 192 9.2. AlertDialog 193 9.2.1. AlertDialog с кнопками 193 9.2.2. AlertDialog со списком 197 9.2.3. AlertDialog с радиокнопками 200 9.2.4. AlertDialog с флажками 203 9.3. ProgressDialog 206 9.4. DatePickerDialog 211 9.5. TimePickerDialog 216 9.6. Создание собственных диалогов 219 Глава 10. Меню 225 10.1. Меню выбора опций 226 10.1.1. Меню со значками 230 10.1.2. Расширенное меню 233 10.2. Контекстное меню 237 10.3. Подменю 240 10.4. Добавление флажков и переключателей в меню 244 Глава 11. Управление деятельностями 249 11.1. Жизненный цикл деятельности 249 11.1.1. Сохранение состояния деятельности 253 11.1.2. Стек деятельностей 254 11.2. Намерения 254 11.3. Группы намерений 257 11.4. Запуск деятельностей и обмен данными между деятельностями 257 11.5. Фильтры намерений и запуск заданий 271 Глава 12. Службы 275 12.1. Жизненный цикл служб 275 12.2. Создание службы 277 Глава 13. Приемники широковещательных намерений 285 13.1. Жизненный цикл приемников широковещательных намерений 286 13.2. Приемники системных событий 287 13.3. Использование широковещательных намерений 288 13.3.1. Передача событий через намерения 288 13.3.2. Прослушивание событий приемниками широковещательных намерений 289 13.3.3. Пример приложения-приемника намерений 290 13.3.4. Пример приложения-передатчика намерений 292 Глава 14. Работа с файлами и сохранение пользовательских настроек 295 14.1. Чтение и запись файлов 295 14.2. Предпочтения 301 14.2.1. Использование предпочтений 302 14.2.2. CheckBoxPreference 303 14.2.3. EditTextPreference 310 14.2.4. ListPreference 312 14.2.5. RingtonePreference 315 14.2.6. PreferenceCategory 316 14.2.7. PreferenceScreen 317 Глава 15. База данных SQLite и контент-провайдеры 323 15.1. База данных SQLite 323 15.1.1. Создание базы данных: класс SQLiteOpenHelper 323 15.1.2. Управление базой данных: класс SQLiteDatabase 325 15.2. Контент-провайдеры 326 15.2.1. Модель данных 327 15.2.2. URI 327 15.3. Создание контент-провайдера 328 15.3.1. Расширение класса ContentProvider 329 15.3.2. Декларирование контент-провайдера в файле манифеста 331 15.4. Запросы к контент-провайдеру 331 15.4.1. Чтение возвращаемых значений 332 15.4.2. Позиционирование курсора 333 15.4.3. Добавление записей 334 15.4.4. Изменение записи 334 15.4.5. Удаление записей 334 15.5. Практическое приложение для работы с базой данных 335 Глава 16. Ресурсы, активы и локализация приложений 349 16.1. Доступные типы ресурсов 349 16.2. Создание ресурсов 350 16.3. Ссылки на ресурсы 351 16.4. Использование ресурсов в коде программы 352 16.4.1. Загрузка простых типов из ресурсов 353 16.4.2. Загрузка файлов произвольного типа 358 16.4.3. Создание меню в XML 360 16.4.4. Загрузка ХМЬ-документов 364 16.5. Стили и темы 368 16.5.1. Стили 368 16.5.2. Темы 369 16.5.3. Определение собственных стилей и тем 370 16.6. Активы 373 16.7. Локализация приложений 377 16.7.1. Ресурсы, заданные по умолчанию 377 16.7.2. Создание локализованных ресурсов 378 Глава 17. Графика 381 17.1. Объект Drawable 381 17.2. Создание объектов Drawable в коде программы 383 17.2.1. Класс TransitionDrawable 384 17.2.2. Класс ShapeDrawable 386 17.3. Рисование на канве 393 Глава 18. Создание анимации 401 18.1. Анимация преобразований 401 18.1.1. Создание анимации в ХМЬ-файле 402 Общие атрибуты 403 Элемент 404 Элемент 404 Элемент 404 Элемент 405 Элемент 405 18.1.2. Анимация графических примитивов 405 18.1.3. Анимация графических файлов 413 18.1.4. Анимация группы представлений 417 18.2. Кадровая анимация 421 18.2.1. Создание кадровой анимации в XML 422 18.2.2. Создание анимации в коде программы 425 Приложение. Описание компакт-диска и установка примеров 429 Описание компакт-диска 429 Установка примеров 429 Предметный указатель 433 Введение На момент написания этой книги платформа Google Android уже представляет собой заметное явление в области программного обеспечения для мобильных устройств. Новой платформой заинтересовались ведущие мировые производители мобильной электроники и сотовые операторы, а некоторые из них уже выпустили на рынок устройства, работающие под управлением Android. В чем же заключается уникальность платформы Android? Основная идея Google состоит в том, что компания предлагает в открытый доступ исходные коды своей операционной системы, предлагает набор удобных инструментов для разработки и хорошо документированное SDK, что должно со временем привести к появлению большого количества программного обеспечения для этой платформы. В дальнейшем у Android есть все шансы стать самым успешным проектом для мобильных телефонов. Аналитики и эксперты ИТ-рынка прогнозируют для платформы Google Android хорошие коммерческие перспективы. Android захватывает рынок мобильных телефонов, постепенно вытесняя с него общепризнанных лидеров. Google Android устанавливается не только на смартфоны, данная платформа подходит и для нетбуков. Еще одним шагом в развитии Google Android стало открытие в октябре 2008 года онлайн-магазина приложений — Android Market, в котором можно приобрести программы и другой софт для устройств на базе новой платформы. Кроме того, теперь для разработчиков программного обеспечения появилась возможность брать плату за свои приложения в Android Market, что делает разработку приложений под эту платформу еще более привлекательной. На кого рассчитана эта книга Поскольку эта книга о программировании приложений для мобильных устройств на платформе Android, необходимое условие для работы с книгой — наличие базовых навыков программирования на языке Java, который нужен для написания приложений с использованием Android SDK. Для тех читателей, которые не работали до этого момента на Java, но использовали другие объектно-ориентированные языки (типа C#.NET), переход на платформу Android также не вызовет больших затруднений. Сила Android и особенности программирования приложений для этой платформы заключены в АР1-библиотеках, которые предоставляет Android SDK. Таким образом, отсутствие опыта программирования в Java не будет большим недостатком при работе с книгой и освоении платформы Android. Необходимые навыки для программирования на Java можно приобретать постепенно, параллельно с изучением платформы Android. В целом эта книга предназначена для двух разных групп программистов: ? традиционных разработчиков программного обеспечения, которые имеют опыт работы на языках Java или C#.NET и желают перейти на разработку приложений для мобильных телефонов на базе ОС Android; ? разработчиков, уже имеющих опыт программирования мобильных устройств на iPhone, Windows Mobile, Symbian и JavaME, которые хотят программировать на платформе Android. Желательно, чтобы эта книга была полезной и ценной любому человеку, заинтересованному в разработке приложений для Android. Люди, увлеченные программированием, найдут здесь основу для своих будущих приложений. Прикладные программисты изучат основные функциональные возможности платформы, которые смогут использовать в своих профессиональных разработках. Короче говоря, эта книга содержит много информации, которая пригодится вам независимо от вашего опыта и профессиональных интересов. Краткое описание глав Книга состоит из 18 глав и одного приложения. Далее приводится краткое описание каждой из глав. ? Глава 1. Базовые сведения о платформе Android Описывается архитектура и программный интерфейс операционной системы Android. Приводится информация о составе и функциональных возможностях библиотек Android, базовых классах и интерфейсах, входящих в состав библиотек и пакетов Android SDK. Дается понятие программного стека Android, принципы работы Dalvik Virtual Machine. ? Глава 2. Среда разработки Глава посвящена установке на компьютер необходимого программного обеспечения, требуемого для разработки приложений под Android: Java Development Kit, Eclipse, Android SDK, Android Development Tools, и настройке среды разработки для написания программ для Android. Описывается инструментарий, входящий в состав Android SDK, — различные инструменты для отладки, компоновки, упаковки и инсталляции ваших приложений на эмулятор и мобильное устройство. Приводятся инструкции по конфигурации и работе с Android Virtual Device — эмулятором мобильного устройства. ? Глава 3. Первое приложение для Android Рассматривается создание первой программы под Android, запуск и работа программы в эмуляторе мобильного устройства. Будет детально изучена структура проекта, содержимое файлов проекта и работа с ними в интегрированной среде разработки Eclipse. ? Глава 4. Компоненты Android-npmooH:eHWi Приводятся базовые понятия об основных компонентах Android- приложений — деятельности, службах, приемниках широковещательных намерений и контент-провайдерах. Рассматривается внутренняя архитектура файла манифеста Android-пpилoжeния, который предоставляет основную информацию о компонентах приложения и разрешениях системе. ? Глава 5. Графический интерфейс пользователя Эта глава дает базовые понятия о графическом интерфейсе Android и знакомит с принципами экранной иерархии элементов графического интерфейса— представлениях игруппах представлений. Рассматриваются вопросы компоновки экранных элементов и создания разметки для окон приложений, которые читатель будет разрабатывать и использовать в следующих главах для создания профессионального пользовательского интерфейса в своих приложениях. ? Глава 6. Базовые виджеты Глава знакомит читателя с различными элементами графического интерфейса пользователя (виджетами). Виджеты в Android — это кнопки, флажки, радиокнопки, списки, сетки, элементы управления датой и временем и многие другие элементы. Приводятся примеры по созданию и использованию виджетов в приложениях для Android. ? Глава 7. Виджеты-списки и привязка данных Рассматриваются виджеты-списки, отображающие текстовую и графическую информацию, которая может быть связана с внутренним или внешним источником данных, и адаптеры данных— компоненты-посредники между набором данных и элементом пользовательского интерфейса для их отображения. ? Глава 8. Уведомленш Рассматривается создание и вызов уведомлений из приложения. При работе пользователя с приложением могут возникать различные ситуации, о которых необходимо уведомить пользователя. Некоторые ситуации требуют, чтобы пользователь обязательно среагировал на них, другие не требуют реакции и выполняют чисто информативную функцию. Читатель познакомится с созданием механизма оповещения пользователя приложения. Будут рассмотрены различные типы уведомлений — всплывающие уведомления и уведомления в строке состояния. ? Глава 9. Диалоговые окна В данной главе рассказывается о создании и использовании диалоговых окон для Android. Диалоги обычно используются для сообщений и коротких действий, которые непосредственно касаются событий, возникающих в процессе работы приложения. Помимо использования стандартных диалогов читатель научится разрабатывать собственный дизайн диалоговых окон. ? Глава 10. Меню Android SDK предлагает обширную поддержку меню в приложениях. Читатель научится работать с несколькими типами меню, поддерживаемых Android, включая контекстные меню, меню с иконками, всплывающие меню и альтернативные меню, и встраивать меню в свои приложения. ? ГлаваП. Управлениедеятелъностями Рассматривается управление и взаимодействие деятельностей— окон приложения. Дается представление ожизненном цикле деятельностей в Android-пpилoжeнии и стеке деятельностей. Обсуждаются способы обмена данными между деятельностями. Также рассматривается одна из интересных функциональностей Android — намерения. Смысл использования намерений — обеспечить динамическое связывание между компонентами приложений. Вместо статического соединения программного кода в Android используется система обмена сообщениями, которая выполняет позднее связывание. ? Глава 12. Службы Рассматривается создание служб в Android. Служба— это компонент приложения, который позволяет работать ему в фоновом режиме без использования интерфейса пользователя. Читатель научится создавать службы и управлять ими. ? Глава 13. Приемники широковещательных намерений Эта глава научит созданию приемников широковещательных намерений (Broadcast Receiver). Приемник широковещательных намерений используется, когда возникает необходимость в том, чтобы ваше приложение или служба реагировала на внешние события, которые могут инициализировать другие приложения и службы. ? Глава 14. Работа с файлами и сохранение пользовательских настроек Рассматривается механизм предпочтений — сохранение пользовательских настроек приложения, а также чтение и запись файлов и управление файловым вводом-выводом из приложения. ? Глава 15. База данных SQLite и контент-провайдеры Сохранение и загрузка данных — необходимое требование для большинства приложений. В данной главе будут рассмотрены способы хранения и обработки данных, доступные в Android, — файлы и база данных SQLite. Контент-провайдеры служат удобным механизмом для сохранения и обмена данными между приложениями. В этой главе читатель научится создавать базы данных и работать с ними из приложения, а также создавать контент-провайдеры, добавлять, удалять и модифицировать данные любых других приложений (если они предоставляют соответствующие разрешения) из своего приложения. ? Глава 16. Ресурсы, активы илокализация приложений Рассматривается работа с файлами ресурсов и активами и использование их в своих приложениях. Ресурсы и активы — это неотъемлемая часть любого Android-пpилoжeния. Читатель научится загружать в разрабатываемую программу изображения, строки, разметки, стили, темы, XML- документы и т. д. Android-пpилoжeниe может работать на многих устройствах во многих регионах. Ваше приложение должно соответствовать настройкам и языкам того региона, где оно будет использоваться. ? Глава 17. Графика Обсуждаются различные варианты использования графических ресурсов в Android-пpилoжeнии. Рассматриваются вопросы рисования графики на канве представления, загрузка графики из ресурсов или ХМЬ-документов для создания визуально привлекательных интерфейсов. Примеры приложений в этой главе показывают использование нашей собственной графики и анимации в приложениях с применением АР1-библиотек для работы с графикой. ? Глава 18. Создание анимации Рассматривается создание анимации в приложениях для разработки визуально привлекательных приложений для Android с использованием возможностей Android SDK, который предоставляет двумерную графическую библиотеку анимации на канве и представлениях. Исходные коды примеров На прилагаемом диске находятся все исходные коды примеров, приведенных в книге. Установка примеров описана в приложении. Все примеры используют функциональность Android SDK версии 2.0 или ниже и скомпилированы в среде Eclipse. Установка и настройка среды разработки подробно описана в главе 2. Книга содержит полные исходные коды всех программ, однако некоторые листинги для экономии места и во избежание ненужного дублирования информации содержат только изменения программного кода относительно предыдущих листингов. Такое сокращение позволяет не только экономить место, но и улучшить понимание программного кода, делая акцент только на новой функциональности. На диске также находятся файлы ресурсов — графика, иконки, шрифты, используемые в примерах приложений, приведенных в книге. Благодарности В первую очередь хочу поблагодарить своих родных и близких за оказанную моральную поддержку в процессе написания этой книги. Отдельная благодарность заместителю главного редактора Игорю Владимировичу Шишигину и всем сотрудникам издательства "БХВ-Петербург", которые помогали мне в создании этой книги. ГЛАВА 1 Базовые сведения о платформе Android Перед тем как приступить к разработке приложений для Android, хотелось бы вкратце познакомить читателя с архитектурой системы и основными особенностями этой платформы. Система Android — это программный стек для мобильных устройств, который включает операционную систему, программное обеспечение промежуточного слоя (middleware), а также основные пользовательские приложения (е-таП-клиент, календарь, карты, браузер, контакты и др.). Архитектуру Android принято делить на четыре уровня: ? уровень ядра; ? уровень библиотек и среды выполнения; ? уровень каркаса приложений; ? уровень приложений. На рис. l.l показаны основные компоненты операционной системы Android и их взаимодействие между собой. 1.1. Уровень ядра Ядро является слоем абстракции между оборудованием и остальной частью программного стека. На этом уровне располагаются основные службы типа управления процессами, распределения памяти и управления файловой системой. Ядро Android основано на ядре Linux версии 2.6, но сама система Android не является Ьтих-системой в чистом виде, имеет некоторые отличия и содержит дополнительные расширения ядра, специфичные для Android, — свои механизмы распределения памяти, взаимодействие между процессами и др. Приложения Телефон Главный экран Контакты Браузер Приложения _- Каркас приложений Система представлений Контент- провайдер Менеджер деятельностей Менеджер окон Менеджер пакетов Менеджер телефонии Менеджер ресурсов Менеджер расположения Менеджер уведомлений Библиотеки Среда выполнения Менеджер поверхностей OpenGL ES (ЗР-графика) База данных SQLite Мультимедиа Библиотеки ядра Шрифты WebKit Виртуальная машина Dalvik Системная библиотека SGL (2й-графика) SSL т Ядро Linux Драйвер дисплея . ивВ-драйвер Драйвер камеры МРндрайвер Драйвер флэш- памяти Драйверы звука Драйвер межпроцессного взаимодействия Менеджер управления энергопотреблением Рис. 1.1.Архитектура системы Android Основные компоненты уровня ядра: ? драйвер межпроцессного взаимодействия (IPC Driver); ? драйвер управления питанием (Android Power Management); ? набор драйверов для оборудования, входящего в состав мобильного устройства. Рассмотрим теперь кратко основные компоненты ядра Android. 1.1.1. Драйвер IPC Приложения и службы могут работать в защищенных отдельных процессах, которые должны общаться между собой и иметь доступ к общим данным. Платформа Android обеспечивает механизм IPC (Inter-process Communi- cation), который является основным механизмом взаимодействия между процессами. Драйвер IPC обеспечивает следующую функциональность: ? взаимодействие процессов; ? создание и обработку пулов потоков в процессах; ? подсчет и отображение ссылок на объекты в других процессах; ? синхронные запросы между процессами. 1.1.2. Управление энергопотреблением Система управления энергопотреблением (Android Power Management) разработана на основе стандартного драйвера управления питанием Linux, но оптимизирована для мобильных устройств с учетом их специфических особенностей. Основная функция системы управления энергопотреблением — экономное использование батареи мобильного устройства. Драйвер переводит системы в "спящий режим" с минимальным потреблением мощности процессором, если приложения и службы не используются. 1.1.3. Драйверы оборудования Программный стек Android разработан с учетом необходимой гибкости, включая работу со многими дополнительными компонентами, имеющимися в мобильных устройствах. Эти компоненты в значительной степени полагаются на доступность определенных аппаратных средств на данном устройстве. Они предоставляют дополнительную функциональность для мобильных уст- ройств (сенсорный экран, камера, GPS, акселерометр и т. д.). Встроенные драйверы включают в себя поддержку работы с оборудованием мобильного устройства. Набор драйверов может быть различным в зависимости от производителя и модели устройства. Поскольку новое вспомогательное оборудование для мобильных устройств постоянно появляется на рынке, драйверы для них должны быть написаны на уровне ядра Linux для обеспечения поддержки оборудования, также как и для настольных Ыпих-систем. Преимущество использования ядра Linux как основы Android в том, что ядро системы позволяет верхним уровням программного стека оставаться неизменными, несмотря на различия в используемом оборудовании. Конечно, хорошая практика программирования требует, чтобы пользовательские приложения корректно завершали свою работу в случае вызова ресурса, являющегося недоступным, например камеры, не присутствующей в данной модели смартфона. 1.2. Уровень библиотек Следующий уровень над ядром Linux является набором библиотек С/С++ типа OpenGL, WebKit, FreeType, SSL, библиотеки поддержки libc, базы данных SQLite и мультимедиабиблиотек (Media Framework). Системная библиотека базируется на Berkeley Software Distribution (BSD) и разработана для' мобильных устройств на основе Linux. Следующий уровень над ядром Linux включает набор библиотек С/С++, используемых различными компонентами ОС. Для разработчиков доступ к функциям этих библиотек реализован через использование Application Framework— каркаса приложений. Библиотеки этого уровня по своему функциональному назначению можно разделить На следующие группы: ? системная библиотека С; ? менеджер поверхностей; ? функциональные библиотеки С/С++. 1.2.1. Системная библиотека libc Компания Google разработала собственную С-библиотеку (libc)— Bionic. Это было необходимо по следующим причинам: ? библиотека будет загружаться в каждый процесс и, следовательно, должна иметь маленький размер. Библиотека Bionic имеет размер около 200 Кбайт, что в два раза меньше размера glibc; ? ограниченная мощность центрального процессора мобильного устройства. Это означает, что библиотека должна быть оптимизирована для максимального быстродействия. Библиотека Bionic имеет встроенную поддержку важных для Android системных служб и регистрацию системных событий. Библиотека Bionic не поддерживает определенные функциональности, например исключения С++, и несовместима с GNU libc и стандартом POSIX. 1.2.2. Менеджер поверхностей Система Android использует композитный менеджер поверхностей, похожий на Compiz (композитный менеджер окон для X Window System, использующий для ускорения ЗЭ-графику OpenGL). Вместо того чтобы рисовать непосредственно в буфер экрана, команды рисунка входят за кадром в битовые массивы, которые потом объединяются с другими битовыми массивами, чтобы сформировать изображение, которое видит пользователь. Это позволяет системе создавать все виды интересных эффектов, например прозрачные окна и причудливые переходы. Менеджер поверхностей обрабатывает весь рендеринг поверхности на фреймовый буфер. Менеджер может объединить 2D- и ЗО-поверхности и поверхности от нескольких приложений. Поверхности передают как буферы компоновкой 1РС-запросов. Менеджер поверхностей использует двойную буферизацию, используя транспонирования страницы. Системные интеграторы могут подключать аппаратное 20-ускорение, используя плагины Khronos. Обработка графической информации менеджером поверхностей представлена на рис. 1.2. Рис. 1.2. Обработка графической информации менеджером поверхностей 1.2.3. Функциональные библиотеки Android включает ряд библиотек С/С++, используемых различными компонентами системы. Далее приводятся основные функциональные библиотеки системы. ? Мультимедиа (Media Framework). Эти библиотеки ответственны за регистрацию и воспроизведение аудио- и видеоформатов. Основаны на PacketVideo OpenCORE и предназначены для поддержки популярных аудио- и видеоформатов (MPEG4, H.264, MP3 и др.). ? SQLite— процессор баз данных, доступный всем приложениям. SQLite не использует парадигму клиент-сервер, т. е. движок SQLite не является отдельно работающим процессом, с которым взаимодействует программа, а предоставляет библиотеку, с которой программа компонуется, и движок становится составной частью программы. Таким образом, в качестве протокола обмена используются вызовы функций (API) библиотеки SQLite. Такой подход уменьшает накладные расходы, время отклика и упрощает разработку приложений для работы с данными. SQLite хранит всю базу данных (включая определения, таблицы, индексы и данные) в единственном стандартном файле на том компьютере, на котором исполняется программа. ? OpenGL ES— движок для работы с ЗО-графикой, основанный на API- версии OpenGL ES 1.0. OpenGL ES — это упрощенная версия спецификации OpenGL, позволяющая мобильным устройствам работать с тяжеловесными в графическом отношении приложениями. Библиотека использует аппаратный ЗЭ-акселератор (если он доступен на этом устройстве) или встроенное высоко оптимизированное трехмерное программное обеспечение для работы с растровой графикой. П FreeType — библиотека шрифтов, предназначенная для работы с растровыми и векторными шрифтами. П WebKit — библиотека, предназначенная для функционирования встроенного в Android Web-6pay3epa. WebKit поддерживает CSS, JavaScript, DOM, Ajax. П SGL — движок для работы с 2Э-графикой. Android также поддерживает собственную графическую 20-библиотеку Skia, которая написана на С и С++ (Skia также формирует ядро популярного браузера Google Chrome). П SSL — библиотека предназначена для работы с сокетами, основанная на протоколе SSL: SSLv3.0 или TLSvl.2. 1.3. Среда выполнения Среда выполнения обеспечивает библиотеки ядра Dalvik Virtual Machine (виртуальная машина Dalvik), которые предоставляют требуемую функциональность для 1ауа-приложений. 1.3.1. DalvikVirtual Machine Прикладное программное обеспечение, запускаемое на мобильном устройстве, исполняет виртуальная машина Dalvik, которая хоть и являе^я аналогом виртуальной машины Java, существенно от нее отличается. Dalvik относится к классу регистровых машин (регистры процессора используются как первичные модули хранения данных), идеально подходящих для работы на процессорах К18С-архитектуры, к которым относятся и процессоры ARM, применяемые в мобильных устройствах, тогда как стандартная виртуальная машина Java компании Sun Microsystems — стековая. В результате использования регистровой виртуальной машины Google надеется на 30 процентов уменьшить количество команд по сравнению со стековыми машинами. Созданные с помощью стандартного ]ауа-компилятора ЫаББ-файлы преобразуются в байт-код Dalvik (*.dex) транслятором dx, входящим в состав SDK. Изнутри работающий Android выглядит как набор виртуальных машин Dalvik, в каждой из которых исполняется прикладная задача. Виртуальная машина Dalvik, на которой построена вся операционная система Google Android, дает разработчикам приложений удобный механизм для написания приложений, которым не принципиален объем используемой памяти и мощность процессора. 1.3.2. Core Libraries Включает набор основных библиотек, которые предоставляют функциональность для Java. Библиотеки ядра обеспечивают слой API и являются основной платформой разработки ]ауа-приложений для Android. 1.4. Уровень каркаса приложений Уровень каркаса приложений находится на вершине системных библиотек, функциональных библиотек и Dalvik VM. На этом уровне находятся основные службы Android для управления жизненным циклом приложений, пакетами, ресурсами и т. д. Программист имеет полный доступ к тем же API, которые используются основными приложениями. Архитектура этих приложений разработана с целью упрощения многократного использования компонентов. Любое разрабатываемое приложение может использовать возможности базовых приложений и, соответственно, любое другое стороннее приложение может использовать возможности вашего приложения (с учетом установленных разрешений). Этот же самый механизм позволяет многократно использовать уже разработанные компоненты. Службы Android — это службы, которые являются основными для всех приложений, работающих на устройстве. К ним относятся: П менеджер деятельностей (Activity Manager) — управляет жизненным циклом приложений и предоставляет систему навигации по истории работы с деятельностями (стеку деятельностей); ? менеджер пакетов (Package Manager) — управляет установкой и развертыванием пакетов прикладных программ, которые находятся на устройстве; ? менеджер окон (Window Manager)— сохраняет окна приложения. Если разработчик предусмотрел вывод экрана, а затем переключение на другой экран, первый будет сохранен операционной системой и поставлен в режим ожидания. Это, в свою очередь, позволяет с помощью клавиши мобильного устройства просматривать уже использовавшиеся экраны подобно тому, как это делается в Web-6pay3epe; ? менеджер ресурсов (Resource Manager)— предназначен для доступа к строковым, графическим и другим типам ресурсов; ? контент-провайдеры (Content Providers)— службы, которые позволяют приложениям получать доступ к данным других приложений, а также предоставлять сторонним приложениям доступ к своим данным; П система представлений (View System)— система с расширяемой функциональностью, которая служит для создания внешнего вида приложений, включающего такие компоненты, как списки, таблицы, поля ввода, кнопки, встроенный Web-6pay3ep и многое другое; П телефонный менеджер— обеспечивает слой API, контролирующий основную телефонную информацию, такую как сетевой тип и статус подключения, а также предоставляет различные утилиты для управления телефонными номерами; П менеджер местоположения — навигационные службы, которые позволяют приложениям получать периодические обновления географического местоположения устройства или запускать определенное приложение; ? менеджер уведомлений — позволяет любому приложению отображать пользовательские уведомления в строке состояния. 1.5. Уровень приложений Мобильное устройство Android поставляется с набором основных приложений, включая почтового клиента, программу для работы с SMS, календарь, навигационные карты, браузер, контакты и др. Что интересно, платформа Android не делает разницы между основными приложениями телефона и сторонним программным обеспечением — таким образом, ключевые приложения, входящие в стандартный набор программного обеспечения, можно заменить при желании альтернативными приложениями. Программы для Android пишутся на языке Java. При разработке приложений программисты имеют полный доступ ко всей функциональности операционной системы. Архитектура приложений построена так, чтобы было легко использовать основные компоненты, предоставляемые системой. Также есть возможность создавать свои компоненты и предоставлять их в открытое использование. ГЛАВА 2 Среда разработки Чтобы писать приложения для Android, необходимо установить среду разработки. В этой главе мы установим Java Development Kit, интегрированную среду разработки Eclipse, Android SDK и Android Development Tools, а также сконфигурируем Eclipse для разработки приложений под Android. 2.1. Создание среды разработки Google предлагает для свободного скачивания набор инструментов для разработки (Software Development Kit), который предназначен для х86-машин под операционными системами Windows XP, Mac OS и Linux. 2.1.1. Системные требования Поскольку среда разработки не зависит от операционной системы и Android- приложения в настольных операционных системах запускаются в эмуляторе мобильного устройства, необходимые инструменты для разработки можно установить на любую из следующих систем: П Windows XP (x86) или Vista (32 или 64 бита); П Mac OS X l0.4.8 или новее; П Linux (тестирован только на Linux Ubuntu Hardy Heron). В качестве среды разработки рекомендуется Eclipse 3.5 (Galileo) или Eclipse 3.4 (Ganymede) следующих версий: П Eclipse IDE for Java ЕЕ Developers; П Eclipse IDE for Java Developers; П Eclipse for RCP/Plug-in Developers. ПРИМЕЧАНИЕ В принципе, можно использовать и другую среду разработки, например NetBeans IDE, но возможны некоторые неудобства, о которых будет рассказано далее. Для начала работы необходимо загрузить и установить следующее программное обеспечение: ? JDK 5 или 6; ? EclipseIDE; ? Android SDK 2.0; ? Android Development Tools (ADT). Поскольку версии SDK, Java и Eclipse доступны для Windows, Mac OS и Linux, можно создавать Android-пpилoжeния на любой операционной системе, которая вам нравится. SDK включает эмулятор для всех трех операционных систем, и, поскольку Android-npWKttKeHHfl выполняются на виртуальной машине, нет никакого преимущества для разработки приложений в любой из этих ОС. ПРИМЕЧАНИЕ Все примеры и скриншоты в этой книге даются для ОС Microsoft Windows XP 2.1.2. Установка JDK Для разработки программ на языке Java нам потребуется специальное программное обеспечение. Самые новые версии системного программного обеспечения, необходимого для поддержки, можно загрузить с сайта компании Sun Microsystems. Для запуска и исполнения программ необходима Java Runtime Environment (среда выполнения Java, JRE). Для разработки программ также требуется комплект разработки программного обеспечения— JDK (Java Development Kit). Java Development Kit — это комплект разработчика приложений на языке Java, включающий в себя компилятор Java ^avac), стандартные библиотеки классов Java, примеры, документацию, различные утилиты и уже включающий в себя Java Runtime Environment (JRE). Java Development Kit доступен для свободной загрузки на сайте Sun Microsystems по адресу http://java.sun.com/javase/downloads/index.jsp. ПРИМЕЧАНИЕ На момент написания книги последней версией была JDK 6 Update 17 Для работы с примерами в данной книге была установлена версия JDK 6 Update 17 with Java ЕЕ. После загрузки JDK сделайте инсталляцию с параметрами по умолчанию, предлагаемыми мастером установки. Однако в состав JDK не входит интегрированная среда разработки на Java (IDE), поэтому для разработки приложений необходимо использовать Eclipse. 2.1.3. Установка Eclipse Следующий шаг— загрузка интегрированной среды разработки Eclipse. Eclipse доступен для загрузки по адресу http://www.eclipse.org/downloads/. Загрузите одну из рекомендованных к использованию версий Eclipse, перечисленных в разд. 2.1.1 (автором была применена версия Eclipse IDE for Java ЕЕ Developers). После того как вы загрузили Eclipse, разверните архив и запустите файл eclipse.exe. По умолчанию Eclipse устанавливается в ваш пользовательский каталог (в MS Windows), но вы можете установить его в каталог Program Files или любой другой. Несмотря на то что для разработки можно использовать и другие IDE, есть несколько причин, почему Eclipse рекомендуется для разработки Android- приложений: П Eclipse — наиболее полно документированная, свободная и доступная интегрированная среда разработки для Java. Eclipse также очень прост в изучении— освоение его займет минимальное время. Это делает Eclipse очень привлекательным IDE для разработки приложений под Android; П компания Google выпустила плагин к продукту Android для Eclipse — Android Development Tools, который позволяет создавать Android-npoeKTbi, компилировать и использовать эмулятор мобильного Android-ycTpoficTBa для их запуска и отладки приложений. Плагин Android Development Tools для Eclipse автоматически создает необходимую структуру Android- проекта и устанавливаеттребуемые параметры настройки компилятора. 2.1.4. Установка Android SDK Чтобы разрабатывать приложения для Android, необходим Android SDK. SDK включает эмулятор, так что нет необходимости в мобильном устройстве с ОС Android, чтобы разрабатывать приложения для Android. Последняя версия на момент написания книги— Android SDK v2.0. Android SDK доступен для свободного скачивания на официальном сайте Android по адресу http://developer.android.com/sdk/index.html. После загрузки распакуйте файл в выбранную вами директорию. Начиная с версии 2.0 архив Android SDK содержит только инструментальные средства. В ранних версиях SDK архив содержал полный комплект компонентов текущей платформы Android. В версии 2.0 используется Android SDK and AVD Manager, чтобы установить или модифицировать компоненты SDK — пакеты, инструменты, дополнения и документацию. Чтобы разрабатывать приложения, необходимо установить не менее одной версии платформы Android, используя Android SDK and AVD Manager. Это требует подключения к Интернету, т. к. все необходимые для загрузки и обновления компоненты SDK находятся в репозитории на сервере Google. Чтобы открыть Android SDK and AVD Manager, запустите файл SDK Setup.exe в корневом каталоге SDK. После установки соединения с репозито- рием в окне менеджера будет отображен список доступных пакетов, как показано на рис. 2.1. Рис. 2.1. Выбор пакетов для инсталляции Выбрав необходимые пакеты, нажмите кнопку Install Accepted и далее, следуя инструкциям, установите компоненты SDK. После успешной установки Android SDK можно приступать к установке АОТ-плагинадля Eclipse. 2.1.5. Установка Android Development Tools Плагин Android Development Tools (ADT) — это расширение для интегрированной среды разработки Eclipse, ускоряющее и упрощающее создание и отладку приложений. Для установки Android Development Tools сначала запустите Eclipse, затем выберите пункт меню Help | InstaIl New Software. В появившемся диалоговом окне нажмите кнопку Add. После установки соединения пометьте устанавливаемые компоненты ADT, как показано на рис. 2.2. 0instatt Available Software ШЮш аг:сза';; https: //dl-ssl. google. com/android/edipse/ Рис. 2.2. Инсталляция компонентов ADT ш^^^шшштщшшшштш ^^ШШШШшШШ^^^ШИ^ШШШ^ШШММШШШйж^^^&ж щшш^шшкшш ::шт§т^ Check the items that you wish to i ШШ^Ш^шшш После выполнения всех инструкций по установке перезапустите среду Eclipse. Теперь необходимо связать Eclipse с каталогом Android SDK. Выберите в главном меню Eclipse пункт Window | Preferences, чтобы открыть диалоговое окно Preferences. Выберите в левой панели пункт Android. В поле SDK Location в основной панели необходимо указать каталог, в котором расположен Android SDK. Для этого нажмите кнопку Browse и установите путь к каталогу Android SDK, как показано на рис. 2.3. Нажмите кнопку AppIy, затем ОК. IDE Eclipse теперь "видит" библиотеки и инструменты Android SDK, и можно начинать разрабатывать приложения для Android. АОТ-плагин для Eclipse автоматизирует и упрощает процесс построения приложений для Android, интегрируя инструменты разработки непосредственно в среду разработки Eclipse, что делает создание, запуск и отладку ваших приложений быстрее и проще. Androrcl Tw^Name^ ; Vendor ; '• Hatform ff Android 1.1 Android Open Source Project 1Л "'"~ "'f Android 1.5 Android Open Source Project 1.5 3 Android 1.6 Android Open Source Project 1.6 4 Android 2.0 Android Open Source Project 2.0 5 Google APIs Google Inc. 1.5 3 Google APIs Google Inc. 1.6 4 Google APIs Google Inc. 2.0 5 Androld Preferences SDKUxattonj jDAandroid-sdk-windows growse.. Wote^. The Ы cf SDfc srgels befow ls onty retoaevice, j x An Androkj Virtual Device that fated to foad. Cfck Tfetafe' seetheerror Рис. 2.4. Окно Android SDK and AVD Manager В правой части панели List of existing Android Virtual Devices нажмите кнопку New, при этом откроется окно Create new AVD (рис. 2.5). В этом окне задайте нужную конфигурацию для создаваемого эмулятора устройства: ? Name — имя создаваемого устройства; П Target— версия Android SDK, поддерживаемая устройством. Устройство имеет обратную совместимость со старыми версиями SDK, т. е. если выбрана версия Android 2.0, эмулятор будет поддерживать версии SDK 1.6, 1.5,1.1; П SD Card — устанавливает виртуальную карту SD; П Skin — тип экрана устройства. Загружаемая платформа включает ряд скинов для эмулятора, которые можно использовать для моделирования рабо ты приложения в устройствах с разными размерами и разрешением экрана. Набор скинов для эмулятора в зависимости от установленной версии SDK, указанной в поле Target, содержит различные типы и размеры экрана, например: • HVGA (Half-size VGA Video Graphics Array), размер 320x480, средняя плотность, нормальный экран; • WVGA800 (Wide Video Graphics Array), размер 480x800, высокая плотность, нормальный экран; 0Create newAVD ^I ^ ,,~~~~~ JL-. ; — iAndt$fd 2.0,1 ? m lev ; AVD2 Tar^efc 5DO>rd: Stohi зг~: Ti Herdwar05 . Property Vdue :' Abstracted LCD density 160 " [createAypJ4 Cancel ~|; П Hardware — имитация оборудования, установленного на устройстве. При необходимости нажатием кнопки New можно вызвать окно для добавления дополнительного виртуального оборудования (рис. 2.6). о~ шш ;; Property fe:fiiii^ ВВНН Ш яшш -bescriptj< '^*-boofeanv'/-,: эп; Wbetherthe devic$ canru n on а battery lllf!lll! 'ШшШШ11Ш11М Cancel ]:.; ..;. ... '. :' ?..;....;;.-. .....-.;...?.;;,.:-.... Рис. 2.6. Окно для добавления дополнительного виртуального оборудования После задания конфигурации и нажатия кнопки Create AVD (см. рис. 2.5) менеджер создаст новое виртуальное устройство, название и версия API которого появятся в списке List of existing Android Virtual Devices (см. рис. 2.4). ПРИМЕЧАНИЕ Для более тонкой настройки лучше использовать инструмент командной строки android.exe. Он имеет более широкие возможности, чем визуальный AVD Manager, и удобен для конфигурации сети, портов и виртуального оборудования эмулятора. К сожалению, из-за ограниченного объема книги нет возможности рассмотреть подробнее этот инструмент. В зависимости от поддерживаемой версии API внешний вид виртуального устройства будет отличаться. Для версий 1.5 и ниже устройство примет вид, показанный на рис.2.7, для версий 1.6, 2.0, 2.1 будет выглядеть, как на рис. 2.8. Окно эмулятора оформлено в виде телефона с дополнительной клавиатурой. На рис. 2.8 показана загруженная операционная система. После загрузки системы появляется Home screen — рабочий стол Android. Для доступа к нему используется кнопка со значком домика. Эмулятор также имитирует сенсорный экран реального мобильного устройства— в эмуляторе на экран нажи- маютлевой кнопкой мыши. В эмуляторе два виртуальных рабочих стола, перемещение по которым осуществляется с помощью кнопок со стрелками на навигационной панели устройства или передвижением курсора при нажатой левой кнопке мыши (в реальном устройстве — перемещая палец по экрану). Кроме ярлыков программы на рабочем столе можно размещать виджеты. Рис. 2.8. Внешний вид AVD версии 2.0 ПРИМЕЧАНИЕ Для тестирования внешнего вида создаваемого приложения при разных положениях экрана комбинацией клавиш + можно изменять расположение экрана с вертикального на горизонтальный и наоборот. Панель в верхней части экрана — это Status Bar. На ней расположены значки системных уведомлений: мощность сигнала станции мобильной связи, заряд аккумулятора и текущее время. Панель Status Bar также предназначена для отображения (в виде значков, появляющихся в левой части панели) пользовательских уведомлений о пропущенных звонках, непрочитанных текстовых и мультимедийных сообщениях, полученной почте и системных уведомлений от служб, работающих в фоновом режиме. Если в Status Bar выбрать значок уведомления и потянуть вниз появившийся маркер, открывается расширенная панель уведомления с более подробной информацией и кнопкой закрытия уведомления. Маркер внизу экрана позволяет открыть окно запуска установленных в системе приложений — Application Launcher (рис. 2.9). Окно выдвигается при нажатии на маркер. Эмулятор, тем не менее, не поддерживает некоторые функциональности, доступные на реальных устройствах: ЩШ 20:39 Рис. 2.9. Панель запуска установленных приложений Application Launcher m П входящие и исходящие сообщения. Однако можно моделировать обращения по телефону через интерфейс эмулятора; ? соединение через USB; ? видеокамера (однако есть имитатор работы видеокамеры); ? подключение наушников; ? определение статуса соединения; ? определение уровня заряда аккумуляторной батареи; П определение вставки или изъятия карты SD; ? соединение по Bluetooth. Конечно, реальные телефоны несколько отличаются от эмулятора, но в целом AVD разработан очень качественно и близок по функциональности к реальному устройству. ГЛАВА 3 Первое приложение для Android Итак, после того как мы установили и настроили среду разработки и эмулятор мобильного устройства, можно приступить к созданию своего первого приложения, в качестве которого традиционно выступает приложение "Hello, Android!" 3.1. Создание проекта в Eclipse Создавать проект для платформы Android довольно легко, особенно при использовании в качестве среды разработки Eclipse. Откройте Eclipse и выберите File | New | Android. Выберите опцию Android Project и нажмите кнопку Next (рис. 3.1). Откроется диалоговое окно мастера New Android Project (рис. 3.2). В этом окне заполните поля приведенными значениями: П Project name — HelloAndroid; П Applicationname — Hello, Android! Sample; ? Package name — com. samples. helloandroid; ? Create Activity — HeUoAndroidActivity; ? BuildTarget — Android i.5; П Min SDK Version — з. Далее представлены описания каждого поля. ? Project name— имя проекта Eclipse— имя каталога, который будет содержать проектные файлы. П Application name — заголовок вашего приложения — имени, которое появится в заголовке окна приложения в верхней части экрана. ОНт ввшш Select а wizard mtm^- фкЩ^С^Ш;:Щ;1 '^:.jCy.; :- УЩЩЯ;Ш ___ ~—"' m Ш Class 0 Interface Ш Java Project & Java Project from Existing Ant Buildfile i|| Plug-in Project G6 Ш General Ф Ш? Android Ш j:|i? :iP-% ШбШ&ЗШвЯ ^ШашкШ Jjj' Android Test Project ф Android XML File Ш Ш> Connection Profiles ШМФ CVS Г.'] Ш? Edipse Modeling Framework ^ EJB Щ% Ш^^^ШШ^^^173Г^'.Жш^€'7 1 ll. gyffk..J- m .?^ • :'• ^.-^x.-^:^ v - ^: ' -^ ;: ">:^Д-.^ Рис. 3.1.Диалоговое окно создания нового проекта ? Package name — имя пакета, которое имеет такие же правила построения и именования пакетов, как и для приложений на Java. Это поле устанавливает имя пакета, под которым класс, расширяющий Activity, будет сгенерирован. ОБРАТИТЕ ВНИМАНИЕ Имя вашего пакета должно быть уникально по отношению ко всем пакетам, установленным на мобильном устройстве Android. По этой причине очень важно использовать стандартный пакетдоменного стиля для ваших приложений. ? Create Activity — имя для заглушки класса, которая будет сгенерирована плагином. Заглушка является подклассом класса Activity. Переключатель около поля ввода предполагает, что создание класса является необязательным, но Activity почти всегда используется как основа для приложения. Подробнее об Activity мы поговорим в главе 4, когда будем рассматривать компоненты Android-пpилoжeний. ? Use default location — позволяет изменять местоположение на диске, где файлы проекта будут сгенерированы и сохранены. ? Min SDK Version — значение определяет минимальный уровень API, требуемый для приложения. 0 NewAndroid Project New Android Project © Creates а new Android Project r Projectname: j HelloAndroid 0Createnev* projeetinworkspace QCreateproject fromexistingsource EiUse defauft bcation C)Create project from existing sampte Samptes: Я*>= ?';•:< ; TargetName Vendor : Platform APILevel * ! ? Android 1.1 Android Open Source Project 1.1 2 I 0 Android 1.5 Android Open Source Project 1.5 3 i E3 Google APIs Google Inc. 1.5 3 ! ? Android 1.6 Android Open Source Project 1.6 4 { ? Google APIs Google Inc. 1.6 4 ! ? Android 2.0 Android Open Source Project 2.0 5 ! ? Google APIs Google Inc. 2.0 5 I п Android 2.0.1 Android Open Source Project 2.0.1 6 ! ? Google APIs Google Inc. 2.0.1 ^ 6 v Standard Androidptetform .5 roperfc АррЙсаЪоп n&ne: j Hello, Android! Sample Packagename; : i com.samples.helloandroid ElCreateActtvity: {HelloAndr idActivity | < |ack | fjext > ] f Firrish j [ Cancel Рис. 3.2. Диалоговое окно New Android Project ? Build Target — указание компилятору собрать приложение для выбранного уровня API (выставляется автоматически, основываясь на выбранной версии SDK в поле Min SDK Version). ОБРАТИТЕ ВНИМАНИЕ При выборе уровня API не следует устанавливать самый последний из доступных на данный момент уровней. Необходимо учитывать требования к функциональности приложения и поддерживаемый на реальном устройстве уровень API. Если приложение требует уровень API, который выше, чем уровень API, поддерживаемый устройством, то приложение не будет установлено. В поле Build Target была выбрана для использования платформа Android 1.5 (Min SDK Version — 3). Это означает, что ваше приложение будет откомпилировано сиспользованием библиотек Android 1.5. Приложения Android совместимы снизу вверх, так что приложения, собранные на версии библиотек API 1.5, будут работать на платформах 1.6, 2.0, 2.01 и 2.1. Нажмите кнопку Finish. Мастер New Android Project сгенерирует проект. Это должно быть видно в окне Package Explorer слева. По умолчанию АОТ-плагин генерирует проект с единственным окном и текстовым полем, с надписью "Hello, World" + имя класса деятельности (главного окна приложения), которое вы определили в поле Create Activity. При желании можете поменять надпись, например, на "Hello, Android!" Для этого откройте файл strings.xml, находящийся в каталоге res/values/, и в появившемся окне редактора ресурсов Resource Editor перейдите в режим текстового редактирования XML и измените значение для элемента : Hello, Android! Нажмите кнопку Run. Появится окно Run As запуска проекта на выполнение. Выберите из списка Select а way to run 'HelloAndroid' опцию Android Application и нажмите кнопку OK (рис. 3.3). Selecta way to run HelloAdrold': jvj Android JUnit Test Щ Java Applet Ш Java Applicati Jv JUnit Test Pescription Runs an Android App6cation Рис. 3.3. Окно компиляции и запуска проекта АОТ-плагин для Eclipse автоматически создаст новую исполняемую конфигурацию для вашего проекта, которая автоматически запустится в эмуляторе мобильного устройства. После запуска эмулятора и загрузки операционной системы разблокируйте его, нажав кнопку MENU. В окне эмулятора появится ваше приложение (рис. 3.4). Рис. 3.4. Окно программы "Hello, Android! Sample' В окне программы мы увидим две строки. Текст "Hello, Android! Sample", который виден в серой области вверху, — это заголовок приложения. Текст ниже заголовка— текст, который вы создали в файле строковых ресурсов strings.xml. 3.2. Структура проекта АОТ-плагин при создании проекта организует структуру в виде дерева каталогов, как и любой другой проект Java. В среде Eclipse, в окне Package Explorer, можно видеть структуру созданного проекта (рис. 3.5). ПРИМЕЧАНИЕ Структура файлов и каталогов проекта может меняться в зависимости от уровня API, установленного для проекта. Например, для уровня 7 (версия Android 2.0) в каталоге res/ вместо папки drawable/ будут созданы три папки: drawable- hdpi/, drawable-mdpi/, drawable-ldpi/ с иконками для разного разрешения экрана мобильного устройства. Ф Ш src В Щ com.samples.helloandroid Ш - 2) HelloAndroidActlvity.java 'Q §Р gen [Gensnred Java File-;'J & Ш com.samples.helloandroid Ш й R-]ava m Wk Android 1.5 Ш -Ш drawabte " 8| icon.png В Щг Iayout Й) main.xml •Э Щ? values [rf] strings.xml <-$i AndroidManifest.xml Ш default.properties Рис. 3.5. Структура проекта "HelloAndroid" в окне Package Explorer При компиляции в каталоге проекта создается папка bin/. Откомпилированный код Дауа-классов вместе с файлами данных и ресурсов помещается в архивный файл с расширением apk. Этот файл используется для распространения приложения и установки его на мобильных устройствах. » Рассмотрим теперь подробнее каталоги и файлы, созданные в проекте. 3.2.1. Каталог ресурсов В этом каталоге хранятся используемые в приложении статические файлы ресурсов: изображения, строки, анимация и др. Некоторые из подкаталогов создаются АОТ-плагином, другие необходимо добавлять самостоятельно, используя предопределенные имена. Обычно в ресурсы включают следующие подкаталоги: ? res/drawable/ — для изображений (PNG, JPEG и т. д.); ? res/layout/— для ХМЬ-файлов разметки (компоновка графических элементов управления для окон приложения); ? res/menu/ — дляХМЬ-файловменю; ? res/values/ — для строковых ресурсов, массивов и т. д.; ? res/xml/ — для других ХМЬ-файлов, которые понадобятся для разработки приложения. Следует отметить несколько ограничений относительно создания папок файлов ресурсов. Во-первых, Android поддерживает только линейный список файлов в пределах предопределенных папок под каталогом res/. Например, он не поддерживает вложенные папки под папкой для ХМЬ-файлов разметки (или другими папками в каталоге res/). Подкаталог res/layout/ В эту папку помещаются файлы разметки в формате XML, которые определяют внешний вид окна деятельности и расположение на нем элементов управления. Плагин по умолчанию генерирует базовую разметку для главного окна приложения с единственным элементом Textview (листинг 3.1). ЛмстингЗЛ Файяразм&ткита1п*хт1 Создание файлов разметки будет рассматриваться в главе 5, элементов управления — в главах 6 и 7. Подкаталог res/drawable/ В этом каталоге размещаются все графические файлы, используемые в приложении. На данный момент там есть только файл icon.png — значок приложения, по умолчанию устанавливаемый для приложения мастером создания проекта и отображаемый в меню запуска установленных на телефоне приложений (Application Launcher). Подкаталог res/values/ В этой папке хранятся общие константы для всего приложения: текст, используемый элементами управления, цвета, стили и т. д. Например, если мы хотим вывести "Hello, Android!" в текстовое поле, можно это сделать двумя способами: ? написать явно в файле разметки или в файле манифеста; ? создать в strings.xml константу heiio со значением "Hello, Android!", а в файле разметки в атрибуте android:text для элемента Textview указать ссылку на ресурс в strings.xml, как в листинге 3.1: android:text="@string/hello" Пример файла строковых ресурсов для нашего приложения представлен в листинге 3.2. j Листинг ZJL Файл ресурсов fctrings.xrn! <7xml version=" .0" encoding="utf-8"?> Hello, Android! "Hello, Android!" Sample 3.2.2. Файл R.java Когда проект компилируется первый раз, среда создает класс R и помещает его в файл R.java. Этот класс используется в коде программы для обращения к ресурсам, которые находятся в каталоге res/. Пример файла R.java для нашего приложения показан в листинге 3.3. j ЛистингЗ.З. Класс Rjava AUTO-GENERATED FILE. DO NOT MODIFY. This class was automatically generated by the aapt topl from the resource data it found. It should not be modified by hand. package com.Samples.helloandroid; public final class R public static final class attr } public static final class drawable { public static final int icon=0x7f020000; public static final class id public static final int TextView01=0x7f050000; public static final class layout { public static final int main=0x7f030000; public static final class string public static final int app_name=0x7f040001; public static final int hello=0x7f040000; Класс R содержит набор внутренних классов с идентификаторами ресурсов, которые он создает в зависимости от внутреннего содержимого каталога res/: ? drawable — для каталога res/drawable/; ? iayout — для каталога res/layout/. Содержит идентификаторы файлов разметки. В нашем приложении только один файл разметки— main.xml, сгенерированный мастером создания проекта. Если в приложении определены несколько деятельностей, для каждой из них необходимо будет определять файл разметки; ? id—для идентификаторов компонентов разметки, определенных в файле main.xml; ? string — для идентификаторов строк в файле strings.xml. При добавлении в ресурсы других файлов среда сгенерирует новый класс R, добавив в него дополнительные вложенные классы. ОБРАТИТЕ ВНИМАНИЕ Вы никогда не должны редактировать этот файл вручную, т. к. при компиляции проекта среда разработки все равно его перезапишет. 3.2.3. Файл HelloAndroidActivity.java HeiioAndroidActivity— это класс, автоматически генерируемый АОТ-плаги- ном для главной деятельности (окна) приложения. Плагин определяет в классе метод обратного вызова onCreate(), который вызывается системой для прорисовывания окна деятельности на экране устройства. В этот класс разработчик может добавлять код, реализующий логику работы приложения в данной деятельности. Пример класса HeiioAndroidActivity, расширяющего класс Activity, для на- шего приложения показан в листинге 3.4. Листинг ZA* HelloAndroidActivttyJava package com. samples.helloandroid; import android.app.Activity; import android.os.Bundle; public class HelloAndroidActivity extends Activity /** Called when the activity is first created. @Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); Если приложение будет иметь несколько окон, для каждого из них надо будет вручную создать отдельный класс, наследуемый от базового класса Activity. В следующих главах будет подробно рассмотрено написание классов, реализующих деятельность в приложении. 3.2.4. Файл AndroidManifest.xml Манифест— структурный ХМЬ-файл, всегда имеет название AndroidManifest.xml для всех приложений. Он задает конфигурацию приложения: объявляет компоненты приложения, перечисляет любые библиотеки, связанные с приложением (помимо библиотек Android, связанных по умолчанию), и объявляет разрешения, которые приложение предоставляет. Код файла манифеста приведен в листинге 3.5. i Листинг 3.5. Android Ma nifeslxm I ' <7xml version=" .0" encoding="utf-8"?> Например, атрибут android:name элемента вызывает подкласс Activity, который реализует деятельность (окно) в приложении. Атрибуты icon и iabei прикрепляют файлы ресурсов, содержащих значок и текст, которые могут быть отображены пользователю. Аналогичным способом объявляются и другие компоненты приложения. В следующей главе будет подробно рассказано о работе с файлом манифеста и о том, как требуемую функциональность Апско1^приложения можно объявить в файле манифеста. ГЛАВА 4 Компоненты Апс1го1с1-приложения Приложения для Android состоят из компонентов, которые система может запускать и управлять так, как ей необходимо. Главная особенность платформы Android состоит в том, что одно приложение может использовать элементы других приложений (при условии, что эти приложения разрешают их использовать). При этом ваше приложение не включает код другого приложения или ссылки на него, а просто запускает нужный элемент другого приложения. Для реализации такого использования компонентов других приложений система должна быть в состоянии запустить процесс для приложения, в котором находится требуемый компонент, и инициализировать нужные ей объекты. Поэтому, в отличие от приложений в большинстве других систем, у приложений Android нет единственной точки входа для запуска всего приложения, аналогичной, например, функции main() в С-подобных языках программирования. Android-пpилoжeния состоят из компонентов, которые система может инициализировать и запустить при необходимости. Всего в Android-пpилoжeнияx существует четыре типа компонентов: ? деятельность (Activity); ? служба(Зетсе); ? приемник широковещательных намерений (Broadcast Receiver); ? контент-провайдер (Content Provider). 4.1. Деятельность Деятельность представляет собой визуальный пользовательский интерфейс для приложения— окно. Как правило, окно полностью заполняет экран мобильного устройства, но может иметь размеры меньше, чем у экрана. Деятельность может также использовать дополнительные окна, например всплывающее диалоговое окно, которое запрашивает пользовательский ответ для основной деятельности, или окно уведомления о каком-либо событии в приложении или системе. Визуальное информационное наполнение окна определяется иерархией представлений. Каждое представление управляет заданным прямоугольным пространством в пределах окна. Родительские представления содержат и организовывают схему размещения своих дочерних представлений. Представления также могут реагировать на пользовательское взаимодействие с интерфейсом программы. У Android есть много готовых представлений для использования в приложениях— кнопки, текстовые поля, линейки прокрутки, пункты меню, флажки и т. д. Подробнее представления и работа с ними рассматривается в главах 5, 6 и 7. Все деятельности реализуются как подкласс базового класса Activity (для примера посмотрите созданное в предыдущей главе приложение, класс HelloAndroidActivity). Приложение может содержать несколько деятельностей. Каждая деятельность независима от других. При открытии новой деятельности работа предыдущей деятельности приостанавливается, а сама она вносится и сохраняется в стек деятельностей (стек и взаимодействие деятельностей будут рассмотрены в главе 11). 4.2. Службы Служба не имеет визуального интерфейса пользователя и выполняется в фоновом режиме в течение неопределенного периода времени. Служба будет выполняться в системе до тех пор, пока не завершит свою работу. Приложения могут подключаться к службе или запускать ее, если она не запущена, а также останавливать запущенные службы. Подключившись к службе, вы можете обращаться к ее функциям через интерфейс, предоставляемой этой службой. 4.3. Приемники широковещательных намерений Приемник широковещательных намерений— компонент для получения внешних событий и реакции на них. Инициализировать передачи могут другие приложения и службы. Приложение может иметь любой номер приемников широковещательных намерений, чтобы ответить на любые объявления, которые оно считает важными. Приемники широковещательных намерений не имеют пользовательского интерфейса. Однако они могут запустить деятельность в ответ на информацию, которую они получают, или показать уведомление, чтобы предупредить пользователя. 4.4. Контент-провайдеры Контент-провайдер делает определенный набор данных, используемых приложением, доступным для других приложений. Данные могут быть сохранены в файловой системе, в базе данных SQLite или любым другим способом. Контент-провайдеры для безопасного доступа к данным используют механизм разрешений. Это означает, что вы можете конфигурировать собственные контент-провайдеры, чтобы разрешить доступ к своим данным из других приложений и использовать контент-провайдеры других приложений для обращения к их хранилищам данных. 4.5. Процессы и потоки Когда хотя бы один из компонентов приложения (или все приложение) будет востребован, система Android запускает процесс, который содержит единственный основной поток для выполнения. По умолчанию все компоненты приложения работают в этом процессе и потоке. Однако можно принять меры, чтобы компоненты работали в других процессах и порождали дополнительные потоки для любого процесса. Все компоненты инициализируются в основном потоке процесса. Отдельные потоки для каждого экземпляра обычно не создаются. Следовательно, все методы обратного вызова, определенные в компоненте и вызываемые системой, всегда работают в основном потоке процесса. Это означает, что компонент не должен выполнять в методах обратного вызова длительные операции (например, загрузку файлов из сети или циклы вычисления) или блокировать системный вызов, т. к. это блокирует любые другие компоненты в этом процессе. Для таких операций порождают отдельные потоки. 4.5.1. Жизненный цикл процессов Android может решить завершить процесс в случае нехватки памяти или если память востребована другими, более важными процессами. Прикладные компоненты, выполняющиеся в этих процессах, будут уничтожены. Процесс будет перезапущен для компонентов в случае их повторного вызова. При выборе процесса для уничтожения Android оценивает относительную важность этого процесса с точки зрения пользователя, т. е. "видимый пользо вателю компонент данного процесса, например деятельность на переднем плане, считается более важным компонентом, чем служба, выполняющаяся в другом процессе. Также система в первую очередь завершит процесс с дея- тельностями, которые больше не видны на экране, а не процесс с видимыми деятельностями. Поэтому решение о завершении процесса зависит от состояния компонентов, выполняющихся в данном процессе. 4.5.2. Приоритет и статус процессов Порядок, в котором процессы уничтожаются для освобождения ресурсов, определяется приоритетом. Система Android пытается поддерживать процесс приложения максимально долго, но, в конечном счете, будет вынуждена удалить старые процессы, если заканчивается свободная память. Чтобы определить, какой процесс сохранить или уничтожить, Android создает иерархию важности процессов, основанную на компонентах, выполняющихся в процессах и состоянии этих компонентов (рис. 4.1). } Критический приоритет Высокий приоритет Низкий приоритет Рис. 4.1. Приоритет и статус процессов Процессы с самой низкой важностью уничтожаются первыми. Есть пять уровней в иерархии важности. Следующий список представляет их в порядке убывания важности. ? Активный процесс (Foreground Process) — тот, который требуется для того, что пользователь в настоящее время делает. Процесс считается активным, если выполняется любое из следующих условий: • процесс выполняет деятельность, с которой взаимодействует пользователь; • процесс выполняет службу, которая связана с деятельностью, с которой взаимодействует пользователь; • процесс имеет объект service, и выполняется один из методов обратного вызова, определенных в этом объекте; • процесс имеет объект BroadcastReceiver, и выполняется его метод обратного вызова для приема намерения. Одновременно могут существовать только несколько приоритетных процессов. Они будут уничтожены только в крайнем случае — если памяти настолько мало, что они все вместе не в состоянии продолжать работу. ? Видимый процесс (Visible Process) — тот, который не имеет никаких приоритетных компонентов. Компонент из этого процесса еще может вызываться пользователем. Процесс, как полагают, является видимым, если выполняется любое из следующих условий: • это процесс деятельности, которая не находится в фокусе, но все еще видна пользователю. Это может произойти, например, при вызове диалога, который не занимает весь экран, а деятельность потеряла фокус, но видна пользователю и находится позади диалога; • это служба, которая в данный момент связана с деятельностью, находящейся на переднем плане (или частично закрытой другой деятельностью). ? Видимый процесс считаются важным и не будет уничтожен, пока остаются процессы с более низким приоритетом. ? Сервисный процесс (Service Process)— процесс, в котором выполняется служба и который не относится ни к одной из двух предыдущих категорий. Хотя сервисные процессы обычно не привязаны к интерфейсу, видимому пользователем, они выполняют задания, нужные пользователю, например фоновая работа медиаплеера или загрузка данных из сети, так что система сохраняет их при наличии свободной памяти наряду со всеми активными и видимыми процессами. ? Фоновый процесс (Background Process)— процесс в котором выполняется деятельность, которую в настоящее время не видима пользователем. Эти процессы не имеют никакого прямого воздействия на пользовательский ввод и могут быть уничтожены в любое время, чтобы востребовать память для активного, видимого или сервисного процесса. Обычно имеется много фоновых процессов, они сохраняются в списке LRU (least recently used, "не использующиеся дольше всех"), чтобы гарантировать, что находящийся в конце этого списка процесс, в котором выполняется деятельность, был бы уничтожен в последнюю очередь. ? Пустой процесс (Empty Process) — не содержит никаких активных компонентов приложения. Единственная причина сохранять такой процесс — только как кэш, чтобы уменьшить время запуска при вызове компонента. Система уничтожает эти процессы в первую очередь. Если в одном процессе выполняются несколько компонентов, Android определяет приоритет процесса по компоненту с самым высоким приоритетом. Например, если в процессе выполняется служба и видимая деятельность, процесс будет ранжирован как видимый, а не сервисный процесс. Если от некоторого процесса зависят другие процессы, его ранг также может быть увеличен. Процесс, который обслуживает другой процесс, никогда не может иметь приоритет ниже, чем процесс, который он обслуживает. Например, если контент-провайдер в процессе А обслуживает клиента в процессе В или если служба в процессе А связана с компонентом в процессе В, то процесс А получит приоритет не меньше, чем приоритет процесса В. Поскольку сервисный процесс имеет ранг выше, чем фоновая деятельность, для выполнения фоновых процессов, требующих длительное время для завершения (например, передачи данных по сети), но которые должны гарантированно завершиться, часто запускают отдельную службу вместо того, чтобы просто породить поток в деятельности. Это важно в случае, если операция передачи данных по сети будет продолжаться больше времени, чем окно дея- тельности, из которой эта операция была запущена, будет оставаться в видимом процессе (будет видима на экране мобильного устройства). По этой же причине приемники широковещательных намерений должны использовать службы, а не просто помещать отнимающие много времени операции в поток. 4.6. Жизненный цикл компонентов приложения Компоненты приложения имеют жизненный цикл — начало, когда Android инициализирует их, активный период работы, неактивный период, когда они бездействуют, и конец, когда компоненты уничтожаются и освобождают ресурсы для запуска других компонентов. Особенность жизненного цикла приложения Android состоит в том, что система управляет большой частью цикла. Все приложения Android выполняются только в пределах своего собственного процесса. Все выполняющиеся процессы наблюдаются системой, и в зависимости от приоритета компонента и от того, насколько интенсивно компонент (например, деятельность) работает, Android может закончить его работу и передать освободившиеся ресурсы другому компоненту из этого процесса. Решая, должен ли компонент быть закрыт, Android принимает во внимание активность пользователя в работе с этим компонентом, использование памяти идр. 4.6.1. Активация компонентов Деятельности, службы и приемники широковещательных намерений активизируются в соответствии с асинхронными сообщениями, называющимися намерениями. Намерение — объект класса intent, который представляет собой содержание сообщения. Например, намерение может передать запрос деятельности, чтобы показать изображение пользователю или позволить пользователью редактировать некоторый текст. Для приемников широковещательных намерений объект intent вызывает объявляемое действие. Контент-провайдеры активизируются только тогда, когда они получают запрос от другого приложения для доступа к общим данным вашего приложения. 4.6.2. Завершение работы компонентов Некоторые компоненты требуют явного их завершения, другие, наоборот, завершаются сами. Например, контент-провайдер активен только тогда, когда отвечает на запрос, а приемник широковещательных намерений активен при ответе на широковещательное сообщение, так что нет никакой необходимости явно завершать эти компоненты. Деятельности, с другой стороны, обеспечивают поддержку визуального интерфейса пользователя. Они находятся в длительном сеансе связи с пользователем и могут остаться активными даже когда приложение простаивает, но сеанс связи продолжается. Точно так же службы могут оставаться активными в течение долгого времени. Поэтому Android имеет функции завершения деятельностей и служб в принудительном порядке. Компоненты также могут быть закрыты системой, когда они больше не используются или когда Android должен востребовать память для более приоритетных компонентов. 4.7. Файл AndroidManifest.xml Прежде чем Android запустит компонент приложения, он должен узнать, что этот компонент существует. Поэтому приложения объявляют свои компоненты в файле манифеста AndroidManifest.xml, который предоставляет основную информацию системе. Каждое приложение должно иметь свой файл AndroidManifest.xml. Файл манифеста выполняет следующие функции: ? объявляет имя Java-naKeTa данного приложения. Имя пакета служит уникальным идентификатором для приложения; ? описывает компоненты приложения — деятельности, службы, приемники широковещательных намерений и контент-провайдеры, из которых приложение состоит. Он вызывает классы, которые реализуют каждый из компонентов, и объявляет их намерения. Эти объявления позволяют системе Android знать, чем компоненты являются и при каких условиях они могут быть запущены; ? объявляет, какие разрешения должно иметь приложение для обращения к защищенным частям API и взаимодействия с другими приложениями; •• HritoAndrcMd> $ stnngs*xml ^j R,ln Toyg{e $: The application tag describes appfcation-level components contained in the package, as weH as gener I appbcation attributes. ; 0 DePine an tag in the AndroidManifest.xml i ^ Appikatfon Attributes | Defines the attributes specific to the appficati I Name : ; |Brow$e... I Per v .,,.,..J '; Theme [Browse...] ЕпаЫ ;Ш: i @string/app_name j [Browse... ) Debuggable : @dr : [Browse... ] Manage space activity [Browse... j j [Browse... ] AMow dear user rmissi m-- Test only [Browse...j Backup agent [Browse...^ ... „.. I [frpwse...^j AMow backup y:|i j Kill after restor i Has code \ r! j Restore needs appGcati i Appht:<>Honi f**>des g 0 ® ® ® ® в Ф A= AHributesforamfr id.mten*, wy.J.AUftOU- CQ) Attributes that сап be supplied n an AndroidManifest.xml cateqory j 0 .HelloAndroid (Acti к Q] Intent Filter [ Add... 1 tag, а child of the intent-fUter tag. Name | ry.LAUNCHER •05) android.intent.action.MAIN(Action) • ftb andrcud.frrtent.erteaorv.LAUNCHER. fCateoo [Remove..r] Н»~1 fpown"] | шш^шшшшш^шшш > Menfosfc Application Permteoons > Instrumentatfon Ar>droidMarifest.Xfrt: Рис. 4.2. Редактор файла манифеста ? объявляет разрешения, которые сторонние приложения обязаны иметь, чтобы взаимодействовать с компонентами данного приложения; ? объявляет минимальный уровень API Android, которого приложения требует; ? перечисляет библиотеки, с которыми приложение должно быть связано. Редактировать файл манифеста можно вручную, записывая ХМЬ-код непосредственно в файл или через визуальный редактор. Для работы с файлом манифеста в Eclipse есть отдельный инструмент— Manifest Editor (Редактор файла манифеста), который позволяет визуальное и текстовое редактирование файла манифеста приложения, как показано на рис. 4.2. 4.7.1. Общая структура манифеста Файл манифеста инкапсулирует всю архитектуру Android-пpилoжeния, его функциональные возможности и конфигурацию. В процессе разработки приложения вам придется постоянно редактировать файл, изменяя его структуру и дополняя его новыми элементами и атрибутами по мере усложнения разрабатываемого приложения, поэтому важно хорошо ориентироваться во внутренней структуре манифеста и назначении его элементов и атрибутов. На рис. 4.3 приведена общая структура файла манифеста и элементов, которые содержатся в нем, и назначение каждого из элементов. Рис. 4.3. Структура файла манифеста Порядок расположения элементов, находящихся на одном уровне, произвольный. Все значения устанавливаются через атрибуты элементов. Элемент является основным элементом манифеста и содержит множество дочерних элементов, определяющих структуру и работу приложения. Элементы , и являются обязательными. Другие элементы используются по мере необходимости. Элемент является корневым элементом файла Android- Manifest.xml. По умолчанию мастер создания проекта Android в Eclipse создает элемент с четырьмя атрибутами: , где: ? xmlns: android— определяет пространство имен Android. Это значение всегда неизменно для всех приложений; ? package — определяет имя пакета приложения, которое вы определили при создании приложения; ? android: versionCode — указывает внутренний номер версии; ? android:versionName— указывает номер пользовательской версии. Этот атрибут может быть установлен как строка или как ссылка на строковый ресурс. Элемент объявляет разрешение, которое используется для ограничения доступа к определенным компонентам или функциональности данного приложения. В этой секции описываются права, которые должны запросить другие приложения для получения доступа к вашему приложению. Приложение может также защитить свои собственные компоненты (деятельности, службы, приемники широковещательных намерений и контент- провайдеры) разрешениями. Оно может использовать любое из системных разрешений, определенных Android (перечисленных в android.Manifest. permission) или объявленных другими приложениями, а также может определить свои собственные разрешения. Новое разрешение должно быть объявлено в атрибуте android:name элемента следующим образом: permission android:name="com. samples. custom_permission" Кроме того, используются дополнительные атрибуты: ? android: iabei — имя разрешения, отображаемое пользователю; ? android:description — описание; ? android: icon — иконка, представляющая разрешение; ? android:permissionGroup— определяет принадлежность к группе разрешений; ? android:protectionLevel — уровень защиты. Элемент запрашивает разрешение, которые приложению должны быть предоставлены системой для его нормального функционирования. Разрешения предоставляются во время установки приложения, а не во время его работы. Этот элемент имеет единственный атрибут— с именем разрешения — android:name. Это может быть разрешение, определенное в элементе данного приложения, разрешение, определенное в другом приложении или одно из стандартных системных разрешений, например: android:name="android.permission.CAMERA" ИЛИ android:name=""android.pemission.READ_CONTACTS" Элемент объявляет базовое имя для дерева разрешений. Этот элемент объявляет не само разрешение, а только пространство имен, в которое могут быть помещены дальнейшие разрешения. Элемент определяет имя для набора логически связанных разрешений. Это могут быть как объявленные в этом же манифесте с элементом разрешения, так и объявленные в другом месте. Этот элемент не объявляет разрешение непосредственно, только категорию, в которую могут быть помещены разрешения. Разрешение можно поместить в группу, назначив имя группы в атрибуте permissionGroup элемента . Элемент объявляет объект Instrumentation, КОТОрыЙ даеТ возможность контролировать взаимодействие приложения с системой. Обычно используется при отладке и тестировании приложения и удаляется из ге1еа5е-версии приложения. Элемент позволяет объявлять совместимость приложения с указанной версией (или более новыми версиями API) платформы Android. Уровень API, объявленный приложением, сравнивается с уровнем API системы мобильного устройства, на который инсталлируется данное приложение. Основной используемый в элементе атрибут — minSdkversion, определяющий минимальный уровень API, требуемый для работы приложения. Система Android будет препятствовать тому, чтобы пользователь установил приложение, если уровень API системы будет ниже, чем значение, определенное в этом атрибуте. Вы должны всегда объявлять этот атрибут, например: android:minSdkVersion="3" Элемент указывает требуемую для приложения аппаратную и программную конфигурацию мобильного устройства. Например, приложение могло бы определить требования обязательного наличия на устройстве физической клавиатуры или USB-nopTa. Спецификация используется, чтобы избежать инсталляции приложения на устройствах, которые не поддерживают требуемую конфигурацию. Если приложение может работать с различными конфигурациями устройства, необходимо включить в манифест отдельные элементы для каждой конфигурации. Элемент объявляет определенную функциональность, требующуюся для работы приложения. Таким образом, приложение не будет установлено на устройствах, которые не имеют требуемую функциональность. Например, приложение могло бы определить, что оно требует камеры с автофокусом. Если устройство не имеет встроенную камеру с автофокусом, приложения не будет инсталлировано. Элемент определяет разрешение экрана, требуемое для функционирования устройства (для старых версий Android-ycTpoficTB). По умолчанию современное приложение с уровнем API 4 или выше поддерживает все размеры экрана и должно игнорировать этот элемент. 4.7.2. Структура элемента Элемент — это важный элемент манифеста, содержащий описание компонентов приложения, доступных в пакете. Этот элемент содержит дочерние элементы, которые объявляют каждый из компонентов, входящих — — — \ Описание компонентов J прйложения ^У Объявлениедеятельности Л Определениетипов J намерений \ Добавление действия J для фильтра ^> Добавление категории J для фильтра \ Спецификацияданных J фильтра Л Пары "имя-значение" для > J i произвольных данных Псевдоним для деятельности ~У Объявлениеслужбы > Объявление приемника намерений ^ Объявление f контент-провайдера ^> Предоставление разрешений J для клиентов Л Путь и разрешения для f поставляемыхданных ^У Подключаемые библиотеки Рис. 4.4. Структура элемента с состав приложения, описание и принципы работы которых были представлены в начале этой главы. Структура элемента и назначение его дочерних элементов представлена на рис. 4.4. Элемент объявляет деятельность. Все деятельности должны быть явно представлены отдельными элементами в файле манифеста, например: , где: ? android:name— имя класса. Имя должно включать полное обозначение пакета, но т. к. имя пакета уже определено в корневом элементе , имя класса, реализующего деятельность, можно записывать в сокращенном виде, опуская имя пакета: android:name="com.samples.helloandroid.HelloAndroid" ? android: iabei — текстовая метка, отображаемая пользователю. Кроме вышеперечисленных, элемент содержит множество атрибутов, определяющих разрешения, ориентацию экрана и т. д. Если приложение содержит несколько деятельностей, не забывайте объявлять их в манифесте, создавая для каждой из них свой элемент . Если деятельность не объявлена в манифесте, она не будет видна системе и не будет запущена при выполнении приложения. Элемент определяет типы намерений, на которые могут ответить деятельность, сервис или приемник намерений. Фильтр намерений объявляет возможности его родительского компонента— что могут сделать деятельность или служба и какие типы рассылок получатель может обработать. Фильтр намерений предоставляет для компонентов-клиентов возможность получения намерений объявляемого типа, отфильтровывая те, которые не значимы для компонента, и содержит дочерние элементы , , . Элемент добавляет действие к фильтру намерений. Элемент должен содержать один или более элементов . Если в элементе не будет этих элементов, то объекты намерений не пройдут через фильтр. Пример объявления действия: Элемент определяет категорию компонента, которую должно обработать намерение. Это строковые константы, определенные в классе intent, например: Элемент добавляет спецификацию данных к фильтру намерений. Спецификация может быть ТОЛЬКО ТИПОМ данных (атрибут mimeType), URI или типом данных вместе с URI. Значение URi определяется отдельными атрибутами для каждой из его частей, Т. е. URI делится на части: android:scheme, android:host, android:port, android:path ИЛИ android:pathPrefix, android:pathPattern. % Элемент определяет пару "имя-значение" для элемента дополнительных произвольных данных, которыми можно снабдить родительский компонент. Составляющий элемент может содержать любое число элементов . Элемент — это псевдоним для деятельности, определенной в атрибуте targetActivity. Целевая деятельность должна быть в том же самом приложении, что и псевдоним, и должна быть объявлена перед псевдонимом деятельности в манифесте. Псевдоним представляет целевую деятельность как независимый объект. У псевдонима может быть свой собственный набор фильтров намерений, определяющий, какие намерения могут активизировать целевую деятельность и как система будет обрабатывать эту деятельность. Например, фильтры намерений на псевдониме деятельности могут определить флаги android:name="android.intent.action.MAIN" И android:name="android.intent.category.LAUNCHER", заставляя целевую деятельность загружаться при запуске приложения даже в том случае, когда в фильтрах намерений на целевой деятельности эти флаги не установлены. Элемент объявляет службу как один из компонентов приложения. Все службы должны быть представлены элементом в файле манифеста. Службы, которые не были объявлены, не будут обнаружены системой и никогда не будут запущены. Этот элемент имеет много атрибутов, определяющих имя, доступность, разрешения, процесс и т. д. Элемент объявляет приемник широковещательных намерений как один из компонентов приложения. Приемники широковещательных намерений дают возможность приложениям получить намерения, которые переданы системой или другими приложениями, даже когда другие компоненты приложения не работают. Элемент объявляет контент-провайдера. Все контент-провайдеры, которые являются частью приложения, должны быть представлены в элементах в файле манифеста. Если они не объявлены, они не будут работать, т. к. система их не сможет увидеть. Элемент содержит свой набор дочерних элементов для установления разрешений доступа к данным: ? ; ? ; ? . Этот элемент имеет много атрибутов, определяющих имя, доступность, разрешения, процесс и т. д. Элемент — дочерний элемент для . Он ОП- ределяет, для кого можно предоставить разрешения на подмножества данных контент-провайдера. Предоставление разрешения является способом допустить к подмножеству данных, предоставляемым контент-провайдером, клиента, у которого нет разрешения для доступа к полным данным. Если атрибут granturiPermissions контент-провайдера имеет значение true, то разрешение предоставляется для любых данных, поставляемых контент- провайдером. Однако, если атрибут поставлен в false, разрешение можно предоставить только подмножествам данных, которые определены этим элементом. Контент-провайдер может содержать любое число элементов . Элемент — дочерний элемент для . Определяет путь и требуемые разрешения для определенного подмножества данных в пределах поставщика оперативной информации. Этот элемент может быть определен многократно, чтобы поставлять множественные пути. Элемент определяет общедоступную библиотеку, с которой должно быть скомпоновано приложение. Этот элемент указывает системе на необходимость включения кода библиотеки в загрузчик классов для пакета приложения. Каждый проект связан по умолчанию с библиотеками Android, в которые включены основные пакеты для сборки приложений (с классами общего назначения ТИПа Activity, Service, Intent, View, Button, Application, ContentProvider и т. д.). Однако некоторые пакеты (например, maps и awt) находятся в отдельных библиотеках, которые автоматически не компонуются с приложением. Если же приложение использует пакеты из этих библиотек или других, от сторонних разработчиков, необходимо сделать явное связывание с этими библиотеками и манифест обязательно должен содержать отдельный элемент . ГЛАВА 5 Графический интерфейс пользователя В Апс1го1с1-приложении графический интерфейс пользователя формируется с использованием объектов view (представление) и viewGroup (группа представлений). КлаСС View ЯВЛЯеТСЯ баЗОВЫМ КЛаССОМ ДЛЯ ViewGroup и состоит из коллекции объектов view (рис. 5.1). Есть множество типов представлений и групп представлений, каждый из которых является потомком класса view. Рис. 5.1. Иерархия классов View и ViewGroup Объекты view— основные модули отображения интерфейса пользователя на платформе Android. Класс view служит ядром для подклассов, называемых виджетами, которые предлагают полностью реализованные объекты пользовательского интерфейса подобно текстовым полям, кнопкам и т. д. Объект view— структура данных, свойства которой сохраняют параметры разметки и содержание для определенной прямоугольной области экрана. Объект view обрабатывает свою собственную геометрию, разметку, рисунок, изменение центра, прокрутку для прямоугольной области экрана, в котором он находится. Как объект в интерфейсе пользователя, объект view является точкой взаимодействия пользователя и программы. Класс viewGroup служит ядром для подклассов, называемых разметками (layouts), которые формируют расположение элементов пользовательского интерфейса на форме, используя различные виды архитектуры разметки — фреймовый, линейный, табличный и относительный. 5.1. Деревья представлений На платформе Android необходимо определить пользовательский интерфейс для каждой деятельности, используя иерархии узлов view и viewGroup, как показано на рис. 5.2. Это дерево иерархии может быть и простым, и сложным — в зависимости от требований к графическому интерфейсу приложения. Рис. 5.2. Пример дерева представлений для деятельности При запуске программы система Android получает ссылку на корневой узел дерева и использует ее для рисования графического интерфейса на экране мобильного устройства. Система также анализирует элементы дерева от вершины дерева иерархии, прорисовывая дочерние объекты view и viewGroup и добавляя их родительским элементам. 5.2. Разметка Разметка, как было сказано, — это архитектура расположения элементов интерфейса пользователя для конкретного окна, представляющего деятельность. Она определяет структуру расположения элементов в окне и содержит все элементы, которые предоставляются пользователю программы. Разметку можно объявлять двумя способами: ? объявить элементы пользовательского интерфейса в XML. Android обеспечивает прямой ХМЬ-словарь, который соответствует классам view и ViewGroup; ? создать разметку для окна в коде программы во время выполнения — инициализировать объекты Layout И дочерние объекты View, ViewGroup и управлять их свойствами программно. Android позволяет использовать каждый из этих методов в отдельности или оба сразу для объявления и управления пользовательским интерфейсом в приложении. Например, можно объявить заданные по умолчанию разметки вашего приложения в XML, включая экранные элементы, которые появятся в них, и их свойства, а затем добавить код в вашем приложении, который во время выполнения изменит состояние объектов на экране, включая объявленные в XML. <* ^мп.кя* \ ;Edfongconfi defaufc _..... * t * Щ TabteLayaitOi (Tabielayoutj |TJ TatdeRow01 (TaNeRow) Сф Button01 (Button) J) Button02 (Button) ф Button03 (Button) л Щ TabteRow02 (TabteRow) Щ TableRow03 (TabteRow) |T| TatdePow04 (TableRow) АЭТ-плагин для Eclipse предлагает удобный инструментарий— визуальный редактор разметки Layout Editor (рис. 5.3), который применяется для создания и предварительного просмотра создаваемых файлов разметки, которые находятся в каталоге res/layout/ проекта. roperty 1 ;?: Button Auto link Background Buffer type Ckkabte Cursor visibl Dqrts Drawable bottom Drawabte teft Drawabte padding Drawable rnght Drawable top Drawinq cache quali Dupbcate parent sti Ed Общая структура ХМЬ-файла разметки проста: это— дерево XML- элементов, где каждый узел представляет имя класса view (в нашем примере только один элемент view— Textview). Вы можете использовать имя любого класса, производного от класса view, как элемент в ХМЬ-разметках, включая ваши собственные классы. Эта структура позволяет быстро создавать пользовательский интерфейс, используя более простую структуру и синтаксис, чем при создании раЗметки в программном коде. 5.2.2. ХМЬ-элементы и атрибуты В вышеупомянутом ХМЬ-примере есть корневой элемент и только один дочерний элемент view.Textview (текстовое поле), который имеет атрибуты. Описание того, что эти атрибуты означают, дается в табл. 5.1. Таблица 5.1. Назначение некоторых XML-ampu6ymoe в файле разметки Имя атрибута XML Описание xmlns:android Декларация пространства имен XML, которая сообщает среде Android, что вы ссылаетесь на общие атрибуты, определенные в пространстве имен Android. В каждом файле разметки у корневого элемента должен быть этот атрибут со значением "http://schemas.android.com/apk/res/android" android:layout_width Этот атрибут определяет, сколько из доступной ширины на экране должен использовать этот объект view (или viewGroup). В нашем случае он — единственный объект, таким образом, можно растянуть его на весь экран, которому в данном случае соответствует значение fill_parent android:layout_height Аналогично android:layout_width, за исключением того, что он ссылается на доступную высоту экрана android:text Устанавливает текст, который должен отобразить Textview. В этом примере используется строковый ресурс вместо жестко закодированного строкового значения. Строка hello определена в файле res/values/strings.xml. Это рекомендуемая практика для использования строковых ресурсов в ваших приложениях, потому что она делает локализацию приложения на другие языки более простой, без потребности кодировать напрямую изменения в файле разметки Каждый объект view и viewGroup поддерживает свое собственное разнообразие ХМЬ-атрибутов. Некоторые атрибуты являются определенными только в объекте view (например, Textview поддерживает атрибут textsize), но эти атрибуты могут также наследоваться любыми объектами view, которые расширяют этот класс. Некоторые атрибуты являются общими ко всем объектам view, потому что они унаследованы от корневого класса view (подобно атрибутам id, layout_width, layout_height). В общем, ХМЬ-словарь элементов пользовательского интерфейса близок к структуре классов и методов этих элементов, где имя элемента соответствует имени класса, аатрибуты элемента— методам этого класса. Фактически, соответствие является часто настолько точным, что легко предположить без обращения к документации Android, какой ХМЬ-атрибут передает метод класса или, наоборот, какой метод класса соответствует конкретному XML- элементу. Так, например, элемент создает текстовое поле Textview в вашем пользовательском интерфейсе, а элемент создает группу представления LinearLayout. Когда вы загружаете ресурс разметки, система Android инициализирует эти объекты во время выполнения, соответствуя элементам в разметке. Однако обратите внимание на последнюю строку в табл. 5.2: не весь ХМЬ-словарь идентичен структуре классов. Таблица 5.2. Соответствие XML-ampu6ymoe и методов в классах представлений Имя атрибута XML Соответствующий метод в классе Java android:gravity setGravity(int) android:height setHeight(int) android:text setText(CharSequence) android:textColor setTextColor(ColorStateList) android:textSize setTextSize(float) android:width setWidth(int) android:textColorHighlight setHighlightColor(int) Любой объект view в коде программы можно связать с объектом из файла разметки, однозначно определив элемент пользовательского интерфейса в пределах дерева. Когда приложение откомпилировано, на этот идентификатор ссылаются как на целое число, но идентификатор представления обычно обозначается в ХМЬ-файле разметки как строка в атрибуте id. Синтаксис для идентификатора элемента в ХМЬ-теге следующий: android:id="@+id/TextView01", где символ @ в начале строки указывает, что синтаксический анализатор XML должен проанализировать и развернуть остальную часть строки идентификатора и определить это выражение как ресурс идентификатора. Символ + означает, что это — новое имя ресурса, которое должно быть создано и добавлено к нашим ресурсам в файл R.java, который среда Android автоматически генерируетдля проекта, как показано в листинге 5.2. Шстимг 5*2, Идентификаторы ресурса в файле Rjava public final class R public static final class id public static final int TextView01=0x7f050000; Если в программном коде мы не работаем с некоторыми элементами пользовательского интерфейса, создавать идентификаторы для них необязательно, однако определение идентификаторов для объектов представления важно при создании RelativeLayout (относительной разметки). В RelativeLayout расПО- ложение представлений может определяться относительно другого представления, на которое ссылаются через его уникальный идентификатор: android:layout_toLeftOf="@id/ TextView01" Подробнее работа со ссылками на идентификаторы элементов будет рассмотрена в разд. 5.4.4. Требование к уникальности идентификаторов не распространяется на все дерево представлений, но они должны быть уникальны в пределах части дерева (которая часто может быть и полным деревом представлений, так что лучше создавать полностью уникальные идентификаторы, если это возможно). 5.3. Инициализация представлений При запуске деятельности система должна получить ссылку на корневой узел дерева разметки, который будет использоваться для прорисовки графического интерфейса на экране мобильного устройства. Для этого в методе onCreate()необходимо вызвать метод setContentview(), передав ему в качестве параметра ссылку на ресурс разметки в следующем виде: R. layout. layout_file_name Например, если ваша ХМЬ-разметка сохранена как main.xml, вы загружаете разметку для Activity примерно так (листинг 5.3). | Листинг 5,3. Инициализация представления а программном коде @Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); Прорисовка начинается с корневого узла дерева разметки. Затем последовательно прорисовываются дочерние представления дерева разметки. Это означает, что родители будут прорисовываться раньше, чем их дочерние представления, — т. е. по окончании процесса прорисовки родители будут находиться на заднем плане по отношению к дочерним узлам. 5.4. Стандартные разметки Существуют следующие стандартные типы разметок, которые вы можете использовать в создаваемых приложениях: ? FrameLayout; ? LinearLayout; ? TableLayout; ? RelativeLayout. Подобно всем разметкам, все они являются подклассами viewGroup (рис. 5.4) и наследуют свойства, определенные в классе view. Рис. 5.4. Иерархия классов разметок 5.4.1. FrameLayout FrameLayout является самым простым типом разметки. Это в основном пустое пространство на экране, которое можно позже заполнить только единственным дочерним объектом view или viewGroup. Все дочерние элементы FrameLayout прикрепляются к верхнему левому углу экрана. Чтобы поработать с разметкой "вживую", создайте в Eclipse новый проект и в диалоговом окне New Android Project введите следующие значения: ? Project name — FrameLayoutApp; ? Application name — FrameLayout Sample; ? Package name — com. samples. framelayout; ? Create Activity — FrameLayoutActivity. Откройте файл main.xml и создайте разметку, как в листинге 5.4. Разметку можнс создавать, используя Layout Editor, или вручную, написав ХМЬ-код, приведенный в листинге. <7xml version="l.0" encoding="utf-8"?>