Приложения для Android состоят из одного или нескольких компонентов: Activities (Деятельности), Services (Службы), Content Providers (Поставщики данных), а также Broadcast Receivers (Получатели широковещательных сообщений). * Каждый компонент выполняет свою роль в приложении и может быть активирован отдельно от других (причём активирован может быть даже сторонним приложением). * В AndroidManifest.xml (файл манифеста) должны быть объявлены все компоненты приложения и системные требования, такие как необходимая минимальная версия Android или определённая аппаратная конфигурация. * Необходимые для приложения ресурсы (изображения, файлы разметки, строки и т.д.) должны содержать альтернативные варианты для различных конфигураций устройств (например, строки на разных языков или различные разметки и изображения для возможных размеров экрана). Данный текст является переводом (хотя и немного вольным) статьи из официальной документации по Android. Примечание: некоторые слова в тексте оставлены по-английски, потому что, эти термины совпадают с названиями классов с помощью которых они реализуются и их перевод только усложняет понимание (в скобках написан их буквальный перевод). Основы
Android-приложения написаны на языке программирования Java. Инструмент Android SDK (Software Development Kit — комплект разработки программного обеспечения) компилирует код вместе со всеми данными и файлами ресурсов в пакет Android - архивный файл с расширением .apk. Этот файл позволяет установить приложение на любом устройстве под управлением системы Android. После установки на устройстве, каждое приложение живёт в своей собственной изолированной программной среде:
Операционная система Android является многопользовательской Linux-системой, в которой каждое приложение это отдельный пользователь.
По умолчанию, система присваивает каждому приложению уникальный идентификатор пользователя userid (который используется только системой). Система устанавливает разрешения для всех файлов приложения таким образом, чтобы только определённый пользователь (с определённым userid) мог получить к ним доступ.
Каждый процесс имеет свою собственную виртуальную машину, так что код приложения запускается изолированно от других приложений.
По умолчанию каждое приложение выполняется в отдельном процессе Linux. Android начинает процесс, когда одному из компонентов приложения необходимо запуститься, а затем завершает процесс, когда он больше не нужен или когда системе требуется память для других приложений.
Таким образом, система Android реализует принцип наименьших привилегий. То есть, каждое приложение по умолчанию имеет доступ только к компонентам, которые необходимы для его работы и не более того. Однако, существуют способы обмена данными между приложениями и получения доступа к системным сервисам:
Возможно раздать двум приложениям одинаковые идентификаторы пользователей (userid), в этом случае они могут получить доступ к файлам друг друга. Для экономии системных ресурсов приложения с тем же идентификатором также могут быть запущены в одном процессе и использовать одну виртуальную машину. Такие приложения должны быть подписаны на один и тот же сертификат.
Приложение может запросить разрешение на доступ к системным данным, таким как контакты пользователя, SMS сообщения, карточка хранения (SD), камера, Bluetooth и многое другое. Все запросы доступа должны быть разрешены пользователем во время установки.
Компоненты приложений
Компоненты — кирпичики, из которых состоит любое приложение. Каждый компонент предоставляет отдельную точку входа в приложение для системы, хотя не каждая такая точка является актуальной для пользователя. Компоненты могут зависеть друг от друга, но каждый из них это отдельная сущность, которая играет особую роль и помогает определить общее поведение приложения. Существуют четыре типа компонентов приложения. Каждый из них служит различным целям и имеет свой жизненный цикл, который определяет, как компонент создаётся и уничтожается. Activity (Деятельность)
Activity представляет собой один экран с пользовательским интерфейсом. Например, приложение электронной почты, может иметь одну Activity, которая показывает список новых сообщений электронной почты, другую для создания нового сообщения, и ещё одну для чтения письма. Хотя все они работают вместе в рамках одного приложения, каждая из них независима от других. Таким образом, другие приложения могут вызвать любую из этих Activity (если почтовое приложение позволяет это). Например, приложение камеры может открыть Activity в которой создаётся новое сообщение, чтобы пользователь мог отправить фотографии по почте. Service (Служба)
Service это компонент, который работает в фоновом режиме и не имеет пользовательского интерфейса. Службы используются для обработки длительных операций или для выполнения удалённых процессов. Например, Service может воспроизводить музыку в фоновом режиме или получать данные по сети, не блокируя взаимодействие пользователя с работающим приложением. Service могут запустить другие компоненты, например Activity, и затем взаимодействовать с ней.
Content provider (Поставщик данных)
Content provider управляет данными приложения. Данные можно хранить в файловой системе, базе данных SQLite, в Интернете или любом другом доступном для приложения месте хранения. Через Content providers другие приложения могут запрашивать или даже изменить данные (если на это есть права доступа). Например, в операционной системе Android существует Content provider, который управляет списком контактов пользователя. Таким образом, любое приложение, с соответствующими разрешениями могут запрашивать информацию о конкретном человеке для чтения или записи. Content provider также можно использовать для чтения и записи данных, которые доступны только для одного приложения.
Broadcast receivers (Получатель широковещательных сообщений)
Broadcast receiver - компонент, который позволяет принимать широковещательные сообщения операционной системы. Такими сообщениями являются, например, объявления о том, что экран выключился, батарея разряжена или был сделан фотоснимок. Такие сообщения также могут посылаться пользовательскими приложениями, например, уведомления о том, что некоторые данные были загружены и готовы к использованию. Хотя Broadcast receiver не имеют пользовательского интерфейса, он может создавать уведомления в строке состояния. Однако, чаще всего Broadcast receiver это просто "шлюз" для других компонентов, например, он может запускать Service для обработки определённых событий. Уникальной особенностью системы Android является то, что любое приложение может запустить компоненты другого приложения. Если необходимо дать пользователю возможность сделать фотографию, то не обязательно это реализовывать, можно вызвать уже существующее приложение. После завершения оно вернёт созданную фотографию в ваше приложение для дальнейшего использования. Для пользователя это будет выглядеть как одно приложение. Для запуска любого компонента операционная система начинает новый процесс (если его ещё не было) и инициализирует классы, необходимые для компонента. Например, если в вашем приложении запускается Activity для работы с камеры (принадлежащая стороннему приложению), то она запускается в отдельном процессе, который принадлежит этому стороннему приложению, а не в процессе вашего приложения. Поэтому, в отличие от приложений на большинство других систем, приложений Android не имеют единую точку входа (нет функции main()). Так как система запускает каждое приложение в отдельном процессе с правами доступа к файлам, которые ограничивают доступ для других приложений, ваше приложение не может непосредственно вызвать компонент из стороннего приложения. Однако, операционная система Android это может, поэтому для активации такого компонента, необходимо отправить сообщение операционной системе о своём намерении начать конкретный компонент и она его активирует.
