Аннотация: Разработка простого приложения, помогающего понять структуру приложения, освоить основные операторы, привыкнуть к среде разработки. Разработка простого приложения, помогающего понять структуру приложения, освоить основные операторы, привыкнуть к среде разработки.  

4.1 Введение Для достижения поставленной цели в лабораторной работе создадим приложение в среде разработки Android IDE (Eclipse и ADT), подробно рассмотрим структуру полученного проекта и разберем назначение основных его элементов. Чтобы дальнейшие действия приобрели некоторый смысл, сформулируем задачу, которую будет решать наше приложение, назовем его «Угадай число». Суть приложения в том, что программа случайным образом «загадывает» число от 0 до 100, а пользователь должен угадать это число. При каждом вводе числа, программа сообщает пользователю результат: введенное число больше загаданного, меньше или же «Ура, победа!» число угадано. Разрабатываемое приложение выполняет свои функции только когда видимо на экране, когда оно не видимо его работа приостанавливается, т. е. имеем дело с приложением переднего плана. Для выполнения всей работы достаточно определить одну активность в приложении, фоновые процессы не предусмотрены. Далее в работе рассмотрим простейшие элементы интерфейса пользователя и добавим их в приложение, а также рассмотрим вопросы, связанные непосредственно с программированием: научимся обрабатывать события, возникающие при взаимодействии приложения с пользователем; реализуем логику проверки числа на совпадение с загаданным.

4.2 Создание приложения и изучение его структуры Создайте новый проект в среде Android IDE (Eclipse с ADT). Процесс создания нового проекта и описание основных настроек подробно рассмотрен в лабораторной работе к первой лекции. В процессе создания проекта, мы назвали его ProjectN, среда разработки подготавливает необходимые папки и файлы. Полный иерархический список обязательных элементов проекта можно увидеть на вкладке Package Explorer (аналогичную информацию предоставляет вкладка Project Explorer), иерархия полученных папок и файлов для нашего проекта изображена на рис. 4.1. Структура проекта ProjectN

04_01sm

Рис. 4.1. Структура проекта ProjectN В настоящее время нас будет интересовать назначение нескольких файлов и папок.

Рассмотрим папки:папка src — содержит файлы с исходным кодом на языке Java. Именно в этой папке размещаются все классы, создаваемые в процессе разработки приложения. Сейчас в этой папке в пакете com.example.projectn размещается единственный класс FullscreenActivity.java. Этот класс определяет главную и единственную активность в этом приложении. Комментарий 1: Имя пакету присваивается в процессе создания приложения в поле Package Name, использовать com.example не рекомендуется, т. к. пакет с таким именем нельзя загрузить в Google Play. Часто рекомендуют использовать в качестве имени пакета название сайта программиста, записанное в обратном порядке, можно просто использовать свои имя и фамилию. Последнее слово в имени пакета формируется автоматически и совпадает с именем проекта. Комментарий 2: Имя файлу присваивается в процессе создания приложения на этапе настройки активности. Имя определяется в поле Activity Name. Комментарий 3: Package Explorer отображает структуру папок, которая создается в каталоге, выбранном в качестве рабочего (Workspace) при запуске Eclipse. Например, рабочий каталог называется workspaceADT, в нем для нашего проекта появилась папка с именем ProjectN, в ней есть папка src, в ней com, в ней example, в ней projectn (заметьте, что название пакета распалось на три папки, каждое слово, отделенное точкой определило новую папку). И уже в папке projectn находится файл MainActivity.java и будут размещаться другие java-файлы проекта. папка gen — содержит java-файлы, которые не требуется изменять и лучше вообще не трогать. Эти файлы генерируются автоматически. Нас может заинтересовать файл R.java он содержит идентификаторы (ID) для всех ресурсов приложения. папка res — содержит структуру папок ресурсов приложения, рассмотрим некоторые из них: layout — в данной папке содержатся xml-файлы, которые описывают внешний вид форм и их элементов, пока там находится только activity_main.xml; values — содержит XML файлы, которые определяют простые значения, таких ресурсов как, строки, числа, цвета, темы, стили, которые можно использовать в данном проекте; menu — содержит XML файлы, которые определяют все меню приложения. Рассмотрим файл AndroidManifest.xml — файл в формате xml, который описывает основные свойства проекта, разрешение на использование ресурсов устройства и др. Сразу после создания приложения файл AndroidManifest.xml выглядит так, как показано на рис. 4.2. Файл AndroidManifest.xml только созданного проекта

04_02sm

Рис. 4.2. Файл AndroidManifest.xml только созданного проекта Рассмотрим подробно файл манифеста. Первый обязательный элемент является корневым элементом файла, должен содержать обязательный элемент и все остальные элементы по необходимости. Рассмотрим основные атрибуты этого элемента: xmlns:android — определяет пространство имен Android, всегда должен иметь значение: «http://schemas.android.com/apk/res/android». Обязательный атрибут. package — полное имя пакета, в котором располагается приложение. Обязательный атрибут. Имя должно быть уникальным, может содержать заглавные и строчные латинские буквы, числа и символ подчеркивания. Однако начинаться должно только с буквы. Для избежания конфликтов с другими разработчиками рекомендуется использовать имя вашего сайта (если он есть) записанное в обратном порядке. В нашем случае пакет имеет имя «com.example.projectn» и наше приложение не удастся разместить в Google Play (но мы на это и не претендуем). Внимание: если Вы опубликовали свое приложение, Вы не можете менять имя пакета, т.к. имя пакета служит уникальным идентификатором для приложения и в случае его смены приложение будет рассматриваться, как совсем другое и пользователи предыдущей версии не смогут его обновить. android:versionCode — внутренний номер версии приложения не виден пользователю. Этот номер используется только для определения является ли одна версия более современной по сравнению с другой, больший номер показывает более позднюю версию. android:versionNumber — номер версии, является строкой и используется только для того, чтобы показать пользователю номер версии приложения. android:shareUserID, android:sharedUserLabel, android:installLocation — эти атрибуты в нашем файле манифеста не представлены, про их назначение можно почитать по ссылке: http://developer.android.com/guide/topics/manifest/manifest-element.html. Рассмотрим элемент , который показывает совместимость приложения с версиями Android. Основные атрибуты: android:minSdkVersion — указывает значение минимального уровня API, необходимого для работы приложения. Система Android не позволит установить приложение, если уровень API ниже, чем уровень, указанный в этом атрибуте. Внимание: если этот атрибут не указан, система установит значение по умолчанию равным «1», которое означает, что приложение совместимо со всеми версиями Android. И в случае, если приложение не совместимо со всеми версиями, установка пройдет на любую версию Android, а во время работы приложение сломается, когда попытается обратиться к недоступным элементам API. Поэтому необходимо всегда указывать значение этого атрибута. android:targetSdkVersion — указывает уровень API целевой платформы Android приложения, если этот атрибут пропущен, по умолчанию принимается значение android:minSdkVersion. android:maxSdkVersion — указывает максимальное значение уровня API, под который разрабатывалось приложение. Если значение этого атрибута ниже, чем уровень API соответствующий версии Android, на которую устанавливается приложение, то система не позволит установить такое приложение. Если внимательно посмотреть на файл манифеста рис. 4.2, можно заметить, что данный атрибут в нем отсутствует. На самом деле разработчики не рекомендуются задавать значение этого атрибута. Во-первых, это значение будет препятствовать использованию приложений на новых версиях Android при их появлении, несмотря на то, что все новые версии полностью обратно-совместимы. Во-вторых, стоит иметь ввиду, что задание этого атрибута может привести к тому, что приложение будет удалено с устройства после обновления Android до более высокого уровня API. Подробнее с элементом и его атрибутами можно ознакомиться по ссылке: http://developer.android.com/guide/topics/manifest/uses-sdk-element.html. Рассмотрим элемент , который является обязательным элементом манифеста, полностью определяет состав приложения. Представляет собой контейнер для элементов , , , (и не только), каждый из которых определяет соответствующий компонент приложения. Содержит набор атрибутов, действие которых распространяется на все компоненты приложения. Рассмотрим атрибуты элемента , представленные в манифесте на рис. 4.2: android:allowBackup — определяет разрешение для приложения участвовать в резервном копировании и восстановлении. Если значение этого атрибута false, то для приложения никогда не может быть создана резервная копия, даже если проводится резервное копирование всей системы целиком. По умолчанию значение этого атрибута равно true. android:icon — определяет иконку для приложения целиком, а также иконку по умолчанию для компонентов приложения, которая может быть переопределена атрибутом android:icon каждого компонента. Задается как ссылка на графический ресурс, содержащий изображение, в нашем случае значение этого атрибута равно «@drawable/ic_launcher». android:label — определяет видимый для пользователя заголовок приложения целиком, а также заголовок по умолчанию для компонентов приложения, который может быть переопределен атрибутом android:label каждого компонента. Задается как ссылка на строковый ресурс, в нашем случае значение атрибута равно «@string/app_name». android:theme — определяет тему по умолчанию для всех активностей приложения, может быть переопределен атрибутом android:theme каждой активности. Задается как ссылка на стилевой ресурс, в нашем случае значение атрибута равно «@style/AppTheme». На самом деле у элемента гораздо больше атрибутов, чем нам удалось рассмотреть, найти полный список атрибутов с описаниями можно по ссылке: http://developer.android.com/guide/topics/manifest/application-element.html. В приложении всего одна активность, других компонентов нет, в связи с этим элемент в манифесте содержит ровно один элемент и больше никаких других элементов не содержит. Рассмотрим элемент , который определяет активность. Для каждой активности обязательно необходим свой элемент в манифесте. Рассмотрим атрибуты элемента , представленные в манифесте на рис. 4.3: android:name — определяет имя класса, который задает активность. Значение атрибута должно полностью определять имя класса с указанием пакета, в котором располагается класс. В нашем случае атрибут имеет значение: «com.example.projectn.MainActivity». Можно использовать сокращенную запись «.MainActivity», в этом случае добавляется имя пакета, определенное соответствующим атрибутом элемента . android:configChanges — перечисляет изменения конфигурации, которыми может управлять активность. Если конфигурация меняется во время работы, то по умолчанию активность останавливается и перезапускается. Если же изменение конфигурации указано в этом атрибуте, то при появлении этого изменения активность не перезапускается, вместо этого она продолжает работать и вызывает метод onConfigurationChanged(). В нашем случае атрибут имеет значение «orientation|keyboardHidden|screenSize», т. е. при смене ориентации экрана, смене размера экрана и изменении доступности клавиатуры не произойдет перезапуск активности. android:label — определяет видимый пользователю заголовок активности, если он отличается от общего заголовка приложения. Задается как ссылка на строковый ресурс, в нашем случае значение атрибута равно «@string/app_name»(т.е. можно было и не задавать). android:theme — определяет тему активности, если она отличается от общей темы приложения, заданной соответствующим атрибутом элемента . Задается как ссылка на стилевой ресурс, в нашем случае значение атрибута равно «@style/FullscreenTheme». На самом деле у элемента гораздо больше атрибутов, чем нам удалось рассмотреть, найти полный список атрибутов с описаниями можно по ссылке: http://developer.android.com/guide/topics/manifest/application-element.html. В манифесте для нашего приложения элемент содержит ровно один элемент: , определяющий типы намерений, которые может принимать активность. Этот элемент содержит два элемента: и . Первый элемент определяет действия, которые проходят в фильтр намерений, при этом должен содержать хотя бы один элемент , в противном случае ни один объект-намерение не сможет пройти через фильтр и активность не возможно будет запустить. Элемент имеет единственный атрибут android:name=»android.intent.action.MAIN». Второй элемент определяет имя категории в фильтре намерений. Имеет единственный атрибут android:name=»android.intent.category.LAUNCHER». На этом разбор манифеста приложения закончим, подробно с описанием всех элементов этого файла можно познакомиться по ссылке: . Чаще всего, при создании приложения приходится иметь дело с папками src, res/layout и res/values, т.к. там находятся основные файлы проекта.     Более подробно здесь