Android. Как изменить активность (activity) по умолчанию. Манифест приложения

Faq 05.05.2019
Faq

AndroidManifest.xml - необходимый файл для каждого приложения Android. Он расположен в папке приложения и описывает глобальные значения для Вашего пакета, включая прикладные компоненты (действия, службы, и т.д), который пакет выставляет ‘внешнему миру’, какие данные каждое из Activity приложения может обработать, и как они могут быть начаты.

Важная вещь к упоминанию об этом файле - свой так называемый IntentFilters. Эти фильтры описывают где и когда Activity может быть начат. Когда Activity (или операционная система) хочет выполнить действие, такое, как открыть Web-страницу или открыть экран выбора, это создает объект Intent. Этот Intent может хранить информацию, описывающую, что Вы хотите сделать, какие данные необходимы, чтобы достигнуть этого и другую информацию. Андроид сравнивает информацию в объекте Intent с IntentFilters, выставленным каждым приложением, и находит Activity, соответствующие, чтобы обработать данные или действия, определенные вызывающей программой. Если есть больше чем одно приложение, способное к обработке этого Intent , пользователя спрашивают, каким приложением он предпочел бы обрабатывать это.

Помимо объявления Activity, Content Provider, Service и Intent Receivers Вашего приложения, Вы можете также определить разрешения в AndroidManifest.xml.

Основное

Очень простой AndroidManifest.xml выглядит следующим образом:

android:label="@string/app_name">

Почти каждый AndroidManifest.xml (так же как многие другой Андроид файлы XML) будет включать объявление пространства имен в его первый элемент. Это делает множество стандартных атрибутов Андроид доступным в файле, который будет использоваться, чтобы снабдить большинством данных для элементов в том файле.

Почти каждый AndroidManifest.xml включает единственный тэг, который непосредственно содержит несколько тэгов, описывающих Applications, IntentReceivers, и т.д., которые доступны в этом приложении.

Если Вы хотите сделать Activity запускаемым непосредственно через пользователя, то Вы должны будете прописать ему поддержку действия MAIN и категории LAUNCHER. Результат как показано здесь:

Напрямую запускаемый Activity.

Дальше следует, детальный разбор структуры файла AndroidManifest с описыванием всех доступных , с примером для каждого. (Примеры не везде, но я точно ничего не потерял. И фраза “для каждого” в англ. версии (“for each”) тоже была. Не знаю, где они потеряли эти примеры. – прим. переводчика). Кто чей потомок, можно определить по отступу:

Это корневой узел каждого AndroisManifest.xml. Он содержит пакета атрибутов, который указывает на какой-то конкретный пакет в Activity (Получилось не совсем по-русски, но, вообщем, фишка в том, что в коде есть пакет Activity, а вот параметры этого пакета описаны в этом теге. - прим. переводчика). Другой путь к Activities будет базироваться относительно его значения.

Описывает разрешения безопасности, которы нужно предоставить Вашему пакету. Количество не ограничено.

Объявляет разрешение безопасности, которое может использоваться, чтобы указать, какие приложения могут обратиться к компонентам или особенностям в этом пакете. Количество не ограничено.

Объявляет код контрольно-измерительного компонента, который доступен, чтобы проверить функциональные возможности этого или другого пакета. См. Оснащение аппаратурой для большего количества подробностей. Количество не ограничено.

< application >

Корневой элемент, содержащий объявления компонентов на уровне, содержится в пакете. Этот элемент может также включать глобальные и/или заданные по умолчанию атрибуты для приложения, такие как метка, значок, тема, требование разрешения, и т.д. Количество – от нуля до единицы.

Activity - первичная вещь для приложения, чтобы взаимодействовать с пользователем. Экраном, который пользователь видит, запуская приложение, является Activity, и большинство других экранов, которые они используют, будет осуществлено как отдельные действия, объявленные с дополнительными тэгами Activity.

Примечание: у Каждой Activity должен быть тэг в manifest, выставлено ли это миру или предназначено для использования только в пределах собственного пакета. Если у Activity не будет никакого тэга соответствия в manifest, то Вы не сможете использовать ее.

Объявляет, какие Intent компонент поддерживает. В дополнение к различным видам значений, которые могут быть определены под этим элементом, атрибуты могут быть даны здесь, чтобы поставлять уникальную метку, значок, и другую информацию для описываемого действия.

Тип действия, который компонент поддерживает. Пример:

< category >

Тип MIME, URI схема или URI путь поддержки компонента.

Вы можете также связаться 1+ части метаданных с Вашим Activity:

Добавляет новую часть метаданных к Activity, которую клиенты могут восстановить через ComponentInfo.metaData.

IntentReceiver позволяет приложению сообщать о замене данных или о действиях, которые происходят, даже если приложение не выполняется в настоящее время. Как и с тэгом activity, в этот тег Вы можете произвольно включить больше одного или , так же, как с .

Service - компонент, который работает на заднем плане произвольное количество времени. В этот тег, как с тэгом activity, Вы можете произвольно включить один или более или .

ContentProvider - компонент, который управляет постоянными (persistent) данными и открывает к ним доступ другим приложениям. Вы можете также произвольно присоединить один или более , как и в activity. тут нету.

Конечно, все <теги> должны быть или так , или так, <напрямую/>.



AndroidManifest.xml – предоставляет подробную информацию о приложении. В каждом Android приложении вы должны в увидите этот файл, так как он является обязательным для создания приложения на ОС Android.

Предназначения

В AndroidManifest.xml можно настроить следующие возможности:

1. Указать имя Java-пакета приложения, который служит уникальным идентификатором;

2. Описать компоненты приложения, службы;

3. Указать список необходимых разрешений для обращения к защищенным частям API и взаимодействия с другими приложениями;

4. Разрешить доступ к ресурсам, которые сторонние приложения обязаны иметь для взаимодействия с компонентами данного приложения;

5. Указать минимальный и максимальный уровень API Android, необходимый для работы приложения;

Структура ‘AndroidManifest.xml’

Когда вы перейдете к написанию бослее сложного проекта, то вы заметите, что вам часто прейдется обращаться к этому файлу для того чтобы сконфигурировать какой-то из необходимых вам компонентов.

Но для того, чтобы там что-то конфигурировать думаю не плохо было бы знать, что и для чего нужно, именно об этом пойдет речь ниже.

Вот все основные возможности AndroidManifest.xml они представлены в виде xml тегов.

. . . . . . . . .

Примерно так выглядит манифест файл, где каждый из тегов может хранить какуе-то конфигурацию.

А теперь по очереди, что и для чего.

Тег

Это самый главный тег в котором вложена вся конфигурация проекта.

По умолчанию он создается вместе с файлом AndroidManifest и изначально имеет начальный набор параметров:

Что же значат эти параметры?

xmins:android – определяет пространство имен Android;

package – определяет уникальное имя пакета приложения, которое вы задали при создании проекта.

Для чего нужно указывать package? Если вы захотите загрузить ваше приложение на Google Play, то он проверяет уникальность при приеме приложения, поэтому рекомендуется использовать свое имя для избежания конфликтов с другими разработчиками.

android:versionCode – по сути это версия вашего приложения. Выпуская новую версию вы указываете её в этом поле, оно должно быть целым числом.

Выше мы говори про уникальность пакета, так вот если вы ранее загрузили на Google Play ваше приложение, то когда вы решите загрузить обновленную версию приложения, то вам нужно придерживаться нескольких правил. Имя пакета должно совпадать с тем, что уже загружено Google Play и указать версию android:versionCode на порядок выше. Но это при условии что вы выпускаете новую версию приложения, в случае если вы хотите добавить немного исправленную версию, то это читайте ниже.

Изменив данный параметр и загрузив приложение на Google Play все пользователям вашего приложения будет предложено обновится до новой версии приложения.

android:versionName – указывает номер пользовательской версии. Если вы нашли несколько недоработок в вашем приложении и исправили их, то в этом случае можно указать для этого поля новую версию, что будет говорить Google Play, что это не новая версия приложения, а улучшенная. Для именования версии можно использовать строку или строковый ресурс.

Изменив данный параметр и загрузив приложение на Google Play все пользователям вашего приложения будет предложено обновится до модифицированной версии приложения.

Тег

Тег позволяет вам запрашивать разрешение, которые приложению должны быть предоставлены системой для его нормального функционирования.

Разрешения предоставляются во время установки приложения, а не во время его работы. имеет единственный атрибут с именем разрешения android:name.

android:name – позволяет дать разрешения на использование ресурсов системы. Например:

android:name=’ android.permission.CAMERA’
или
android:name=’
android.permission.READ_CONTACTS’

Наиболее распространенные разрешения

INTERNET – доступ к интернету;

READ_CONTACTS – чтение данных из адресной книги пользователя;

– WRITE_CONTACTS – запись данных из адресной книги пользователя;

– RECEIVE_SMS – обработка входящих SMS;

– ACCESS_COARSE_LOCATION – использование приблизительного определения местонахождения при помощи вышек сотовой связи или точек доступа Wi-Fi;

– ACCESS_FINE_LOCATION – точное определение местонахождения при помощи GPS.

Тег

– позволяет установить разрешения на использования ресурсов системы или запретить использование компонентов приложения.

android:name – название разрешения

android:label – имя разрешения, отображаемое пользователю

android:description – описание разрешения

android:icon – значок разрешения

android:permissionGroup – определяет принадлежность к группе разрешений

android:protectionLevel – уровень защиты

Тег

– объявляет базовое имя для дерева разрешений.

Этот элемент объявляет не само разрешение, а только пространство имен, в которое могут быть помещены дальнейшие разрешения.

Тег

определяет имя для набора логически связанных разрешений.

Этот элемент не объявляет разрешение непосредственно, только категорию, в которую могут быть помещены разрешения.

Разрешение можно поместить в группу, назначив имя группы в атрибуте permissionGroup элемента

Тег

объявляет объект instrumentation , который дает возможность контролировать взаимодействие приложения с системой.

Обычно используется при отладке и тестировании приложения и удаляется из release-версии приложения.

Тег

позволяет объявлять совместимость приложения с указанной версией (или более новыми версиями API) платформы Android.

Уровень API, объявленный приложением, сравнивается с уровнем API системы мобильного устройства, на который инсталлируется данное приложение.

Данный тег имеет следующие атрибуты:

android:minSdkVersion – определяет минимальный уровень API, требуемый для работы приложения.

Система Android будет препятствовать тому, чтобы пользователь установил приложение, если уровень API системы будет ниже, чем значение, определенное в этом атрибуте. Вы должны всегда объявлять этот атрибут, например:

android:minSdkVersion =”17″

android:maxSDKVersion – позволяет определить самую позднюю версию, которую готова поддерживать ваше приложение.

Ваше приложение будет невидимым в Google Play для устройств с более свежей версией.

targetSDKVersion – позволяет указать платформу, для которой вы разрабатывали и тестировали приложение.

Устанавливая значение для этого атрибута, вы сообщаете системе, что для поддержки этой конкретной версии не требуется никаких изменений.

Тег

указывает требуемую для приложения аппаратную и программную конфигурацию мобильного устройства.

Например, приложение приложению для работы нужно наличие фронтальной камеры или USB порт. Спецификация используется, чтобы избежать установки приложения на устройствах, которые не поддерживают требуемую конфигурацию.

Если приложение может работать с различными конфигурациями устройства, необходимо включить в манифест отдельные элементы для каждой конфигурации. Вы можете задать любую комбинацию, содержащие следующие устройства

– reqHardKeyboard – используйте значение true , если приложению нужна аппаратная клавиатура;

– reqKeyboardType – позволяет задать тип клавиатуры: nokeys , qwerty , twelvekey , undefined;

– reqNavigation – укажите одно из значений: nonav , dpad , trackball , wheel или undefined , если требуется устройство для навигации;

Приложение не будет устанавливаться на устройстве, которое не соответствует заданной вами конфигурации.

В идеале, вы должны разработать такое приложение, которое будет работать с любым сочетанием устройств ввода. В этом случае не нужен.

Тег

объявляет определенную функциональность, требующуюся для работы приложения.

Таким образом, приложение не будет установлено на устройствах, которые не имеют требуемую функциональность. Например, приложение могло бы определить, что оно требует фронтальную камеру с автофокусом. Если устройство не имеет встроенную фронтальную камеру с автофокусом, приложения не будет инсталлировано.

android.hardware.camera.front – требуется аппаратная камера

android.hardware.camera.autofocus – требуется камера с автоматической фокусировкой

В офф. документации Android можно посмотреть все параметры, вот ссылка .

Можно переопределить требование по умолчанию, добавив атрибут required со значением false .

Например, если вашей программе не нужно, чтобы камера поддерживала автофокус:

Тег

определяет разрешение экрана, требуемое для функционирования устройства.

Данный тег позволяет указать размеры экран, для которого было создано приложение. Система будет масштабировать ваше приложение на основе ваших макетов на тех устройствах, которые поддерживают указанные вами разрешения экран.

Для других случаев система будет растягивать макет по мере возможности.

Значения:

smallScreen – QVGA экраны

normalScreen – стандартные экраны HVGA и WQVGA

largeScreen – большие экраны

xlargeScreen – очень большие экраны, которые превосходят размеры планшетов

anyDensity – установите значение true , если ваше приложение способно масштабироваться для отображения на экране с любым разрешением.

По умолчанию, для каждого атрибута установлено значение true . Вы можете указать, какие размеры экранов ваше приложение не поддерживает.

Начиная с API 13 – Android 3 , у тега появились новые атрибуты:

requiresSmallestWidthDp – указываем минимальную поддерживаемую ширину экрана в аппаратно-независимых пикселях. С его помощью можно отфильтровать устройства при размещении приложения в Google Play

compatibleWidthLimitDp – задаёт верхнюю границу масштабирования для вашего приложения. Если экран устройства выходит за указанную границу, система включит режим совместимости.

largestWidthLimitDp – задаёт абсолютную верхнюю границу, за пределами которой ваше приложение точно не может быть смаштабировано. В этом случае приложение запускается в режиме совместимости, которую нельзя отключить.

Пример использования:

Следует избегать подобных ситуаций и разрабатывать макеты для любых экранов.

Тег

указывает для каждого экрана конфигурацию, с которой оно совместимо. Только один экземпляр элемента допускается в манифесте, но он может содержать несколько элементов .

Каждый элемент указывает конкретный размер экрана с которой приложение совместимо.

Этот элемент является информационным и может быть использован внешние услуги (например, Google Play), чтобы лучше понять совместимость приложения с конкретными конфигурациями экрана и включить фильтрацию для пользователей.

Данный тех имеет два атрибута:

android:screenSize – указывает размер экрана.

Значения:

small – маленький;

normal – средний;

large – большой;

xlarge – очень большой;

android:screen – указываем dpi

Значения:

ldpi– ~120dpi

mdpi–~160dpi

hdpi – ~240dpi

xhdpi – ~320dpi

Пример использования:

Тег

указывает одну текстуру GL сжатия, который поддерживается приложением.

Пример использования:

Значения:

GL_OES_compressed_ETC1_RGB8_texture – указано в OpenGL ES 2.0 и доступна во всех Android-устройствах, которые поддерживают OpenGL ES 2.0.

GL_OES_compressed_paletted_texture – общая палитра сжатия текстур.

GL_AMD_compressed_3DC_texture – ATI 3DС сжатия текстур.

Все значения можно посмотреть по этой ссылке .

Тег

– один из основных элементов манифеста, содержащий описание компонентов приложения, доступных в пакете: стили, иконки и др.

Содержит дочерние элементы, которые объявляют каждый из компонентов, входящих в состав приложения. В манифесте может быть только один элемент .

Ниже описание тегов которые вложены в тег .

Тег

указывает активность.

Если приложение содержит несколько активностей, они должны быть объявлены в манифесте, создавая для каждой из них свой элемент . Если активность не объявлена в манифесте, она не будет видна системе и не будет запущена при выполнении приложения или будет выводиться сообщение об ошибке.

Пример использования:

android:name – имя класса.

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

android:label – текстовая метка, отображаемая пользователю.

Тег

Каждый тег поддерживает вложенные узлы . Элемент определяет типы намерений, на которые могут ответить деятельность, сервис или приемник намерений. Фильтр намерений предоставляет для компонентов-клиентов возможность получения намерений объявляемого типа, отфильтровывая те, которые не значимы для компонента, и содержит дочерние элементы , , .

Тег

Элемент добавляет действие к фильтру намерений. Элемент должен содержать один или более элементов . Если в элементе не будет этих элементов, то объекты намерений не пройдут через фильтр. Пример объявления действия:

Тег

– определяет категорию компонента, которую должно обработать намерение. Это строковые константы, определенные в классе intent, например:

Тег

– добавляет спецификацию данных к фильтру намерений.

Спецификация может быть только типом данных (атрибут mimeType), URI или типом данных вместе с URI.

Значение URI определяется отдельными атрибутами для каждой из его частей, т. е. URI делится на части:

android:path или android:pathPrefix;

android:pathPattern.

Тег

определяет пару “имя-значение” для элемента дополнительных произвольных данных, которыми можно снабдить родительский компонент.

Составляющий элемент может содержать любое число элементов .

Тег

- это псевдоним для Activity, определенной в атрибуте targetActivity .

Целевая деятельность должна быть в том же самом приложении, что и псевдоним, и должна быть объявлена перед псевдонимом деятельности в манифесте. Псевдоним представляет целевую деятельность как независимый объект. У псевдонима может быть свой собственный набор фильтров намерений, определяющий, какие намерения могут активизировать целевую деятельность и как система будет обрабатывать эту деятельность.

Например, фильтры намерений на псевдониме деятельности могут определить флаги:

android:name=’android.intent.action.MAIN’

android:name=’android.intent.category.LAUNCHER’

заставляя целевую деятельность загружаться при запуске приложения даже в том случае, когда в фильтрах намерений на целевой деятельности эти флаги не установлены.

Тег

объявляет службу как один из компонентов приложения. Службы, которые не были объявлены, не будут обнаружены системой и никогда не будут запущены.

Тег

объявляет приемник широковещательных намерений как один из компонентов приложения.

Приемники широковещательных намерений дают возможность приложениям получить намерения, которые переданы системой или другими приложениями, даже когда другие компоненты приложения не работают.

Тег

Элемент объявляет контент-провайдера (источник данных) для управления доступом к базам данных.

Элемент Содержит свой набор дочерних элементов для установления разрешений доступа к данным:

Тег

Элемент является дочерним элементом для

Он определяет, для кого можно предоставить разрешения на подмножества данных контент-провайдера.

Предоставление разрешения является способом допустить к подмножеству данных, предоставляемым контент-провайдером, клиента, у которого нет разрешения для доступа к полным данным.

Если атрибут granturiPermissions контент-провайдера имеет значение true , то разрешение предоставляется для любых данных, поставляемых контент-провайдером. Однако, если атрибут поставлен в false , разрешение можно предоставить только подмножествам данных, которые определены этим элементом.

Контент-провайдер может содержать любое число элементов .

Тег

– дочерний элемент для Определяет путь и требуемые разрешения для определенного подмножества данных в пределах поставщика оперативной информации.

Этот элемент может быть определен многократно, чтобы поставлять множественные пути.

Тег

определяет общедоступную библиотеку, с которой должно быть скомпоновано приложение.

Этот элемент указывает системе на необходимость включения кода библиотеки в загрузчик классов для пакета приложения. Каждый проект связан по умолчанию с библиотеками Android, в которые включены основные пакеты для сборки приложений.

Однако некоторые пакеты находятся в отдельных библиотеках, которые автоматически не компонуются с приложением. Если же приложение использует пакеты из этих библиотек или других, от сторонних разработчиков, необходимо сделать явное связывание с этими библиотеками и манифест обязательно должен содержать отдельный элемент .

Для написания статьи использовался ресурс:

Название Описание Необходимость
gen Файлы, сгенерированные самой Java. Здесь находится такой важный файл как R.java Да
AndroidManifest.xml Файл манифеста AndroidManifest.xml предоставляет системе основную информацию о программе. Каждое приложение должно иметь свой файл манифеста Да
src Каталог, в котором содержится исходный код приложения Да
assets Произвольное собрание каталогов и файлов Нет
res Каталог, содержащий ресурсы приложения. В данном каталоге могут находиться подпапки drawable, anim, layout, menu, values, xml и raw (см. ниже) Да

1.5.1. Файл манифеста AndroidManifest.xml

Файл манифеста AndroidManifest.xml предоставляет системе основную информацию о программе. Каждое приложение должно иметь свой файл AndroidManifest.xml. Редактировать файл манифеста можно вручную, изменяя XML-код или через визуальный редактор Manifest Editor, который позволяет осуществлять визуальное и текстовое редактирование файла манифеста приложения.

Назначение файла:

  • описывает компоненты приложения – Activities, Services, Broadcast receivers и Content providers;
  • содержит список необходимых разрешений для обращения к защищенным частям API и взаимодействия с другими приложениями;
  • объявляет разрешения, которые сторонние приложения обязаны иметь для взаимодействия с компонентами данного приложения;
  • объявляет минимальный уровень API Android, необходимый для работы приложения;
  • перечисляет связанные библиотеки.

Корневым элементом манифеста является . Помимо данного элемента обязательными элементами являются теги и . Элемент является основным элементом манифеста и содержит множество дочерних элементов, определяющих структуру и работу приложения. Порядок расположения элементов, находящихся на одном уровне, произвольный. Все значения устанавливаются через атрибуты элементов. Кроме обязательных элементов, упомянутых выше, в манифесте по мере необходимости используются другие элементы. Перечислим некоторые из них:

  • является корневым элементом манифеста.

    По умолчанию Eclipse создает элемент с четырьмя атрибутами:

    xmlns:android определяет пространство имен Android.

    package определяет уникальное имя пакета приложения.

    android:versionCode указывает на внутренний номер версии.

    android:versionName указывает номер пользовательской версии.

  • Объявляет разрешение, которое используется для ограничения доступа к определенным компонентам или функциональности данного приложения. В этой секции описываются права, которые должны запросить другие приложения для получения доступа к приложению. Приложение может также защитить свои собственные компоненты (Activities, Services, Broadcast receivers и Content providers) разрешениями. Оно может использовать любое из системных разрешений, определенных Android или объявленных другими приложениями, а также может определить свои собственные разрешения.
  • запрашивает разрешения, которые приложению должны быть предоставлены системой для его нормального функционирования. Разрешения предоставляются во время установки приложения, а не во время его работы.

    Наиболее распространненные разрешения:

    INTERNET – доступ к интернету

    READ_CONTACTS – чтение (но не запись) данных из адресной книги пользователя

    WRITE_CONTACTS – запись (но не чтение) данных в адресную книгу пользователя

    RECEIVE_SMS – обработка входящих SMS

    ACCESS_FINE_LOCATION – точное определение местонахождения при помощи GPS

  • позволяет объявлять совместимость приложения с указанной версией (или более новыми версиями API) платформы Android. Уровень API, объявленный приложением, сравнивается с уровнем API системы мобильного устройства, на который инсталлируется данное приложение.

    Атрибуты:

    android:minSdkVersion определяет минимальный уровень API, требуемый для работы приложения. Система Android будет препятствовать тому, чтобы пользователь установил приложение, если уровень API системы будет ниже, чем значение, определенное в этом атрибуте.

    android:maxSDKVersion позволяет определить самую позднюю версию, которую готова поддерживать программа.

    targetSDKVersion позволяет указать платформу, для которой разрабатывалось и тестировалось приложение.

  • указывает требуемую для приложения аппаратную и программную конфигурацию мобильного устройства. Спецификация используется, чтобы избежать инсталляции приложения на устройствах, которые не поддерживают требуемую конфигурацию. Если приложение может работать с различными конфигурациями устройства, необходимо включить в манифест отдельные элементы для каждой конфигурации.
  • объявляет определенную функциональность, требующуюся для работы приложения. Таким образом, приложение не будет установлено на устройствах, которые не имеют требуемую функциональность. Например, приложение могло бы определить, что оно требует камеры с автофокусом. Если устройство не имеет встроенную камеру с автофокусом, приложение не будет установлено.

    Возможные атрибуты:

    android.hardware.camera – требуется аппаратная камера.

    android.hardware.camera.autofocus – требуется камера с автоматической фокусировкой.

  • определяет разрешение экрана, требуемое для функционирования приложения. По умолчанию современное приложение с уровнем API 4 или выше поддерживает все размеры экрана и должно игнорировать этот элемент.
  • один из основных элементов манифеста, содержащий описание компонентов приложения. Содержит дочерние элементы ( , , , И другие), которые объявляют каждый из компонентов, входящих в состав приложения. В манифесте может быть только один элемент .

1.5.2. Ресурсы

В Android принято хранить такие объекты, как изображения, строковые константы, цвета, анимацию, стили и тому подобное, за пределами исходного кода. Система поддерживает хранение ресурсов во внешних файлах. Внешние ресурсы легче поддерживать, обновлять и редактировать.

В основном, ресурсы хранятся в виде XML-файлов в каталоге res с подкаталогами values, drawable-ldpi, drawable-mdpi, drawable-hdpi, layout. Но также бывают еще два типа ресурсов: raw и assets.

Для удобства система создает идентификаторы ресурсов и использует их в файле R.java (класс R, который содержит ссылки на все ресурсы проекта), что позволяет ссылаться на ресурсы внутри кода программы. Статический класс R генерируется на основе заданных ресурсов и создается во время компиляции проекта. Так как файл R генерируется автоматически, то нет смысла его редактировать вручную, потому что все изменения будут утеряны при повторной генерации.

В общем виде ресурсы представляют собой файл (например, изображение) или значение (например, заголовок программы), связанные с создаваемым приложением. Удобство использования ресурсов заключается в том, что их можно изменять без повторной компиляции или новой разработки приложения.

Самыми распространенными ресурсами являются, пожалуй, строки (string), цвета (color) и графические рисунки (bitmap).

В следующей таблице перечислены основные ресурсы Android-приложения:

Тип ресурса Размещение Описание
Цвета /res/colors/ Идентификатор цвета, указывающий на цветовой код.
Строки /res/strings/ Строковые ресурсы. В их число также входят строки в формате java и html.
Меню /res/menus/ Меню в приложении можно задать как XML-ресурсы.
Параметры /res/values/ Представляет собой параметры или размеры различных элементов.
Изображения /res/drawable/ Ресурсы-изображения. Поддерживает форматы JPG, GIF, PNG (самый предпочтительный) и другие. Каждое изображение является отдельным файлом. Система также поддерживает stretchable images, в которых можно менять масштаб отдельных элементов, а другие элементы оставлять без изменений.

Отрисовываемые цвета

/res/values/

/res/drawable/

Представляет цветные прямоугольники, которые используются в качестве фона основных отрисовываемых объектов, например точечных рисунков.
Анимация /res/anim/ Android может выполнить простую анимацию на графике или на серии графических изображений.
Произвольные XML-файлы /res/xml/ В Android в качестве ресурсов могут использоваться произвольные XML-файлы.
Произвольные необработанные ресурсы /res/raw/ Любые нескомпилированные двоичные или текстовые файлы, например, видео.

Помимо изображений в каталоге res/drawable могут храниться ресурсы простых геометрических фигур. Вот лишь некоторые из возможных атрибутов:

  • android:shape задает тип фигуры: rectangle (прямоугольник), oval (овал), line (линия), ring (окружность);
  • создает закругленные углы для прямоугольника;
  • задает градиентную заливку для фигуры; в Android можно создавать три типа градиентов: Linear (линейный), Radial (радиальный) и Sweep (разверточный);
  • задает размеры фигуры;
  • задает сплошной цвет для фигуры.

Анимация в Android бывает двух видов:

  • Frame Animation – кадровая анимация, традиционная анимация при помощи быстрой смены последовательных изображений, как на кинопленке.
  • Tween Animation – анимация преобразований может выполняться в виде ряда простых преобразований: изменение позиции (класс TranslateAnimation), размера (ScaleAnimation), угла вращения (RotateAnimation) и уровня прозрачности (AlphaAnimation). Команды анимации определяют преобразования, которые необходимо произвести над объектом. Преобразования могут быть последовательными или одновременными. Последовательность команд анимации определяется в XML-файле (предпочтительно) или в программном коде.

В Android имеется еще один каталог, в котором моrут храниться файлы, предназначенные для включения в пакет – /assets . Это не ресурсы, а просто необработанные файлы. Этот каталог находится на том же уровне, что и /res. Для файлов, располагающихся в /assets, в R.java не генерируются идентификаторы ресурсов. Для их считывания необходимо указать путь к файлу. Путь к файлу является относительным и начинается с /assets. Этот каталог, в отличие от подкаталога res/, позволяет задавать произвольную глубину подкаталогов и произвольные имена файлов.

1.5.3. Разметка

В Android-приложениях, пользовательский интерфейс построен на View и ViewGroup объектах. Класс ViewGroup является основой для подкласса Layout (разметка).

Разметка (также используются термины компоновка или макет) хранится в виде XML-файла в папке /res/layout . Это сделано для того, чтобы отделить код от дизайна, как это принято во многих технологиях (HTML и CSS, Visual Studio и Expression Blend). Кроме основной компоновки для всего экрана, существуют дочерние компоновки для группы элементов. По сути, компоновка – это некий визуальный шаблон для пользовательского интерфейса приложения, который позволяет управлять элементами, их свойствами и расположением. В своей практике вам придется познакомиться со всеми способами размещения.

Android-плагин для Eclipse включает в себя специальный редактор для создания разметки двумя способами. Редактор имеет две вкладки: одна позволяет увидеть, как будут отображаться элементы управления, а вторая – создавать XML-разметку вручную.

Создавая пользовательский интерфейс в XML-файле, можно отделить дизайн приложения от программного кода. Можно изменять пользовательский интерфейс в файле разметки без необходимости изменения программного кода. Например, можно создавать XML-разметки для различных ориентаций экрана мобильного устройства (portrait, landscape), размеров экрана и языков интерфейса. Впрочем, элементы интерфейса можно создавать и программно, когда это необходимо.

Каждый файл разметки должен содержать только один корневой элемент компоновки, который должен быть объектом View или ViewGroup. Внутри корневого элемента можно добавлять дополнительные объекты разметки или дочерние элементы интерфейса, чтобы постепенно формировать иерархию элементов, которую определяет создаваемая разметка.

Существует несколько стандартных типов разметок:

  • FrameLayout является самым простым типом разметки. Обычно это пустое пространство на экране, которое можно заполнить только дочерним объектом View или ViewGroup . Все дочерние элементы FrameLayout прикрепляются к верхнему левому углу экрана. В разметке FrameLayout нельзя определить различное местоположение для дочернего объекта View. Последующие дочерние объекты View будут просто рисоваться поверх предыдущих представлений, частично или полностью затеняя их, если находящийся сверху объект непрозрачен
  • LinearLayout выравнивает все дочерние объекты в одном направлении – вертикально или горизонтально. Направление задается при помощи атрибута ориентации android:orientation . Все дочерние элементы помещаются в стек один за другим, так что вертикальный список представлений будет иметь только один дочерний элемент в строке независимо от того, насколько широким он является. Горизонтальное расположение списка будет размещать элементы в одну строку с высотой, равной высоте самого высокого дочернего элемента списка.
  • TableLayout позиционирует свои дочерние элементы в строки и столбцы. TableLayout не отображает линии обрамления для рядов, столбцов или ячеек. TableLayout может иметь ряды с разным количеством ячеек. При формировании разметки таблицы некоторые ячейки при необходимости можно оставлять пустыми. TableLayout удобно использовать, например, при создании логических игр типа Судоку, Крестики-Нолики и тому подобных.
  • RelativeLayout позволяет дочерним элементам определять свою позицию относительно родительского представления или относительно соседних дочерних элементов.

Все описываемые разметки являются подклассами ViewGroup и наследуют свойства, определенные в классе View.

Разметки ведут себя как элементы управления, и их можно группировать. Расположение элементов управления может быть вложенным. Например, можно использовать RelativeLayout в LinearLayout и так далее. Однако, слишком большая вложенность элементов управления вызывает проблемы с производительностью.

Файл манифеста Android - это основной конфигурационный файл каждого приложения Android. Редактор распределяет информацию из этого файла по нескольким вкладкам.

Manifest (Манифест) - на этой вкладке, показанной на рис. 1.3, определяются общие параметры приложения, такие как название пакета п информация о версии приложении (для установки и обновления).

Application (Приложение) - на этой вкладке определяются такие данные о приложении, как имя и значок приложения, а также внутренние компоненты приложения, например, какие деятельности могут выполняться (включая деятельность запуска DroidActivity по умолчанию) и другие возможности и сервисы, обеспечиваемые приложением.

Permissions (Разрешения) - это вкладка, где определяются права приложения. Например, если приложению необходима возможность чтения списка контактов

телефона, то в конфигурационный файл должен быть добавлен тип Uses-Permission с правом на чтение контактов (android, permission. READCONTACTS).

Instrumentation (Инструментарий) - эта вкладка используется для тестирования компонентов с помощью различных классов инструментария, доступных в Android SDK.

AndroidManifest.xml - эта вкладка представляет собой простой XML- редактор для редактирования файла манифеста вручную.

Если перейти на вкладку AndroidManifest.xml, вы увидите код файла манифеста, который выглядит примерно следующим образом:

xmlns:android="http://schemas.android.com/apk/res/android"

package="com.androidbook.droidl"

android: versionCode=" 1"

android:versionName="l. 0">

android:icon="@drawable/icon" android:label="@string/app name">

android: name=". DroidActivity" android:label="@string/app name">

android:name="android.intent.action.MAIN" />

android: name = "android. intent . category. LAUNCHER" / >

ВНИМАНИЕ!

ЗНАЕТЕ ЛИ ВЫ, ЧТО… __________________________________________________

Все файлы ресурсов Android, включая файл манифеста Android, записываются в формате XML. Это означает, что вы можете редактировать их без специального ре­дактора. Чтобы создать новый XML-файл Android, нажмите на кнопку его создания

с изображением листа бумаги, (буквой «а» и знаком «плюс»I на панели инструментов Eclipse.

ВЫПОЛНИТЕ САМОСТОЯТЕЛЬНО

РЕДАКТИРОВАНИЕ КОНФИГУРАЦИОННОГО ФАЙЛА ANDROID

Попробуйте отредактировать файл манифеста Android. Вы не сможете проводить отладку приложения, пока не установите значение атрибута android:debuggable равным true. Для этого выполните следующие действия:

1. Откройте файл AndroidManifest.xml в редакторе ресурсов.

2. Перейдите на вкладку Application (Приложение).

3. Раскройте список атрибута debuggable и выберите пункт true.

4. Сохраните файл манифеста.

Теперь, если переключиться на вкладку AndroidManifest.xml, вы увидите, что у тега

«application» появился атрибут отладки:

android:debuggable="true"

РЕДАКТИРОВАНИЕ ДРУГИХ ФАЙЛОВ РЕСУРСОВ

большинство ресурсов приложения Android хранятся в папке /res. Она содержит в себе подпапки:

/drawable-ldpi, /drawable-hdpi, /drawable-mdpi - в этих подпапках хранятся графические файлы ресурсов для различной плотности размеще ния точек и разрешений экрана. Если вы просмотрите содержимое этих папок на панели Project Explorer (Проводник проектов), то найдете гра фический файл icon.png в каждой из них. Это значок приложения. По дробнее о различии между этими папками вы узнаете в часе 20.

/layout - и этой подпапке хранятся файлы макета пользовательскою интерфейса. Здесь вы можете найти файл макета экрана main.xml, кото рый содержит описание пользовательского интерфейса для деятельно сти по умолчанию.

/values – в этой подпапке различные типы ресурсов сгруппированы по типам, таким как строковые значения, значения цвета и другие примитивные типы. Здесь вы можете видеть файл ресурса strings.xml, который содержит все строковые ресурсы, используемые в приложении.

Щелкните дважды по какому-либо из файлов ресурсов, чтобы открыть его н редакторе.

Помните, что вы можете редактировать XML-данные непосредственно н текстовом редакторе.

ВЫПОЛНИТЕ САМОСТОЯТЕЛЬНО РЕДАКТИРОВАНИЕ СТРОКОВЫХ РЕСУРСОВ

Если вы посмотрите на код файла макета main.xml, то увидите, что он выводит на экран простой интерфейс с единственным элементом пользовательского интерфейса - TextView. Этот элемент выводит на экран текстовую строку. В нашем случае отображаемый на экране текст определяется строковым ресурсом 0string/hello.

Для редактирования строкового ресурса 0string/hello редактором строковых ресурсов выполните следующие действия: 1. Откройте в редакторе ресурсов файл strings.xml.

2. Обратите внимание на строковый ресурс с именем hello и текстом Hello

World, DroidActivity! в редакторе ресурсов. 3. В поле ввода Value (Значение) измените это значение на Hello, Dave.

4. Сохраните файл.

Теперь если вы переключитесь на вкладку strings.xml и посмотрите на код XML, то увидите, что в контейнерном теге содержится два строковых элемента:

Hello, Dave

В корневой папке каждого приложения должен находиться файл AndroidManifest.xml (который именно так и называется). Файл манифеста содержит важную информацию о приложении, которая требуется системе Android. Только получив эту информацию, система может выполнить какой-либо код приложения. Среди прочего файл манифеста выполняет следующие действия:

  • Он задает имя пакета Java для приложения. Это имя пакета служит уникальным идентификатором приложения.
  • Он описывает компоненты приложения — операции, службы, приемники широковещательных сообщений и поставщиков контента, из которых состоит приложение. Он содержит имена классов, которые реализуют каждый компонент, и публикует их возможности (указывает, например, какие сообщения они могут принимать). На основании этих деклараций система Android может определить, из каких компонентов состоит приложение и при каких условиях их можно запускать.
  • Он определяет, в каких процессах будут размещаться компоненты приложения.
  • Он объявляет, какие разрешения должны быть выданы приложению, чтобы оно могло получить доступ к защищенным частям API-интерфейса и взаимодействовать с другими приложениями.
  • Он также объявляет разрешения, требуемые для взаимодействия с компонентами данного приложения.
  • Он содержит список классов , которые при выполнении приложения предоставляют сведения о профиле и прочую информацию. Эти объявления присутствуют в файле манифеста только во время разработки и отладки приложения и удаляются перед его публикацией.
  • Он объявляет минимальный уровень API-интерфейса Android, который требуется приложению.
  • Он содержит список библиотек, с которыми должно быть связано приложение.

Структура файла манифеста

Приведенная далее схема позволяет ознакомиться с общей структурой файла манифеста и всеми элементами, которые могут в нем содержаться. Каждый элемент вместе со всеми своими атрибутами, полностью описывается в отдельном файле. Для просмотра подробных сведений о любом элементе, щелкните имя элемента на схеме, в алфавитном списке элементов, приведенном после схемы, или в любом другом месте, где этот элемент упоминается.

. . . . . . . . .

Далее приведен список всех элементов, расположенных в алфавитном порядке, которые могут присутствовать в файле манифеста. Там могут находиться только эти элементы, а никакие другие элементы или атрибуты добавлять нельзя.

Соглашения о компонентах файла

Ко всем элементам и атрибутам из файла манифеста применяется рад соглашений и правил:

Элементы Обязательными являются только элементы и . Оба они должны присутствовать в файле манифеста, при этом указать их можно только один раз. Большинство других элементов можно указывать по нескольку раз или не указывать вовсе — хотя по крайней мере некоторые из них нужны, чтобы файл манифеста был сколько-нибудь информативным.

Если в элементе и есть какое-то содержимое, то это другие элементы. Все значения задаются с помощью атрибутов, а не как символьные данные в элементе.

Элементы, находящиеся на одном уровне, обычно не упорядочиваются. Например, элементы , и можно указать в любой последовательности. (Элемент является исключением из этого правила. Он должен следовать за элементом , псевдонимом которого он является.)

Атрибуты Формально все атрибуты являются необязательными. Однако некоторые их них указывать необходимо, чтобы файл мог выполнять свое предназначение. В качестве руководства используйте эту документацию. В отношении атрибутов, которые являются и вправду необязательными, в ней указывается значение, используемое по умолчанию, или говорится, что произойдет, если такой атрибут не будет указан.

За исключением некоторых атрибутов корневого элемента , имена всех атрибутов должны начинаться с префикса android: — например, android:alwaysRetainTaskState . Поскольку этот префикс является универсальным, в документации при указании атрибутов по имени он обычно опускается.

Объявление имен классов Многие элементы соответствуют объектам Java, в том числе элементы для самого приложения (элемент ) и основных его компонентов — операций (), служб (), приемников широковещательных сообщений () и поставщиков контента ().

Если вы определяете подкласс, а это практически всегда делается для классов компонентов ( , и ), выполняется это с помощью атрибута name . В состав имени должно входить полное обозначение пакета. Например, подкласс можно объявить следующим образом:

. . . . . .

Однако его можно укоротить. Если первым символом в строке указать точку, эта строка будет добавляться к имени пакета приложения (указанного атрибутом элемента ). Следующее назначение является таким же, как приведенное выше:

. . . . . .

При запуске компонента Android создает экземпляр подкласса, указанного по имени. Если подкласс не указан, система создает экземпляр базового класса.

Несколько значений Если можно указать несколько значений, элемент почти всегда приводится повторно. Делается это вместо перечисления нескольких значений в одном элементе. Например, в фильтре Intent может быть перечислено несколько действий: . . . Значения ресурсов Значения некоторых атрибутов могут отображаться на экране — например, метка и значок операции. Значения этих атрибутов следует локализовать, поэтому они должны задаваться в ресурсе или теме. Значения ресурсов выражаются в следующем формате:

@[пакет:]тип:имя

где имя пакета можно опустить, если ресурс находится в одном пакете с приложением, тип - это тип ресурса, — например "string" или "drawable", — а имя - это имя, определяющее ресурс. Например:

Значения из темы выражаются схожим образом, только в начале у них идет " ? ", а не " @ ":

?[пакет:]тип:имя

Строковые значения Когда значением атрибута является строка, следует использовать двойную обратную косую черту (" \\ ") для выделения управляющей последовательности символов, — например " \\n " для новой строки или " \\uxxxx " для символа Юникода.

Отображение функций в файле

В следующих разделах описано, как некоторые функции Android отображаются в файле манифеста.

Фильтры объектов Intent

Базовые компоненты приложения (его операции, службы и приемники широковещательных сообщений) активируются объектами Intent . Intent - это совокупность информации (объект ), описывающей требуемое действие, — в том числе в ней указаны данные, с которыми следует выполнить это действие, категория компонентов, которые должны выполнять это действие, и другие уместные инструкции. Система Android находит компонент, который отреагирует на объект Intent, запускает новый экземпляр компонента, если он требуется, и передает ему объект Intent.

Компоненты объявляют свои возможности — виды объектов Intent, на которые они могут реагировать, — с помощью фильтров Intent . Поскольку система Android должна узнать, какие объекты Intent может обрабатывать тот или иной компонент, до того как она его запустит, фильтры Intent указываются в файле манифеста как элементы . Компонент может иметь любое количество фильтров, каждый из которых описывает отдельную возможность компонента.

Объект Intent, в котором целевой компонент явно указан по имени, активирует этот компонент, и фильтр при этом не учитывается. Но объект Intent, в котором имя целевого компонента не указано, может активировать компонент, только если он может пройти через один из фильтров компонента.

Сведения о том, каким образом объекты Intent проверяются по фильтрам Intent, см. в отдельном документе .

Значки и метки

У ряда элементов есть атрибуты icon и label для небольшого значка и текстовой метки, которые могут отображаться на экране. У некоторых из них также есть атрибут description для более длинного описательного текста, который также может отображаться на экране. Например, элемент имеет все три таких атрибута, поэтому, когда пользователю задается вопрос, предоставить ли разрешение запросившему его приложению, на экране может отображаться значок, представляющий разрешение, имя разрешения и описание того, что оно за собой влечет.

В любом случае значок и метка, заданные в элементе-контейнере, становятся параметрами icon и label , используемыми по умолчанию для всех вложенных в этот контейнер дочерних элементов. Так, значок и метка, заданные в элементе , являются значком и меткой, используемыми по умолчанию для каждого компонента приложения. Точно так же, значок и метка, заданные для компонента, — например элемента , — являются параметрами, используемыми по умолчанию для каждого элемента компонента. Если в элементе задана метка, а в операции и ее фильтре Intent - нет, метка приложения будет считаться меткой и для операции, и для фильтра Intent.

Значок и метка, заданные для фильтра Intent, используются для обозначения компонента, когда он представляется пользователю, для указания функции, которую анонсирует фильтр. Например, фильтр с параметрами " android.intent.action.MAIN " и " android.intent.category.LAUNCHER " сообщает, что эта операция инициирует приложение, — то есть он обозначает ее как операцию, которая должна быть отображена в средстве запуска приложений. Отсюда следует, что значок и метка, заданные в фильтре, отображаются в средстве запуска.

Разрешения

Разрешение представляет собой ограничение на доступ к части кода или к данным, имеющимся на устройстве. Это ограничение накладывается для защиты важных данных и кода, ненадлежащее использование которых может пагубно сказаться на работе приложения.

Каждое разрешение обозначается уникальной меткой. Зачастую метка обозначает действие, выполнение которого ограничивается. Например, вот некоторые разрешения, определенные системой Android:

android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER

Функцию можно защитить не более чем одним разрешением.

Если приложению требуется доступ к функции, защищенной разрешением, оно должно объявить, что ему необходимо это разрешение, с помощью элемента в файле манифеста. Затем, когда приложение устанавливается на устройство, установщик определяет, выдать ли запрошенное разрешение, проверяя полномочия органов, подписавших сертификаты приложения, а также, в некоторых случаях, спрашивая об этом пользователя. Если разрешение предоставляется, приложение сможет использовать защищенные функции. В противном случае его попытки доступа к этим функциям будут безуспешными, причем пользователь не получит никакого уведомления об этом.

Приложение также может защищать с помощью разрешений собственные компоненты (операции, службы, приемники широковещательных сообщений и поставщиков контента). Оно может использовать любые разрешения, определенные системой Android (они приведены в объекте ) или объявленные другими приложениями. Либо оно может определить разрешения самостоятельно. Новое разрешение объявляется с помощью элемента . Например, операцию можно защитить следующим образом:

. . . . . .

Обратите внимание, что в этом примере разрешение DEBIT_ACCT не только объявляется с помощью элемента , его использование также запрашивается с помощью элемента . Чтобы другие компоненты приложения запускали защищенную операцию, ее использование должно быть запрошено, даже несмотря на то, что защита наложена самим приложением.

В этом же примере: если атрибут permission был бы задан как разрешение, объявленное где-то еще (например, android.permission.CALL_EMERGENCY_NUMBERS), его бы не нужно было объявлять еще раз с помощью элемента . Однако все равно нужно было бы запрашивать его использование с помощью .

Элемент объявляет пространство имен для группы разрешений, которые будут определены в коде. А элемент определяет метку для набора разрешений (как для разрешений, объявленных в файле манифеста с помощью элементов , так и для объявленных где-то еще). Это влияет только на то, каким образом разрешения группируются, когда отображаются пользователю. Элемент не указывает, какие разрешения относятся к группе. Он просто дает группе имя. Чтобы включить разрешение в группу, атрибуту его элемента необходимо присвоить имя группы.

Библиотеки

Каждое приложение связывается с используемой по умолчанию библиотекой Android, в которой имеются базовые пакеты для построения приложений (со стандартными классами, например Activity, Service, Intent, View, Button, Application, ContentProvider и так далее).

Однако некоторые пакеты находятся в собственных библиотеках. Если ваше приложение использует код из одного из таких пакетов, оно должно в явном виде потребовать, чтобы его связали с этим пакетом. Файл манифеста должен содержать отдельный элемент для указания имени каждой библиотеки. (Имя библиотеки можно найти в документации по пакету.)



Рекомендуем почитать

Наверх