Определение класса PuzzleView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Рисование игровой доски . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Рисование чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.3. Обработка ввода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Задание и обновление выделенной области . . . . . . . . . . . . . . . . . . . . . . . . . 81
Ввод чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Добавление подсказок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Встряска . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
4.4. Конец истории . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Создание экранной клавиатуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Создание игровой логики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Разное . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
4.5. Дополнительные улучшения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
4.6. Вперед >> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Глава 5. Мультимедиа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
5.1. Проигрывание аудио . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
5.2. Проигрывание видео . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.3. Добавление звуков в Sudoku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
5.4. Вперед >> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Глава 6. Хранение локальных данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
6.1. Добавление пункта Options в Sudoku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
6.2. Продолжение старой игры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
6.3. Запоминание текущей позиции курсора . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
6.4. Доступ к внешней файловой системе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
6.5. Доступ к SD-карте . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
6.6. Вперед>> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
ЧАСТЬ III. ЗА ПРЕДЕЛАМИ ОСНОВ
Глава 7. Объединенный мир . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
7.1. Просмотр ресурсов Интернета с помощью намерения . . . . . . . . . . . . . . . . . 119
7.2. Веб-браузер с вьювером . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
7.3. Из JavaScript в Java и обратно . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
7.4. Использование веб-сервисов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
7.5. Вперед>> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Глава 8. Определение местоположения и использование сенсоров . . . . . . 145
8.1. Места, места, места . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Где я? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Обновление информации о местоположении . . . . . . . . . . . . . . . . . . . . . . . . 149
Заметки об эмуляции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
8.2. Выжимаем все из сенсоров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Использование сенсоров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Интерпретация показаний сенсоров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Замечания об эмуляторе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
8.3. Взгляд с высоты птичьего полета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Встраивание MapView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Подготовка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Замечания об эмуляторе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
8.4. Вперед>> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Глава 9. Работа с SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
9.1. Введение в SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
9.2. SQL 101 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
DDL-запросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Modification-запросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Query-запросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
9.3. Привет, база данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Использование SQLiteOpenHelper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Создание основной программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Добавление строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Выполнение запросов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Отображение результатов запроса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
9.4. Связывание данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
9.5. Использование ContentProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Изменение основной программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Добавление строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Выполнение запроса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
9.6. Создание реализации ContentProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
9.7. Вперед>> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Глава 10. 3D-графика в OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
10.1. Основы 3D-графики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
10.2. Введение в OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
10.3. Создание OpenGL-программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
10.4. Рендеринг сцены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
10.5. Построение модели . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
10.6. Свет, камера… . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
10.7. Мотор! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
10.8. Применение текстур . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
10.9. Ку-ку . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
10.10. Измерение плавности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
10.11. Вперед>> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
ЧАСТЬ IV. СЛЕДУЮЩЕЕ ПОКОЛЕНИЕ
Глава 11. Мульти-тач . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
11.1. Введение в мульти-тач . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
11.2. Создание примера Touch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
11.3. Изучение событий касания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
11.4. Установки для трансформации изображения . . . . . . . . . . . . . . . . . . . . . . 207
11.5. Реализация обработки жеста перетаскивания . . . . . . . . . . . . . . . . . . . . . 208
11.6. Реализация обработки жеста изменения масштаба . . . . . . . . . . . . . . . . . . 209
Расстояние между двумя точками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Середина расстояния между двумя точками . . . . . . . . . . . . . . . . . . . . . . . . 211
11.7. Вперед>> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Глава 12. Нет места лучше дома . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
12.1. Привет, виджет . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Создание вашего первого виджета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Вызываем все виджеты! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Растягиваем по размеру . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Охватить и растянуть . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Запуск виджета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Обновление виджета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Уходим в отрыв . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
12.2. Интерактивные обои . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Создание проекта Wallpaper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Введение в сервисы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Создание механизма отрисовки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Повторное использование кода OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Создание и уничтожение механизма отрисовки . . . . . . . . . . . . . . . . . . . . . . 225
Управление поверхностью . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Делаем обои видимыми . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Обработка пользовательского ввода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
12.3. Вперед>> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Глава 13. Написав однажды, протестируй везде . . . . . . . . . . . . . . . . . . . . . . 232
13.1. Джентльмены, запустите ваши эмуляторы . . . . . . . . . . . . . . . . . . . . . . . . 233
13.2. Компоновка для множества версий Android . . . . . . . . . . . . . . . . . . . . . . . 234
13.3. Разворачивание программы на различных API Android . . . . . . . . . . . . . . . 235
13.4. Парад ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
13.5. Все экраны, большие и маленькие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
13.6. Установка на SD-карту . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
13.7. Вперед>> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Глава 14. Публикация на Android Market . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
14.1. Подготовка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
14.2. Подписывание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
14.3. Публикация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
14.4. Обновление . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
14.5. Заключительные положения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Часть V. Приложения
Приложение А. Сравнение языка API Java и Android . . . . . . . . . . . . . . . . . . . 252
А.1. Подмножество языка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Уровень языка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Встроенные типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Многопоточность и синхронизация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Рефлексия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Финализация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
A.2. Подмножество стандартных библиотек . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Поддерживаемые . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Неподдерживаемые . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Пакеты других производителей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Приложение Б. Библиография . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256