- Работа с манифестом Android
- Основы
- Activity Name
- Строка заголовка действия
- Запуск из средства выбора приложений
- Значок действия
- Разрешения
- Дополнительные функции
- Действия и функции намерения
- Элемент Application
- Файл манифеста AndroidManifest.xml
- Назначение файла
- Общая структура манифеста
- Описание
- Атрибуты
- Основы Android приложений
- Компоненты приложения
- Запуск компонентов
- Файл манифеста
- Описание компонентов
Работа с манифестом Android
AndroidManifest.xml — это мощный файл на платформе Android, который позволяет описать функциональные возможности и требования приложения для Android. Однако работать с ним непросто. Xamarin. Android помогает снизить эту сложность, позволяя добавлять настраиваемые атрибуты в классы, которые затем будут использоваться для автоматического создания манифеста. Наша цель заключается в том, что 99% наших пользователей никогда не нужно вручную изменять AndroidManifest.xml.
AndroidManifest.xml создается как часть процесса сборки, и XML-код, найденный в свойствах/AndroidManifest.xml , объединяется с XML, созданным из настраиваемых атрибутов. Полученный Объединенный AndroidManifest.xml находится в подкаталоге obj ; Например, он находится в файле obj/Debug/Android/AndroidManifest.xml для отладочных сборок. Процесс слияния является тривиальным: он использует настраиваемые атрибуты в коде для создания XML-элементов и вставляет эти элементы в AndroidManifest.xml.
Основы
Во время компиляции сборки сканируются для классов, не являющихся abstract классами, которые являются производными от abstract и имеют [Activity] объявленный атрибут. Затем эти классы и атрибуты используются для создания манифеста. Рассмотрим следующий пример кода:
Это приведет к невозможности создания в AndroidManifest.xml. Если требуется создать элемент, необходимо использовать [Activity] настраиваемый атрибут:
В этом примере к AndroidManifest.xmlу добавляется следующий фрагмент XML:
[Activity] Атрибут не влияет на abstract типы; abstract типы игнорируются.
Activity Name
Начиная с Xamarin. Android 5,1, имя типа действия основано на MD5SUM имени экспортируемого типа с указанием сборки. Это позволяет предоставить одно и то же полное имя из двух разных сборок и не получить ошибку упаковки. (Перед Xamarin. Android 5,1 имя типа действия по умолчанию было создано из пространства имен в нижнем регистре и имени класса.)
Если вы хотите переопределить это значение по умолчанию и явно указать имя действия, используйте Name свойство:
В этом примере создается следующий фрагмент XML:
Свойство следует использовать Name только в целях обратной совместимости, так как такое Переименование может замедлить Поиск во время выполнения. Если у вас есть устаревший код, который ожидает, что имя типа по умолчанию для действия должно основываться на пространстве имен в нижнем регистре и имени класса, см. раздел имя вызываемой оболочки Android для получения советов по обеспечению совместимости.
Строка заголовка действия
По умолчанию Android предоставляет приложению заголовок при его запуске. Для этого используется значение /manifest/application/activity/@android:label . В большинстве случаев это значение будет отличаться от имени класса. Чтобы указать метку приложения в заголовке окна, используйте Label свойство. Например:
В этом примере создается следующий фрагмент XML:
Запуск из средства выбора приложений
По умолчанию действие не отображается на экране запуска приложений Android. Это связано с тем, что в приложении может быть много действий, и вам не нужен значок для каждого из них. Чтобы указать, какие из них должны быть запущены в средстве запуска приложений, используйте MainLauncher свойство. Например:
В этом примере создается следующий фрагмент XML:
Значок действия
По умолчанию для действия будет задан значок запуска по умолчанию, предоставляемый системой. Чтобы использовать пользовательский значок, сначала добавьте .png в Resources/Draw, задайте для его действия сборки значение AndroidResource, а затем используйте свойство, чтобы указать используемый значок. Например:
В этом примере создается следующий фрагмент XML:
Разрешения
При добавлении разрешений в манифест Android (как описано в разделе Добавление разрешений в манифест Android) эти разрешения записываются в свойствах и AndroidManifest.xml. Например, при задании INTERNET разрешения в INTERNET добавляется следующий элемент:
Отладочные сборки автоматически устанавливают некоторые разрешения для упрощения отладки (например INTERNET , и READ_EXTERNAL_STORAGE ) — эти параметры задаются только в созданном INTERNET и не отображаются как включенные в параметрах READ_EXTERNAL_STORAGE .
Например, если вы изучите созданный файл манифеста в файле obj/Debug/Android/AndroidManifest.xml, вы можете увидеть следующие добавленные элементы разрешений:
В версии сборки выпуска манифеста (в файле obj/Debug/Android/AndroidManifest.xml) эти разрешения не настраиваются автоматически. если вы обнаружите, что переключение на сборку выпуска приводит к тому, что ваше приложение потеряет разрешение, доступное в отладочной сборке, убедитесь, что это разрешение явно задано в параметрах, необходимых для приложения (см. раздел сборка приложения android в Visual Studio для Mac; см. свойства манифеста android в Visual Studio).
Дополнительные функции
Действия и функции намерения
Манифест Android предоставляет способ описания возможностей действия. Это делается с помощью целей и [IntentFilter] настраиваемый атрибут. Можно указать, какие действия соответствуют действию, с помощью IntentFilter и какие категории подходят дляСвойство Categories . Необходимо указать по крайней мере одно действие (это объясняется тем, что действия предоставляются в конструкторе). [IntentFilter] может предоставляться несколько раз, и каждое использование приводит к отдельному элементу в . Например:
В этом примере создается следующий фрагмент XML:
Элемент Application
Например, следующий Application атрибут добавляется в Application , чтобы указать, что приложение может быть отлажено, что его понятное имя — мое приложение, а в качестве темы по умолчанию для всех действий используется стиль.
Источник
Файл манифеста AndroidManifest.xml
Файл манифеста AndroidManifest.xml предоставляет основную информацию о программе системе. Каждое приложение должно иметь свой файл AndroidManifest.xml. Редактировать файл манифеста можно вручную, изменяя XML-код или через визуальный редактор Manifest Editor (Редактор файла манифеста), который позволяет осуществлять визуальное и текстовое редактирование файла манифеста приложения.
Назначение файла
- объявляет имя Java-пакета приложения, который служит уникальным идентификатором;
- описывает компоненты приложения — деятельности, службы, приемники широковещательных намерений и контент-провайдеры, что позволяет вызывать классы, которые реализуют каждый из компонентов, и объявляет их намерения;
- содержит список необходимых разрешений для обращения к защищенным частям API и взаимодействия с другими приложениями;
- объявляет разрешения, которые сторонние приложения обязаны иметь для взаимодействия с компонентами данного приложения;
- объявляет минимальный уровень API Android, необходимый для работы приложения;
- перечисляет связанные библиотеки;
Общая структура манифеста
Файл манифеста инкапсулирует всю архитектуру Android-приложения, его функциональные возможности и конфигурацию. В процессе разработки приложения вам придется постоянно редактировать данный файл, изменяя его структуру и дополняя новыми элементами и атрибутами.
Корневым элементом манифеста является . Помимо данного элемента обязательными элементами является теги и . Элемент является основным элементом манифеста и содержит множество дочерних элементов, определяющих структуру и работу приложения. Порядок расположения элементов, находящихся на одном уровне, произвольный. Все значения устанавливаются через атрибуты элементов. Кроме обязательных элементов, упомянутых выше, в манифесте по мере необходимости используются другие элементы.
Описание
Элемент является корневым элементом манифеста. По умолчанию Eclipse создает элемент с четырьмя атрибутами:
Атрибуты
объявляет разрешение, которое используется для ограничения доступа к определенным компонентам или функциональности данного приложения. В этой секции описываются права, которые должны запросить другие приложения для получения доступа к вашему приложению. Приложение может также защитить свои собственные компоненты (деятельности, службы, приемники широковещательных намерений и контент-провайдеры) разрешениями. Оно может использовать любое из системных разрешений, определенных Android или объявленных другими приложениями, а также может определить свои собственные разрешения.
android:name название разрешения android:label имя разрешения, отображаемое пользователю android:description описание разрешения android:icon значок разрешения android:permissionGroup определяет принадлежность к группе разрешений android:protectionLevel уровень защиты
Элемент запрашивает разрешение, которые приложению должны быть предоставлены системой для его нормального функционирования. Разрешения предоставляются во время установки приложения, а не во время его работы.
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
объявляет базовое имя для дерева разрешений. Этот элемент объявляет не само разрешение, а только пространство имен, в которое могут быть помещены дальнейшие разрешения.
определяет имя для набора логически связанных разрешений. Это могут быть как объявленные в этом же манифесте с элементом
разрешения, так и объявленные в другом месте. Этот элемент не объявляет разрешение непосредственно, только категорию, в которую могут быть помещены разрешения. Разрешение можно поместить в группу, назначив имя группы в атрибуте permissionGroup элемента
Источник
Основы Android приложений
Android приложения написаны на языке программирования Java. Инструменты Android SDK компилируют ваш код — включая все данные и ресуры — в файл APK (Android Package): пакет Android, который является архивом файлов с расширением .apk . Один APK файл включает все содержимое отдельного Android приложения и этот файл Android устройства используют для установки приложения.
После установки на устройство, каждое приложение работает в его собственной защищенной песочнице:
- Операционная система Android – это многопользовательская система Linux, в которой каждое приложение запускается под отдельным пользователем.
- По умолчанию, система присваивает каждому приложению уникальный идентификатор пользователя Linux (этот ID используется системой и неизвестен приложению). Система устанавливает разрешения для всех файлов приложения и только пользователь с таким ID может иметь к ним доступ.
- Каждый процесс выполняется в своей собственной виртуальной машине, поэтому приложение выполняется изолировано от остальных приложений.
- По умолчанию, каждое приложение запускается в своем собственном отдельном процессе. Android запускает процесс, когда требуется выполнить компонент приложения и останавливает процесс, когда компонент больше не требуется, или если системе недостаточно памяти для выполнения других приложений.
Таким образом, в системе Android реализован принцип наименьших привилегий. Так что по умолчанию каждое приложение имеет доступ только к компонентам, которые необходимы ему для работы и не более того. Благодаря этому создается безопасная среда, в которой приложение не может получить доступ к элементам системы, для которых не получено соответствующее разрешение.
Однако, существуют способы обмена данными между приложениями и доступа к системным сервисам:
- Возможно установить для двух приложений общий идентификатор, в этом случае они смогут получить доступ к файлам друг друга. Для экономии ресурсов системы, приложения с одинаковым идентификатором могут также могут запускаться в одном и том же процессе и использовать одну и ту же виртуальную машину (приложения при этом должны быть подписаны одним и тем же сертификатом).
- Приложение может запросить разрешение на доступ к данным, например контактам, SMS сообщениям, присоединенным хранилищам (SD карты), камере, Bluetooth и другим. Все разрешения должны быть подтверждены пользователем во время установки приложения.
Это основы того, как Android приложение существует в системе. Остальная часть текущего документа познакомит вас:
- С базовыми компонентами фреймворка, которые определяют ваше приложение.
- С файлом манифеста, в котором описаны компоненты и требования к устройству для вашего приложения.
- С ресурсами, которые хранятся отдельно от кода и позволяют изящно оптимизировать ваше приложение для различных конфигураций Android устройств.
Компоненты приложения
Компоненты являются основными строительными блоками Android приложений. Каждый компонент является отдельной точкой входа в ваше приложение. Не все компоненты являются фактически точками входа для пользователя, некоторые из них зависят друг от друга, но каждый из компонентов представляет из себя уникальный строительный блок, который помогает определить поведение приложения в системе.
Существует четыре разных типа компонентов. Каждый из них служит для различных целей, имеет свой собственный жизненный цикл, который определяет, как компонент создается и уничтожается.
Вот эти четыре типа:
Явления (Activities)
Явления представляют собой единый экран с пользовательским интерфейсом. Например, почтовый клиент может использовать одно явление для отображения списка входящих писем, другое явление для чтения конкретного письма, а третье явление для написания нового сообщения. И хотя все явления работают вместе, чтобы сформировать общую функциональность приложения, каждое из них независимо от других. Кроме того, приложения могут запускать явления друг друга (если это разрешено). Например, приложение фотокамера может запустить явление почтового клиента для создания нового письма с только что отснятой фотографией в качестве вложения.
Явления реализуются как подклассы базового класса Activity, о них вы можете подробнее узнать в разделе Явления.
Сервисы (Services)
Сервис, это компонент, работающий в фоновом режиме и предназначенный для выполнения длительных операций или удаленных процессов. Сервис не предоставляет пользовательский интерфейс. Например, сервис может проигрывать музыку на заднем фоне, пока пользователь находится в другом приложении, или может закачивать данные по сети, не мешая пользователю взаимодействовать с устройством. Другие компоненты, например явления, могут запускать сервисы для отдельной работы или могут взаимодействовать с ними.
Службы реализуются как подклассы базового класса Service, о них вы можете подробнее узнать в разделе Сервисы.
Поставщики содержимого
Поставщики содержимого управляют общими данными в приложении. Вы можете хранить данные в файловой системе, в базе данных SQLite, в сети, в любом другом постоянном хранилище, к которому приложение имеет доступ. Через поставщики содержимого, другие приложения могут получить или модифицировать данные вашего приложения (если это разрешено). Например, Android предоставляет поставщик содержимого для управления контактными данными. Таким образом, любое приложение, которое имеет соответствующее разрешение, может запросить поставщики содержимого (например ContactsContract.Data) для чтения или изменения информации о каком-либо человеке.
Поставщики содержимого также удобны для чтения и записи не открытых данных приложения. Например, приложение NotePad использует поставщики содержимого для сохранения записей.
Поставщики содержимого реализуются как подклассы базового класса ContentProvider и должны содержать стандартный набор методов, которые позволят другим приложениям выполнять транзакции. Подробную информацию смотрите в разделе Поставщики содержимого.
Широковещательные приемники
Широковещательный приемник, это компонент, который реагирует на общесистемное оповещение. Многие широковещательные рассылки создает система — например, уведомление о выключении экрана, о низком заряде батареи, о снятой фотографии. Приложения также могут создавать рассылки — например, уведомление об окончании загрузки файла, чтобы другие приложения могли его использовать. Хотя широковещательные приемники не имеют пользовательского интерфейса, они могут создавать уведомления в строке состояния, чтобы предупредить пользователя о происходящем событии. Однако чаще всего широковещательный приемник является просто мостом между другими компонентами и делает лишь малую часть работы. Например, это может быть запуск сервиса для выполнения работы, основанной на событии.
Широковещательные приемники реализуются как подклассы базового класса BroadcastReceiver и каждая рассылка передается как объект типа Intent. За подробной информацией обращайтесь к документации по классу BroadcastReceiver.
Уникальной особенностью Android является возможность запуска одним приложением компонентов другого. Например вы хотите сделать фотографию. Наверняка на устройстве уже есть приложение, которое это умеет делать, и вы можете использовать его, вместо того, чтобы разрабатывать подобный функционал заново. Вам не нужно добавлять исходный код другого приложения и даже ссылки на него. Вместо этого вы просто запускаете явление приложения Камера и делаете фотографию. После спуска затвора, фотография будет передана в ваше приложение и вы сможете ее использовать. Для пользователя будет казаться, что работа с камерой — это часть вашего приложения.
Когда система запускает компонент, запускается процесс для приложения (если оно не было уже запущено) и создаются экземпляры классов, необходимые для работы компонента. Например, если ваше приложение запустило явление другого приложения, это явление будет работать в процессе другого приложения, а не вашего. Поэтому, в отличие от приложений в большинстве других систем, Android приложения не имеют единой точки входа в программу (например, нет основной функции main()).
Поскольку система запускает каждое приложение в отдельном процессе с разрешением для файлов, которое ограничивает доступ других приложений, ваше приложение не может напрямую активировать компоненты другого приложения. Но это может сделать система Android. Таким образом, чтобы запустить компонент другого приложения, вы должны передать в систему сообщение, которое определяет ваше намерение для запуска конкретного компонента. И система запустит этот компонент для вас.
Запуск компонентов
Три из четырех типов компонентов — явления, сервисы и широковещательные приемники — запускаются с помощью асинхронного сообщения, которое называется намерение (intent). Намерения связывают отдельные компоненты друг с другом во время выполнения (вы можете думать о них как о посыльных, которые запрашивают действия у других компонентов), независимо от того, принадлежит ли компонент вашему приложению или какому-либо другому.
Намерения создаются с помощью объектов типа Intent, которые определяют сообщение для запуска конкретного компонента или компонента заданного типа. Такие намерения называются соответственно явные и неявные.
Для явлений и сервисов, намерения определяют действие для выполнения (например, «что-то показать» или «что-то передать») и могут содержать URI данных. Например, намерение может передать запрос явлению, чтобы последнее показало изображение или веб-страницу. В некоторых случаях, вы можете запустить явление, чтобы получить от него результат. В таких случаях, явление возвращает результат так же в объекте Intent (например, вы можете оформить намерение для выбора контакта, и вам вернется другое намерение, содержащее URI, который указывает на выбранный контакт).
Для широковещательных приемников, намерения просто описывают сообщение, которое будет разослано (например, рассылка о низком заряде батареи может содержать только строку «батарея разряжена»).
Последний тип компонентов, поставщики содержимого, не могут быть запущены с помощью намерения. Они активируются, когда получают запрос от объекта типа ContentResolver. Этот объект обрабатывает все транзакции напрямую, используя поставщики содержимого и методы класса ContentResolver. Это оставляет слой абстракции между поставщиками содержимого и компонентом, запросившим информацию (для безопасности).
Вот различные методы для запуска каждого типа компонентов:
- Вы можете запустить явление (или заставить его сделать что-то новое), передав объект намерения Intent в метод startActivity() или startActivityForResult() (если вы хотите, чтобы явление вернуло результат работы).
- Вы можете запустить сервис (или передать новые инструкции на уже работающий), передав объект намерения Intent в метод startService(). Или можете связать сервис передав Intent в метод bindService().
- Вы можете инициировать рассылку передав намерение в методы sendBroadcast(), sendOrderedBroadcast() или sendStickyBroadcast().
- Вы можете выполнять запросы к поставщикам содержимого с помощью метода query() класса ContentResolver.
Подробную информацию об использовании намерений, смотрите в разделе Намерения и фильтры. Информация о запуске различных компонентов также представлена в следующих разделах: Явления, Сервисы, Широковещательные приемники и Поставщики содержимого.
Файл манифеста
Прежде чем запустить компонент приложения, система Android узнает, какие компоненты доступны, прочитав файл AndroidManifest.xml (файл манифеста). Вы должны описывать все компоненты вашего приложения в этом файле, который должен находиться в корневой директории проекта.
Кроме описания компонентов приложения, манифест служит также для следующих вещей:
- Указание разрешений, которые требуются приложению, например доступ в интернет или чтение контактов.
- Объявление минимального уровня API, который требуется для работы приложения.
- Объявление программных и аппаратных зависимостей, например камеры, bluetooth или экран с поддержкой нескольких прикосновений.
- Указание библиотек, который должны быть подключены к приложению, например Google Maps Library.
- И другое
Описание компонентов
Первичной задачей файла манифеста является информирование системы о компонентах приложения. Например, манифест может описывать явление следующим образом:
Источник