Благодарности 16
Изучение Android 18
Глава 1. Первое приложение Android 24
Основы построения приложения 24
Создание проекта Android 25
Навигация в Eclipse 28
Построение макета пользовательского интерфейса 29
Иерархия представлений 33
Атрибуты виджетов 34
android:layout_width и android:layout_height 34
android:orientation 34
android:text 35
Создание строковых ресурсов 35
Предварительный просмотр макета 36
От разметки XML к объектам View 36
Ресурсы и идентификаторы ресурсов 37
Подключение виджетов к программе 40
Организация импорта 40
Получение ссылок на виджеты 41
Назначение слушателей 41
Анонимные внутренние классы 42
Уведомления 43
Автозавершение 44
Выполнение в эмуляторе 45
Для любознательных: процесс построения приложений Android 47
Средства построения программ Android 49
Глава 2. Android и MVC 51
Создание нового класса 52
Генерирование get­- и set-методов 53
Архитектура «Модель-Представление-Контроллер» и Android 55
Преимущества MVC 56
Обновление уровня представления 57
Обновление уровня контроллера 59
Запуск на устройстве 63
Подключение устройства 63
Настройка устройства для разработки 64
Добавление значка 64
Добавление ресурсов в проект 65
Ссылки на ресурсы в XML 66
Упражнения 67
Упражнение. Добавление слушателя для TextView 68
Упражнение. Добавление кнопки возврата 68
Упражнение. От Button к ImageButton 68
Глава 3. Жизненный цикл Activity 71
Регистрация событий жизненного цикла Activity 72
Создание сообщений в журнале 72
Использование LogCat 74
Повороты и жизненный цикл активности 78
Конфигурации устройств и альтернативные ресурсы 78
Создание макета для альбомной ориентации 79
Сохранение данных между поворотами 82
Переопределение onSaveInstanceState(Bundle) 83
Снова о жизненном цикле Activity 84
Для любознательных: тестирование onSaveInstanceState(Bundle) 85
Для любознательных: методы и уровни регистрации 87
Глава 4. Отладка приложений Android 89
Перспектива DDMS 90
Исключения и трассировка стека 91
Диагностика ошибок поведения 92
Сохранение трассировки стека 94
Установка точек прерывания 95
Прерывания по исключениям 99
File Explorer 100
Особенности отладки Android 101
Android Lint 101
Проблемы с классом R 103
Глава 5. Вторая активность 104
Создание второй активности 105
Создание нового макета 106
Создание нового субкласса активности 109
Объявление активностей в манифесте 110
Добавление кнопки Cheat в QuizActivity 111
Запуск активности 113
Передача информации через интенты 113
Интенты явные и неявные 115
Передача данных между активностями 115
Дополнения интентов 116
Получение результата от дочерней активности 118
Передача результата 119
Возвращение интента 120
Обработка результата 121
Ваши активности с точки зрения Android 123
Упражнение 125
Глава 6. Версии Android SDK и совместимость 126
Версии Android SDK 126
Совместимость и программирование Android 127
Трудности с Honeycomb 128
Минимальная версия SDK (Minimum Required SDK) 129
Целевая версия SDK (Target SDK) 130
Версия SDK для построения (Compile With) 130
Безопасное добавление кода для более поздних версий API 130
Подавление ошибок совместимости Lint 133
Документация разработчика Android 134
Упражнение. Вывод версии построения 136
Глава 7. UI-фрагменты и FragmentManager 138
Гибкость пользовательского интерфейса 139
Знакомство с фрагментами 140
Начало работы над CriminalIntent 141
Создание нового проекта 143
Фрагменты и библиотека поддержки 144
Создание класса Crime 146
Хостинг UI-фрагментов 147
Жизненный цикл фрагмента 148
Два способа организации хостинга 149
Определение контейнерного представления 149
Создание UI-фрагмента 151
Определение макета CrimeFragment 151
Создание класса CrimeFragment 152
Реализация методов жизненного цикла фрагмента 153
Подключение виджетов в фрагменте 155
Добавление UI-фрагмента в FragmentManager 156
Транзакции фрагментов 157
FragmentManager и жизненный цикл фрагмента 159
Почему все наши активности используют фрагменты 161
Для любознательных: разработка для Honeycomb, ICS, Jelly Bean и т. д. 161
Глава 8. Макеты и виджеты 163
Обновление Crime 163
Обновление макета 164
Подключение виджетов 166
Подробнее об атрибутах макетов XML 167
Стили, темы и атрибуты тем 167
Плотность пикселов, dp и sp 168
Рекомендации по проектированию интерфейсов Android 169
Параметры макета 170
Поля и отступы 170
Использование графического конструктора 171
Добавление нового виджета 173
Редактирование атрибутов в свойствах 174
Реорганизация виджетов на панели структуры 175
Обновление параметров макета потомков 176
Как работает android:layout_weight 177
Графический конструктор макетов 178
Идентификаторы виджетов и множественные макеты 178
Упражнение. Форматирование даты 179
Глава 9. Вывод списков и ListFragment 180
Обновление уровня модели CriminalIntent 181
Синглеты и централизованное хранение данных 182
Создание ListFragment 184
Абстрактная активность для хостинга фрагмента 185
Обобщенный макет для хостинга фрагмента 185
Абстрактный класс Activity 186
Использование абстрактного класса 188
Объявление CrimeListActivity 189
ListFragment, ListView и ArrayAdapter 191
Создание ArrayAdapter 193
Щелчки на элементах списка 195
Настройка элементов списка 196
Создание макета элемента списка 196
Создание субкласса адаптера 198
Глава 10. Аргументы фрагментов 202
Запуск активности из фрагмента 202
Включение дополнения 203
Чтение дополнения 204
Обновление представления CrimeFragment данными Crime 205
Недостаток прямой выборки 206
Аргументы фрагментов 206
Присоединение аргументов к фрагменту 207
Получение аргументов 208
Перезагрузка списка 208
Получение результата с использованием фрагментов 210
Глава 11. ViewPager 212
Создание CrimePagerActivity 213
Формирование макетов представлений в коде 214
Автономные идентификаторы ресурсов 214
ViewPager и PagerAdapter 215
Интеграция CrimePagerActivity 216
FragmentStatePagerAdapter и FragmentPagerAdapter 219
Для любознательных: как работает ViewPager 220
Глава 12. Диалоговые окна 223
Создание DialogFragment 225
Отображение DialogFragment 226
Назначение содержимого диалогового окна 228
Передача данных между фрагментами 229
Передача данных DatePickerFragment 230
Возвращение данных CrimeFragment 232
Назначение целевого фрагмента 233
Передача данных целевому фрагменту 234
Больше гибкости в представлении DialogFragment 236
Упражнение. Новые диалоговые окна 238
Глава 13. Воспроизведение звука и MediaPlayer 239
Добавление ресурсов 240
Определение макета HelloMoonFragment 242
Сброс темы приложения 243
Создание класса HelloMoonFragment 244
Использование фрагмента макета 244
Воспроизведение аудио 246
Подключение кнопок воспроизведения и остановки 248
Упражнение. Приостановка воспроизведения 248
Для любознательных: воспроизведение видео 249
Упражнение. Воспроизведение видео в HelloMoon 249
Глава 14. Сохранение фрагментов 250
Сохранение фрагмента 250
Повороты и сохраненные фрагменты 251
Сохранение фрагментов: действительно так хорошо? 253
Повороты и onSaveInstanceState(Bundle) 254
Для любознательных: повороты до появления фрагментов 256
Глава 15. Локализация 257
Локализация ресурсов 258
Ресурсы по умолчанию 258
Плотность пикселов и ресурсы по умолчанию 259
Конфигурационные квалификаторы 259
Приоритеты альтернативных ресурсов 260
Множественные квалификаторы 261
Поиск наиболее подходящих ресурсов 262
Исключение несовместимых каталогов 262
Перебор таблицы приоритетов 263
Дополнительные правила использования ресурсов 263
Имена ресурсов 264
Структура каталогов ресурсов 264
Тестирование альтернативных ресурсов 264
Глава 16. Панель действий 266
Командное меню 267
Определение командного меню в XML 268
Использование системных значков 270
Создание командного меню 270
Реакция на выбор команд 273
Включение иерархической навигации 275
Включение значка приложения 275
Обработка кнопки Up 277
Альтернативная команда меню 279
Создание альтернативного файла меню 280
Переключение текста команды 281
«Да, и еще одно…» 281
Упражнение. Пустое представление для списка 283
Глава 17. Сохранение и загрузка локальных файлов 285
Сохранение и загрузка данных в CriminalIntent 285
Сохранение преступлений в файле JSON 287
Создание класса CriminalIntentJSONSerializer 287
Поддержка сериализации JSON в классе Crime 288
Сохранение объектов Crime в CrimeLab 289
Сохранение данных приложения в onPause() 290
Загрузка данных из файловой системы 291
Упражнение. Использование внешнего хранилища 293
Для любознательных: файловая система Android и средства ввода-вывода Java 293
Обращение к файлам и каталогам 294
Глава 18. Контекстные меню и режим контекстных действий 295
Определение ресурса контекстного меню 296
Реализация контекстного меню 296
Создание контекстного меню 297
Регистрация контекстного меню 297
Реакция на действие 299
Реализация режима контекстных действий 300
Множественное выделение 301
Методы обратного вызова режима действий в представлении списка 301
Изменение фона выделенных элементов 304
Реализация режима контекстных действий в других представлениях 305
Совместимость: отход или дублирование? 306
Упражнение. Удаление из CrimeFragment 307
Для любознательных: ActionBarSherlock 307
Упражнение. Использование ActionBarSherlock 310
Базовая интеграция ABS в CriminalIntent 310
Интеграция более высокого уровня 311
Интеграция еще более высокого уровня 311
Глава 19. Камера I: Viewfinder 313
Создание макета фрагмента 315
Создание класса CrimeCameraFragment 316
Создание класса CrimeCameraActivity 317
Включение активности и разрешений камеры в манифест 317
Использование API камеры 318
Открытие и освобождение камеры 318
SurfaceView, SurfaceHolder и Surface 320
Определение размера области предварительного просмотра 323
Запуск CrimeCameraActivity из CrimeFragment 325
Скрытие панели состояния и панели действий 328
Для любознательных: запуск активностей из командной строки 329
Глава 20. Камера II: Съемка и обработка изображений 331
Получение снимка 332
Реализация обратных вызовов камеры 333
Назначение размера изображения 336
Передача данных CrimeFragment 337
Запуск CrimeCameraActivity с возвращением результата 337
Назначение результата в CrimeCameraFragment 338
Получение имени файла в CrimeFragment 339
Обновление уровня модели 340
Добавление класса Photo 340
Включение в Crime свойства для хранения фотографии 341
Сохранение ссылки на фотографию 342
Обновление представления CrimeFragment 342
Добавление ImageView 343
Обработка изображения 345
Добавление масштабированных фотографий в ImageView 345
Выгрузка изображения 347
Отображение полноразмерных изображений в DialogFragment 349
Упражнение. Ориентация изображения в Crime 351
Упражнение. Удаление фотографий 351
Для любознательных: устаревшие конструкции в Android 352
Глава 21. Неявные интенты 354
Добавление кнопок 355
Добавление имени в уровень модели 357
Форматные строки 357
Использование неявных интентов 359
Компоненты неявного интента 359
Отправка отчета 360
Запрос контакта у Android 362
Получение данных из списка контактов 364
Разрешения контактов 365
Проверка реагирующих активностей 366
Упражнение. Другой неявный интент 366
Глава 22. Двухпанельные интерфейсы 367
Гибкость макета 368
Модификация SingleFragmentActivity 369
Создание макета с двумя контейнерами фрагментов 370
Использование ресурса-псевдонима 371
Создание альтернативы для планшета 372
Активность: управление фрагментами 373
Интерфейсы обратного вызова фрагментов 374
Реализация CrimeFragment.Callbacks 378
Для любознательных: подробнее об определении размера экрана 381
Глава 23. Подробнее об интентах и задачах 383
Создание приложения NerdLauncher 383
Обработка неявного интента 385
Создание явных интентов на стадии выполнения 387
Задачи и стек возврата 389
Использование NerdLauncher в качестве домашнего экрана 391
Упражнение. Значки, изменение порядка задач 392
Для любознательных: процессы и задачи 392
Глава 24. Стили и включения 394
Создание проекта RemoteControl 395
Создание RemoteControlActivity 395
Создание RemoteControlFragment 396
Стили и компактность разметки 399
Завершение разметки 401
Для любознательных: include и merge 404
Упражнение. Наследование стилей 405
Глава 25. Графические объекты 406
Графические объекты XML 407
Списки состояний 409
Списки слоев и смещение 411
9-зонные изображения 413
Глава 26. HTTP и фоновые задачи 420
Создание приложения PhotoGallery 421
Основы сетевой поддержки 424
Разрешение на работу с сетью 425
Использование AsyncTask для выполнения в фоновом потоке 426
Главный программный поток 427
Кроме главного потока 428
Загрузка XML из Flickr 429
Использование XmlPullParser 433
От AsyncTask к главному потоку 435
Для любознательных: подробнее об AsyncTask 438
Уничтожение AsyncTask 439
Упражнение. Страничная навигация 439
Глава 27. Looper, Handler и HandlerThread 440
Подготовка GridView к выводу изображений 440
Множественные загрузки 443
Взаимодействие с главным потоком 443
Создание фонового потока 444
Сообщения и обработчики сообщений 446
Строение сообщения 447
Строение обработчика 447
Использование обработчиков 448
Передача Handler 451
Для любознательных: AsyncTask и потоки 455
Упражнение. Предварительная загрузка и кэширование 455
Глава 28. Поиск 457
Поиск в Flickr 457
Диалоговое окно поиска 459
Создание поискового интерфейса 459
Поисковые активности 462
Аппаратная кнопка поиска 464
Как работает поиск 465
Режимы запуска и новые интенты 465
Простое сохранение с использованием механизма общих настроек 467
Использование SearchView в Android версий выше 3.0 470
Упражнения 472
Глава 29. Фоновые службы 474
Создание IntentService 474
Зачем нужны службы 477
Безопасные сетевые операции в фоновом режиме 477
Поиск новых результатов 478
Отложенное выполнение и AlarmManager 480
PendingIntent 482
Управление сигналами с использованием PendingIntent 482
Управление сигналом 483
Обновление элемента командного меню 484
Оповещения 486
Для любознательных: подробнее о службах 488
Что делают (и чего не делают) службы 488
Жизненный цикл службы 488
Незакрепляемые службы 488
Закрепляемые службы 489
Привязка к службам 489
Локальная привязка к службам 490
Удаленная привязка к службе 491
Глава 30. Широковещательные интенты 492
Пробуждение при загрузке 493
Широковещательные приемники в манифесте 493
Использование приемников 495
Фильтрация оповещений переднего плана 496
Отправка широковещательных интентов 496
Динамические широковещательные приемники 497
Закрытые разрешения 500
Подробнее об уровнях защиты 502
Получение результатов с упорядоченной широковещательной рассылкой 503
Приемники и продолжительные задачи 507
Глава 31. Просмотр веб-страниц и WebView 508
И еще один блок данных Flickr 508
Простой способ: неявные интенты 510
Более сложный способ: WebView 510
Класс WebChromeClient 514
Повороты в WebView 516
Для любознательных: внедрение объектов JavaScript 517
Глава 32. Пользовательские представления и события касания 519
Создание проекта DragAndDraw 520
Создание класса DragAndDrawActivity 520
Создание класса DragAndDrawFragment 521
Создание нестандартного представления 522
Создание класса BoxDrawingView 522
Обработка событий касания 524
Отслеживание перемещений между событиями 525
Рисование внутри onDraw(…) 527
Упражнение: повороты 530
Глава 33. Отслеживание местоположения устройства 531
Создание приложения RunTracker 531
Создание класса RunActivity 533
Класс RunFragment 533
Добавление строк 534
Файл макета 534
Создание класса RunFragment 534
Местоположение и LocationManager 535
Получение широковещательных обновлений местоположения 537
Обновление пользовательского интерфейса данными местоположения 539
Ускорение отклика: последнее известное местоположение 543
Тестирование на реальных и виртуальных устройствах 544
Глава 34. Локальные базы данных и SQLite 547
Хранение серий и позиций в базе данных 547
Запрос списка серий из базы данных 554
Вывод списка серий с использованием CursorAdapter 556
Создание новых серий 559
Работа с существующими сериями 561
Упражнение: выделение текущей серии 567
Глава 35. Асинхронная загрузка данных 568
Loader и LoaderManager 568
Использование загрузчиков в RunTracker 570
Загрузка списка серий 570
Загрузка одной серии 574
Загрузка последней позиции в серии 577
Глава 36. Карты 579
Добавление Maps API в приложение RunTracker 579
Тестирование на реальном устройстве 579
Установка и использование Google Play services SDK 579
Получение ключа Google Maps API 580
Обновление манифеста RunTracker 580
Вывод местоположения пользователя на карте 581
Вывод маршрута 585
Добавление маркеров начала и конца маршрута 589
Упражнение: оперативное обновление 590
Глава 37. Послесловие 591
Последнее упражнение 591
Бессовестная самореклама 592
Спасибо 592