Главная страница
Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей
qrcode

Программирование под Android. Для профессионалов


Скачать 19.35 Mb.
НазваниеПрограммирование под Android. Для профессионалов
АнкорBrayn Khardi Bill Fillips - Programmirovanie po.
Дата23.05.2017
Размер19.35 Mb.
Формат файлаpdf
Имя файлаBrayn_Khardi_Bill_Fillips_-_Programmirovanie_po.pdf
оригинальный pdf просмотр
ТипДокументы
#21061
страница13 из 55
КаталогОбразовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей
Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей
1   ...   9   10   11   12   13   14   15   16   ...   55
Глава 5. Вторая активность
Нажатие кнопки Back
Нажатие кнопки
Cheat!
Рис. 5.13. Стек GeoQuiz
Вызов
Activity.finish()
в
CheatActivity также выводит
CheatActivity из стека.
Если запустить GeoQuiz из Eclipse и нажать кнопку
Back в QuizActivity, то актив- ность
QuizActivity будет извлечена из стека и вы вернетесь к последнему экрану, который просматривался перед запуском GeoQuiz.
Нажатие кнопки
Back
Запуск GeoQuiz из Eclipse
Рис. 5.14. Экран Home при запуске из Eclipse
Если вы запустили GeoQuiz из лаунчера (launcher), то нажатие кнопки
Back из
QuizActivity вернет вас обратно.

Упражнение
125
Нажатие кнопки
Back
Запуск GeoQuiz
Рис. 5.15. Запуск GeoQuiz из лаунчера
Нажатие
Back в запущенном лаунчере вернет вас к экрану, который был открыт перед его запуском.
Мы видим, что
ActivityManager поддерживает стек возврата (back stack) и что этот стек не ограничивается активностями вашего приложения. Он совместно используется активностями всех приложений; это одна из причин, по которым
ActivityManager участвует в запуске активностей и находится под управлением
ОС, а не вашего приложения. Стек представляет использование ОС и устройства в целом, а не использование одного приложения.
Упражнение
Мошенники никогда не выигрывают… Если, конечно, им не удастся обойти вашу защиту от мошенничества. А скорее всего, они так и сделают — именно потому, что они мошенники.
Приложение GeoQuiz содержит ряд «лазеек», которыми могут воспользоваться мошенники. В этом упражнении вы должны устранить эти лазейки. Основные дефекты приложения перечислены ниже по возрастанию сложности, от самых простых к самым сложным:

Подсмотрев ответ, пользователь может повернуть
CheatActivity
, чтобы сбро- сить результат.

После возвращения пользователь может повернуть
QuizActivity
, чтобы сбро- сить флаг mIsCheater

Пользователь может нажимать кнопку
Next до тех пор, пока вопрос, ответ на который был подсмотрен, снова не появится на экране.
Удачи!

Версии Android SDK
и совместимость
Теперь, после «боевого крещения» с приложением GeoQuiz, пора поближе по- знакомиться с разными версиями Android. Информация этой главы пригодится вам в следующих главах книги, когда мы займемся разработкой более сложных и реалистичных приложений.
Версии Android SDK
В таблице 6.1 перечислены версии SDK, соответствующие версии прошивки And- roid, и процент устройств, использующих их, по состоянию на март 2013 года.
Таблица 6.1. Уровни API Android, версии прошивки и процент устройств
Уровень
API
Кодовое название
Версия прошивки
устройства
% использующих
устройств
17
Jelly Bean
4.2 1,6 16 4.1 14,9 15
Ice Cream Sandwich (ICS)
4.0.3, 4.0.4 28,6 13
Honeycomb (только для планшетов)
3.2 0,9 12 3.1.x
0,3 10
Gingerbread
2.3.3–2.3.7 43,9 9
2.3.3, 2.3.1, 2.3 0,2 8
Froyo
2.2.x
7,5 7
Eclair
2.1.x
1,9
6

