Каждое приложение содержит файл манифеста 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"