Каждое приложение содержит файл манифеста AndroidManifest.xml. Данный файл определяет важную информацию о приложении - название, версию, иконки, какие разрешения приложение использует, регистрирует все используемые классы activity, сервисы и т.д. Данный файл можно найти в проекте в папке manifests:
Файл манифеста может выглядеть так:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.viewapp"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.ViewApp"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Элементом корневого уровня является узел manifest
. В данном случае только определяется пакет приложения -
package="com.example.viewapp"
. Собственно это определение файла манифеста по умолчанию. В каждом конкретном случае может отличаться пакет приложения,
остальное содержимое при создании проекта с пустой activity будет аналогичным.
Большинство настроек уровня приложения определяются элементом application
. Ряд настроек задаются с помощью атрибутов. По умолчанию применяются
следующие атрибуты:
android:allowBackup указывает, будет ли для приложения создаваться резервная копия. Значение
android:allowBackup="true"
разрешает создание резервной копии.
android:icon устанавливает иконку приложения. При значении android:icon="@mipmap/ic_launcher"
иконка приложения берется из каталога res/mipmap
android:roundIcon устанавливает круглую иконку приложения. Также берется из каталога res/mipmap
android:label задает название приложение, которое будет отображаться на мобильном устройстве в списке приложений и
в заголовке. В данном случае оно хранится в строковых ресурсах - android:label="@string/app_name"
.
android:supportsRtl указывает, могут ли использоваться различные RTL API - специальные API для работы с правосторонней ориентацией текста (например, для таких языков как арабский или фарси).
android:theme устанавливает тему приложения. Подробно темы будут рассмотрены далее, а пока достаточно знать, что тема определяет
общий стиль приложения. Значение @style/Theme.ViewApp"
берет тему "Theme.ViewApp" из каталога res/values/themes
Вложенные элементы activity
определяют все используемые в приложении activity. В данном случае видно, что в приложении есть только одна
activity - MainActivity.
<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
Элемент intent-filter
в MainActivity указывает, как данная activity будет использоваться. В частности, с помощью узла
action android:name="android.intent.action.MAIN"
, что данная activity будет входной точкой в приложение и не должна получать какие-либо данные извне.
Элемент category android:name="android.intent.category.LAUNCHER"
указывает, что MainActivity будет представлять стартовый экран, который отображается при запуске приложения.
Файл манифеста может содержать множество элементов, которые имеют множество атрибутов. И все возможные элементы и их атрибуты можно найти в документации. Здесь же рассмотрим некоторые примеры использования.
С помощью атрибутов элемента manifest
можно определить версию приложения и его кода:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.viewapp" android:versionName="1.0" android:versionCode="1"> <!-- остальное содержимое--> </manifest>
Атрибут android:versionName
указывает на номер версии, который будет отображаться пользователю и на которую будут ориентироваться
пользователи при работе с приложением.
Тогда как атрибут android:versionCode
представляет номер версии для внутреннего использования. Этот номер только определяет, что одна версия приложения более новая,
чем какая-то другая с меньшим номером номером версии. Этот номер не отображается пользователям.
При желании мы также можем определить версию в ресурсах, а здесь ссылаться на ресурс.
Для управления версией android sdk в файле манифеста определяется элемент <uses-sdk>
. Он может использовать следующие атрибуты:
minSdkVersion
: минимальная поддерживаемая версия SDK
targetSdkVersion
: оптимальная версия
maxSdkVersion
: максимальная версия
Версия определяется номером API, например, Jelly Beans 4.1 имеет версию 16, а Android 11 имеет версию 30:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.viewapp" android:versionName="1.0" android:versionCode="1"> <uses-sdk android:minSdkVersion="22" android:targetSdkVersion="30" /> <!-- остальное содержимое--> </manifest>
Иногда приложению требуются разрешения на доступ к определенным ресурсам, например, к списку контактов, камере и т.д. Чтобы приложение могло работать
с тем же списком контактов, в файле манифесте необходимо установить соответствующие разрешения. Для установки разрешений применяется элемент
<uses-permission>
:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.viewapp"> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.CAMERA" android:maxSdkVersion="30" /> <!-- остальное содержимое--> </manifest>
Атрибут android:name
устанавливает название разрешения: в данном случае на чтение списка контактов и использование камеры.
Опционально можно установить максимальную версию sdk посредством атрибута android:maxSdkVersion
, который принимает номер API.
Мир устройств Android очень сильно фрагментирован, здесь встречаются как гаджеты с небольшим экраном, так и большие широкоэкранные телевизоры.
И бывают случаи, когда надо ограничить использование приложения для определенных разрешений экранов. Для этого в файле манифеста определяется элемент
<supports-screens>
:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.viewapp"> <supports-screens android:largeScreens="true" android:normalScreens="true" android:smallScreens="false" android:xlargeScreens="true" /> <!-- остальное содержимое--> </manifest>
Данный элемент принимает четыре атрибута:
android:largeScreens - экраны с диагональю от 4.5 до 10"
android:normalScreens - экраны с диагональю от 3 до 4.5"
android:smallScreens - экраны с диагональю меньше 3"
android:xlargeScreens - экраны с диагональю больше 10"
Если атрибут имеет значение true
, то приложение будет поддерживаться соответствующим размером экрана
Приложение в зависимости от положения гаджета может находиться в альбомной и портретной ориентации. Не всегда это бывает удобно. Мы можем сделать, чтобы приложение вне зависимости от поворота гаджета использовало только одну ориентацию. Для этого в файле манифеста у требуемой activity надо установить атрибут android:screenOrientation. Например, запретим альбомную ориентацию:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.viewapp" android:versionName="1.0" android:versionCode="1" > <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.ViewApp"> <activity android:name=".MainActivity" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Значение android:screenOrientation="portrait"
указывает, что данная activity будет находиться только в портретной ориентации.
Если же надо установить только альбомную ориентацию, тогда надо использовать значение android:screenOrientation="landscape"