Совместимость и программирование Android
127
За каждым выпуском с кодовым названием следуют инкрементные выпуски. На- пример, платформа Ice Cream Sandwich was изначально выпущена как Android 4.0
(API уровня 14) и почти немедленно заменена инкрементными выпусками, кото- рые в конечном итоге привели к появлению Android 4.0.3 и 4.0.4 (API уровня 15).
Конечно, проценты из табл. 6.1 будут изменяться, но в них проявляется важная за- кономерность: устройства Android со старыми версиями не подвергаются немедлен- ному обновлению или замене при появлении новой версии. По состоянию на март
2013 года на половине устройств все еще работали версии Froyo или Gingerbread
SDK. Версия Android 2.3.7 (последнее обновление Gingerbread) была выпущена в сентябре 2011 года. С другой стороны, версия Android 4.2, выпущенная в ноябре
2012, работает только на 1,6 % устройств.
(Обновленные данные из таблицы доступны по адресу https://developer.android.com/
resources/dashboard/platform-versions.html
.)
Почему на многих устройствах продолжают работать старые версии Android?
В основном из-за острой конкуренции между производителями устройств Android и операторами сотовой связи. Операторы стремятся иметь возможности и теле- фоны, которых нет у других сетей. Производители устройств тоже испытывают давление — все их телефоны базируются на одной ОС, но им нужно выделяться на фоне конкурентов. Сочетание этого давления со стороны рынка и операторов сотовой связи привела к появлению многочисленных устройств со специализиро- ванными модификациями Android.
Устройство со специализированной версией Android не сможет перейти на новую версию, выпущенную Google. Вместо этого ему придется ждать совместимого «фир- менного» обновления, которое может выйти через несколько месяцев после выпуска версии Google… А может вообще не выйти — производители часто предпочитают расходовать ресурсы на новые устройства, а не на обновление старых устройств.
Иногда оборудованию старого устройства попросту не хватает производительности для запуска новой версии Android.
Совместимость и программирование Android
Из-за задержек обновления в сочетании с регулярным выпуском новых версий со- вместимость становится важной проблемой в программировании Android. Чтобы привлечь широкую аудиторию, разработчики Android должны создавать приложе- ния, которые хорошо работают на устройствах с разными версиями Android: Froyo,
Gingerbread, Honeycomb, Ice Cream Sandwich и Jelly Bean, а также на устройствах различных форм-факторов.
Поддержка разных размеров не столь сложна, как может показаться. Экраны телефо- нов существуют во многих вариантах размеров, но система макетов Android хорошо приспосабливается к ним. С планшетами дело обстоит сложнее, но в этом случае на помощь приходят квалификаторы конфигураций (как будет показано в главе 22).
Впрочем, для Google TV (также работающим под управлением Android) различия в пользовательском интерфейсе настолько серьезны, что обычно приходится ис- пользовать отдельное приложение.

128
Глава 6. Версии Android SDK и совместимость
Версии — совсем другое дело. С инкрементными выпусками обратная совместимость обычно не создает проблем, однако в истории был один особенно принципиальный сдвиг.
Трудности с Honeycomb
Самые большие проблемы с совместимостью Android связаны с преодолением гра- ницы между «мирами» до и после Honeycomb. Выпуск Honeycomb стал поворотным моментом в Android, ознаменовавшим появление нового пользовательского интер- фейса и новых архитектурных компонентов. Версия Honeycomb предназначалась только для планшетов и Google TV, количество ее пользователей было ограничено, так что новые разработки получили массовое распространение только с выходом Ice
Cream Sandwich. Версии, выходившие после этого, были менее революционными.
Учитывая, что больше половины устройств все еще работает под управлением
Gingerbread или более старых версий, разработчики не могут начать «с чистого листа» и отказаться от того, что было раньше. Со временем доля старых устройств сокращается, но это происходит намного медленнее, чем можно представить.
Следовательно, разработчик Android должен выделить время на обеспечение об- ратной совместимости и преодоление разрыва между Gingerbread (API уровня 10) и Honeycomb (API уровня 11). Android предоставляет поддержку для поддержания обратной совместимости; также существуют сторонние библиотеки, которые помо- гают в решении этой задачи. Тем не менее поддержание совместимости усложняет изучение программирования Android.
Нередко разработчику приходится изучать два способа выполнения некоторой операции, а также учиться объединять их. В других случаях способ всего один, но он выглядит чрезмерно усложненным, потому что ориентируется на два (как минимум) набора требований.
Мы рекомендуем погрузиться в сон на пару лет (если получится, конечно). Потом вы проснетесь и начнете изучать программирование Android, когда устройства
Gingerbread уже не будут составлять значимую долю рынка. А если это невозможно, постарайтесь хотя бы понять причины некоторых сложностей.
При создании проекта GeoQuiz в мастере нового приложения выбираются три версии SDK. (Учтите, что в Android термины «версия SDK» и «уровень API» яв- ляются синонимами.)
Давайте посмотрим, какое место в проекте занимает каждая из этих настроек, из- учим значения по умолчанию и способы их изменения.
Минимальная необходимая версия SDK (
Minimum
Required
SDK
) и целевая версия
SDK (
Target
SDK
) задаются в манифесте. Еще раз откройте
AndroidManifest.xml из
Package
Explorer
. В элементе uses-sdk найдите значения android:minSdkVersion и android:targetSdkVersion
Листинг 6.1. minSdkVersion в манифесте (AndroidManifest.xml)

package="com.bignerdranch.android.geoquiz"

Совместимость и программирование Android
129
android:versionCode="1"
android:versionName="1.0" >
android:targetSdkVersion="17" />

Рис. 6.1. Еще не забыли?
Минимальная версия SDK (Minimum Required SDK)
Вспомните, что манифест содержит метаданные, используемые ОС для взаимодей- ствия с вашим приложением. Значение minSdkVersion определяет нижнюю границу, за которой ОС отказывается устанавливать приложение.
Выбирая API уровня 8 (Froyo), вы разрешаете Android устанавливать GeoQuiz на устройствах с версией Froyo и выше. Android откажется устанавливать GeoQuiz на устройстве, допустим, с системой Eclair.
Снова обращаясь к табл. 6.1, мы видим, почему Froyo является хорошим выбором для минимальной версии SDK: в этом случае приложение можно будет устанав- ливать на 95 % используемых устройств.

130
Глава 6. Версии Android SDK и совместимость
Целевая версия SDK (Target SDK)
Значение targetSdkVersion сообщает Android, для какого уровня API проектирова- лось ваше приложение. Чаще всего в этом поле указывается новейшая версия Android.
Когда следует понижать целевую версию SDK? Новые выпуски SDK могут из- менять внешний вид вашего приложения на устройстве и даже поведение ОС «за кулисами». Если ваше приложение уже спроектировано, убедитесь в том, что в новых версиях оно работает так, как ожидалось. За информацией о возможных проблемах обращайтесь к документации по адресу https://developer.android.com/
reference/android/os/Build.VERSION_CODES.html
. Далее либо измените свое при- ложение, чтобы оно работало с новым поведением, либо понизьте целевую версию
SDK. Понижение целевой версии SDK гарантирует, что приложение будет работать с внешним видом и поведением целевой версии, в которой оно хорошо работало.
Все изменения последующих версий при этом игнорируются.
Версия SDK для построения (Compile With)
В последнем поле для выбора SDK (
CompileWith на рис. 6.1) вводится версия SDK для построения. В манифесте этот параметр отсутствует. Если минимальная и целевая версии SDK сообщаются ОС, версия SDK для построения относится к закрытой информации, известной только вам и компилятору.
Функциональность Android используется через классы и методы SDK. Версия
SDK, используемая для построения, также называемая целью построения (build target), указывает, какая версия должна использоваться при построении вашего кода. Когда Eclipse ищет классы и методы, на которые вы ссылаетесь в директивах импорта, версия SDK для построения определяет, в какой версии SDK будет осу- ществляться поиск.
Чтобы сменить цель построения, щелкните правой кнопкой мыши на проекте
GeoQuiz на панели
Package
Explorer и выберите команду
Properties
. В левой части диа- логового окна выберите категорию
Android
; открывается полный список вариантов.
Чем отличаются цели построения
Google
APIs и
Android
Open
Source
Project
? Google
APIs включает Android API и дополнения Google — прежде всего API для работы с Google Maps.
Цель построения GeoQuiz выбрана нормально. Щелкните на кнопке
Cancel
, будем двигаться дальше.
Безопасное добавление кода
для более поздних версий API
Различия между минимальной версией SDK и версией SDK для построения соз- дают проблемы совместимости, которыми необходимо управлять. Например, что произойдет в GeoQuiz при выполнении кода, рассчитанного на версию SDK после минимальной версии Froyo (API уровня 8)? Если установить такое приложение и запустить его на устройстве Froyo, произойдет сбой.

Совместимость и программирование Android
131
Рис. 6.2. Изменение цели построения
Раньше тестирование в подобных ситуациях было сущим кошмаром. Однако благо- даря совершенствованию Android Lint проблемы, вызванные вызовом нового кода на старых устройствах, теперь успешно обнаруживаются. Если вы используете код версии, превышающей минимальную версию SDK, Android Lint сообщит об ошибке построения.
Весь код текущей версии GeoQuiz совместим с API уровня 8 и ниже. Добавим код
API уровня 11 и посмотрим, что произойдет.
Откройте файл
QuizActivity.java
. Включите в метод onCreate(Bundle)
следующий фрагмент для создания подзаголовка с указанием географической области, к ко- торой относится вопрос.
Листинг 6.2. Добавление подзаголовка (QuizActivity.java)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate() called");
setContentView(R.layout.activity_quiz);
продолжение


132
Глава 6. Версии Android SDK и совместимость
Листинг 6.2 (продолжение)
ActionBar actionBar = getActionBar();
actionBar.setSubtitle("Bodies of Water");
mIsCheater = false;
Строковый литерал используется для простоты. Если бы нам действительно по- требовалось выводить подзаголовок (или даже разные подзаголовки для разных групп вопросов), то следовало бы добавить в программу строковые ресурсы и ис- пользовать ссылки на них в коде.
Проведите организацию импорта, чтобы импортировать класс
ActionBar
. Этот класс появился в API уровня 11, поэтому при попытке выполнения кода на устройстве с более ранней версией произойдет сбой. Мы еще вернемся к классу
ActionBar в главе 16, а пока просто используем его как пример кода, не поддерживаемого Froyo.
После организации импорта выберите GeoQuiz на панели
Package
Explorer и выполните команду
Android
Tools

Run
Lint:
Check for
Common
Errors
. Так как для построения исполь- зуется API уровня 17, у компилятора не возникнет проблем с этим кодом. С другой стороны, Android Lint знает минимальную версию SDK и будет протестовать.
Сообщения об ошибках будут выглядеть примерно так: «Class requires API level 11
(current min is8)». Android Lint не позволит построить приложение до тех пор, пока не будет решена проблема совместимости.
Как избавиться от ошибок? Первый способ — поднять минимальную версию SDK до 11. Однако тем самым вы не столько решаете проблему совместимости, сколь- ко обходите ее. Если ваше приложение не может устанавливаться на устройствах
Gingerbread и более старых устройствах, то проблема исчезает.
Другое, более правильное решение — заключить код
ActionBar в условную кон- струкцию, которая проверяет версию Android на устройстве.
Листинг 6.3. Предварительная проверка версии Android на устройстве
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate() called");
setContentView(R.layout.activity_quiz);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
ActionBar actionBar = getActionBar();
actionBar.setSubtitle("Bodies of Water");
}
}
Константа
Build.VERSION.SDK_INT
определяет версию Android на устройстве. Она сравнивается с константой, соответствующей Honeycomb. (Коды версий доступны по адресу https://developer.android.com/reference/android/os/Build.VERSION_CODES.
html
.)
Теперь код
ActionBar будет выполняться только в том случае, если приложение работает на устройстве с версией Honeycomb и выше. Код стал безопасным для

Совместимость и программирование Android
133
Froyo, вроде бы у Android Lint не на что жаловаться. Однако попытавшись запустить приложение снова, вы получите ту же ошибку.
Подавление ошибок совместимости Lint
К сожалению, Android Lint не может понять, что вы сделали, поэтому выдачу ошиб- ки придется подавить явно. Включите следующую аннотацию перед реализацией onCreate(Bundle)
Листинг 6.4. Полезная информация для Android Lint
@TargetApi(11)
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate() called");
setContentView(R.layout.activity_quiz);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
ActionBar actionBar = getActionBar();
actionBar.setSubtitle("TFFTT");
}
}
Рис. 6.3. Приложение с подзаголовком
Чтобы понять, почему команда if должна дополняться аннотацией, представьте программирование Android в виде пляжа. В воде плавают акулы — исключения времени выполнения от использования новых методов или классов на старых устройствах. Android Lint — спасатель на этом пляже. Он следит за обстановкой, всегда готовый прыгнуть вводу и спасти вас, если поблизости окажется акула.

134
Глава 6. Версии Android SDK и совместимость
Код в листинге 6.4 использует химический репеллент для акул и отмахивается от спасателя. Команда if
— это ваш репеллент: метод getActionBar()
, заключенный в конструкцию if
, вызывается только в случае его доступности, и акулы на вас не нападут. Аннотация
@TargetApi(11)
как бы отмахивается от спасателя (Android
Lint), говоря ему: «Не обращай внимания на акул — у меня все под контролем».
Спасатель решает, что вам виднее, и не пытается вытаскивать вас из воды.
Итак, если вы отмахиваетесь от спасателя аннотацией
@TargetApi
, пожалуйста, не забудьте про свой репеллент
SDK_INT
. Если вы этого не сделаете, вас съедят акулы исключений.
Запустите GeoQuiz на устройстве с версией Honeycomb и выше и проверьте новый подзаголовок.
Также можно запустить GeoQuiz на устройстве Froyo или Gingerbread (виртуаль- ном или физическом). Подзаголовок в этом случае не отображается, но вы можете убедиться в том, что приложение работает нормально.
Документация разработчика Android
Ошибки Android Lint сообщают, к какому уровню API относится несовместимый код.
Однако вы также можете узнать, к какому уровню API относятся конкретные классы и методы, — эта информация содержится в документации разработчика Android.
Постарайтесь поскорее научиться работать с документацией. Информация Android
SDK слишком обширна, чтобы держать ее в голове, а с учетом регулярного по- явления новых версий разработчик должен знать, что нового появилось, и уметь пользоваться этими новшествами.
Документация разработчика Android — превосходный и объемный источник ин- формации. Ее главная страница находится по адресу https://developer.android.com/.
Документация делится на три части: проектирование (Design), разработка (Develop) и распространение (Distribute). В разделе проектирования описаны паттерны и принципы проектирования пользовательского интерфейса приложений. В разделе разработки содержится основная документация и учебные материалы. В разделе распространения объясняется, как готовить и публиковать приложения в Google
Play или через механизм открытого распространения. Все это стоит просмотреть, когда у вас появится возможность.
Раздел разработки дополнительно разбит на четыре секции.
Android Training
Учебные модули для начинающих и опытных разработчиков, включая загру- жаемый код примеров
API Guides
Тематические описания компонентов приложений, функций и полезных при- емов
Reference
Гипертекстовая документация по всем классам, методам, интерфейсам, кон- стантам атрибутов и т. д. в SDK, с возможностью поиска
Tools
Описания и ссылки на инструменты разработчика

Документация разработчика Android
135
Для работы с документацией не обязательно иметь доступ к Интернету. Откройте в файловой системе каталог, в который были загружены SDK; в нем расположен каталог docs с полной документацией.
Чтобы определить, к какому уровню API относится getActionBar()
, проведите поиск этого метода при помощи строки поиска в правом верхнем углу браузера. Первым результатом будет руководство по API с описанием строки заголовка.
Однако нам нужны результаты из справочной секции. Отфильтруйте результаты поиска, щелкнув на категории
Reference в левой части окна.
Выберите первый результат; открывается справочная страница с описанием класса
Activity
. В верхней части страницы находятся ссылки на разные секции. Щелкните на ссылке
Methods
, чтобы получить список методов
Activity
Рис. 6.4. Страница со справочным описанием Activity
Прокрутите список, найдите метод getActionBar()
и щелкните на имени метода, чтобы увидеть описание. Справа от сигнатуры метода видно, что метод getAction-
Bar()
появился в API уровня 11.
Если вы хотите узнать, какие методы
Activity доступны, скажем, в API уровня 8, отфильтруйте справочник по уровню API. В левой части страницы, где классы

136
1   ...   9   10   11   12   13   14   15   16   ...   55

перейти в каталог файлов

Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей

Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей