Главная » Разработка для Android » Знакомство с манифестом приложения

0

Любое приложение, создаваемое в Android, содержит файл манифеста, AndroidManifest.xml, который хранится  в корневом каталоге проекта. Манифест позволяет описывать структуру и метаданные вашего приложе- ния, его компоненты и требования.

Манифест включает в себя узлы (теги) для каждого компонента (Актив- ностей, Сервисов, Источников  данных и Широковещательных приемников), из которых состоит ваше приложение, и с помощью Фильтров намерений (Intent Filters) и полномочий определяет,  каким образом они взаимодействуют друг с другом и со сторонними программами.

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

Манифест содержит корневой тег <manifest> с атрибутом package, который ссылается на пакет проекта. Как правило, этот тег также включа- ет в себя атрибут xmlns:android, поддерживаемый системными узлами внутри файла.

Задействуйте атрибут versionCode для задания текущей версии при- ложения  в виде целого числа. Это внутреннее  значение  используется для сравнения версий программы. Примените атрибут versionName для указа- ния публичной  версии, которая выводится для пользователей.

Типичный тег <manifest> показан во фрагменте  кода:

<manifest xmlns:android=http://schemas.android.com/apk/res/android package="com.my_domain.my_app"

android:versionCode="1" android:versionName="0.9 Beta">

[ … вложенные узлы манифеста … ]

</manifest>

Тег <manifest>включает в себя узлы, описывающие программные ком- поненты, настройки безопасности, классы для тестирования и требования, из которых состоит ваше приложение. Укажем теги, доступные внутри узла

<manifest>, а также фрагменты кода в формате XML, демонстрирующие, как этими тегами пользоваться.

uses-sdk. Позволяет задать минимальную, максимальную и целевую версии SDK, которые должны  быть доступны  на устройстве,  чтобы ваше приложение смогло правильно функционировать. Основываясь на версии SDK, которая поддерживается установленной платформой, и используя сочетание атрибутов minSDKVersion, maxSDKVersion и targetSDKVersion, вы можете ограничить  круг устройств,  спо- собных запускать приложение.

Атрибут minSDKVersion указывает  на минимальную версию SDK, содержащую  API, которая  используется в вашей программе.  Если не зададите  минимальную версию, применится значение  по умол- чанию, а ваше приложение не сможет корректно  работать, если по- пытается  получить  доступ к API, которые недоступны  на текущем устройстве.

Атрибут maxSDKVersion позволяет  определить  самую позднюю версию, которую вы готовы поддерживать. Ваше приложение будет невидимым  в Android  Market для устройств,  управляемых систе- мой с более свежей  версией.  Устанавливать значение  для  этого атрибута рекомендуется только в том случае, если вы абсолютно уве- рены, что приложение не работает  на платформе с версией,  выше заданной.

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

<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="5">

</uses-sdk>

ПРИМЕЧАНИЕ

Поддерживаемая версия SDK не совпадает с версией платформы и не может быть из нее извлечена. Например, версия платформы Android 2.0 поддерживает SDK версии 5. Чтобы получить коррект- ную версию SDK для каждой платформы, смотрите таблицу по адресу http://developer.android.com/guide/appendix/api-levels.html.

uses-configuration. Используйте теги uses-configuration, чтобы указать все механизмы ввода данных, поддерживаемые вашим приложением. Вы можете задать любую комбинацию,  содержащую следующие устройства:

§ reqFiveWayNav — укажите  для этого атрибута  значение  true, если вам необходимо устройство ввода, поддерживающее нави- гацию вверх, вниз, влево, вправо, а также нажатие  выделенного элемента; в эту категорию входят как трекболы, так и манипуля- торы D-pad;

§ reqHardKeyboard — если вашему приложению нужна аппаратная клавиатура, укажите значение true;

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

§ reqNavigation — если требуется устройство для навигации, ука- жите одно из следующих значений  — nonav, dpad, trackball,  wheel или undefined;

§ reqTouchScreen — если вашему приложению понадобится сен- сорный экран, выберите одно из следующих значений  — notouch, stylus, finger или undefined.

Вы можете задать несколько поддерживаемых конфигураций, напри- мер устройство  с емкостным  сенсорным  экраном,  трекболом  и ап- паратной  клавиатурой (либо  qwerty,  либо twelvekey), как показано ниже:

<uses-configuration android:reqTouchScreen=["finger"] android:reqNavigation=["trackball"] android:reqHardKeyboard=["true"] android:reqKeyboardType=["qwerty"/>

<uses-configuration android:reqTouchScreen=["finger"] android:reqNavigation=["trackball"] android:reqHardKeyboard=["true"] android:reqKeyboardType=["twelvekey"]/>

ВНИМАНИЕ

Определяя требуемые конфигурации, помните, что приложение не будет устанавливаться на устройствах, которые не соответствуют ни одной из заданных комбинаций. В примере, приведенном выше, устройство с qwerty-клавиатурой и манипулятором D-pad (но без сенсорного экрана или трекбола) поддерживаться не будет. В идеале вы должны разраба- тывать приложения таким образом, чтобы они работали с любым соче- танием устройств ввода, в этом случае тег uses-configuration указывать необязательно.

uses-feature. Одно из преимуществ Android — широкий диапазон аппаратных платформ, на которых он может работать. Используй- те простые  теги uses-feature, чтобы задать все необходимые приложению аппаратные возможности. Это предотвратит установку вашей программы на устройства, которые не соответсвуют аппа- ратным требованиям. Можете запросить  поддержку  любого необя- зательного для совместимых устройств оборудования. На сегод- няшний день аппаратные  возможности предлагают следующие варианты:

§ android.hardware.camera (если для работы приложения нужна ап- паратная камера);

§ android.hardware.camera.autofocus (если требуется камера с автома- тической фокусировкой).

ПРИМЕЧАНИЕ

С увеличением числа разнообразных платформ, на которых доступен Android, растет и количество дополнительного оборудования. Полный список аппаратного обеспечения для тега uses-feature можно найти по адресу http://developer.android.com/guide/topics/manifest/uses-feature- element.html.

Вы также можете использовать тег uses-feature, чтобы задать минимальную версию OpenGL, которая требуется для работы вашего приложения. С помощью атрибута  glEsVersion укажите  версию OpenGL  ES в виде целого числа. Первые  16 бит соответствуют  ма- жорной версии, а последние — минорной:

<uses-feature android:glEsVersion=" 0x00010001" android:name="android.hardware.camera" />

supports-screens. После первой волны устройств с экранами HVGA в 2009 году список аппаратов  под управлением Android  пополнился моделями с поддержкой WVGA и QVGA. Поскольку будущие устрой- ства, вероятно, станут оснащаться  большими  дисплеями,  с помощью тега supports-screenвы можете указать экранные размеры, которые поддерживаются (и не поддерживаются) вашим приложением.

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

§ smallScreens — экраны с разрешением меньшим, чем обычное HVGA, как правило, речь идет о QVGA;

§ normalScreens — используется для описания  экранов  стандарт- ных мобильных  телефонов,  как минимум  HVGA, включая  HVGA и WQVGA;

§ largeScreens — экраны больших размеров, значительно больше, чем у мобильного телефона;

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

В версии SDK 1.6 (API level 4) значения  по умолчанию для каждого атрибута — true. Используйте этот тег для указания размеров экранов, которые вы не поддерживаете:

<supports-screens android:smallScreens=["false"] android:normalScreens=["true"] android:largeScreens=["true"] android:anyDensity=["false"] />

ПРИМЕЧАНИЕ

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

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

Тег <application> также играет роль контейнера, который включа- ет в себя узлы для Активностей, Сервисов, Источников данных и Широкове- щательных приемников, описывающих компоненты приложения. Кроме того, вы можете задать собственную реализацию класса Application. Далее в этой главе вы узнаете, как наследовать  данный  класс и ис- пользовать  его для управления состоянием  приложения.

<application android:icon="@drawable/icon" android:theme="@style/my_theme" android:name="MyApplication" android:debuggable="true">

[ … вложенные теги … ]

</application>

аctivity. Тег <activity> требуется для каждой Активности, кото- рую отображает  приложение. Используйте атрибут  android:name для указания имени класса Активности.

С помощью этих тегов добавьте главную Активность, которая будет запу- скаться первой, а также остальные экраны и диалоговые окна, которые могут показываться. Попытка  запустить  Активности без соответству- ющего описания в манифесте приведет к выбросу исключения. Каждый тег <activity> поддерживает вложенные  узлы <intent-filter>, указывающие, какие именно Намерения могут запустить Активность.

<activity android:name=".MyActivity" android:label="@string/app_name">

<intent-filter>

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

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

</intent-filter>

</activity>

§ service. Как и в предыдущем случае, каждый класс Сервиса должен иметь тег service (Сервисы подробно рассматриваются в главе 9). Теги service поддерживают вложенные узлы <intent-filter>, с помощью которых происходит латентное связывание.

<service android:enabled="true" android:name=".MyService"></service>

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

<provider android:permission="com.paad.MY_PERMISSION" android:name=".MyContentProvider" android:enabled="true"

android:authorities="com.paad.myapp.MyContentProvider">

</provider>

§ receiver. Добавляя в манифест тег receiver, можно зарегистри- ровать Широковещательный приемник, не запуская  при этом прило- жение. Как убедитесь в главе 5, Широковещательные приемники от- слеживают события на глобальном уровне: пройдя регистрацию, они начнут срабатывать  при трансляции системой  или приложением соответствующего Намерения. Регистрируя их в манифесте, може- те сделать этот процесс полностью  анонимным.  При трансляции соответствующего Намерения ваше приложение стартует  автома- тически, запуская зарегистрированный Приемник.

<receiver android:enabled="true" android:label="My Intent Receiver" android:name=".MyIntentReceiver">

</receiver>

uses-permission. Теги uses-permission как часть системы безопасности  описывают  полномочия, которые, по вашему мнению, нужны приложению для полноценной работы. Добавленные полно- мочия предоставляются пользователю до установки.  Для использо- вания многих стандартных сервисов в Android требуются полномочия (в частности, для действий, связанных с платными услугами и безопас- ностью, таких как телефонные звонки, прием SMS или использование геолокационных сервисов).

<uses-permission android:name="android.permission.ACCESS_LOCATION"/>

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

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

Внутри тега permission вы можете указать уровень доступа, который обеспечивается данным полномочием  (normal,  dangerous,  signature, signatureOrSystem), метку и внешний ресурс, содержащий  описание

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

<permission android:name="com.paad.DETONATE_DEVICE" android:protectionLevel="dangerous" android:label="Self Destruct" android:description="@string/detonate_description">

</permission>

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

<instrumentation android:label="My Test" android:name=".MyTestClass" android:targetPackage="com.paad.aPackage">

</instrumentation>

Подробное описание манифеста и всех этих тегов можно найти по адресу

http://developer.android.com/guide/topics/manifest/manifest-intro.html.

Мастер создания проектов в составе ADT (New Project Wizard) автома- тически добавляет файл с манифестом для каждого нового проекта.

Вы еще вернетесь к манифесту, как только познакомитесь со всеми ком- понентами, из которых состоит приложение.

Использование редактора манифеста

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

Чтобы  использовать редактор  манифеста  в Eclipse, щелкните  правой кнопкой  мыши по файлу  AndroidManifest.xml в каталоге своего про- екта и выберите  пункт Open With     Android Manifest Editor.  На экране появится панель с описанием манифеста, как показано на рис. 3.1. В ней содержится высокоуровневое представление структуры  вашего приложения, с его по- мощью вы можете изменять информацию о версии программы и корневые узлы манифеста, включая  <uses-sdk> и <uses-features>, описанные ранее в этой главе. Здесь находятся ссылки для визуального представления разделов Application, Permissions, Instrumentation, а также ярлык для перехода к ре- дактированию исходного кода в формате XML.

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

Рис. 3.1.

Особый  интерес представляет вкладка  Application, показанная на рис. 3.2. Используйте ее для управления узлом application и деревом компонен- тов приложения.

Рис. 3.2.

На панели  Application Attributes укажите  свойства  приложения — значок, метку и визуальный стиль. Ниже находится  дерево Application Nodes, с помо- щью которого можно управлять программными компонентами, в том числе их атрибутами  и любыми вложенными Фильтрами намерений, связанными с ними.

Жизненный цикл приложения в Android

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

По умолчанию  каждое приложение в Android  работает в собственном процессе — отдельном экземпляре виртуальной машины Dalvik. Управле- ние памятью и процессами — исключительно прерогатива системы.

ПРИМЕЧАНИЕ

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

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

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии