Android

Android Debug Bridge
Пишем, собираем и запускаем HelloWorld для Android в блокноте
Как Android запускает MainActivity
Droidcon NYC 2015 - How the Main Thread works

Путь к Android SDK

~/Library/Android/sdk
процесс сборки приложения

Приложение

В языке Java выполняющееся приложение представляет объект android.app.Application, экземпляр которого создаётся при запуске и уничтожается при завершении приложения (т.е. время существования экземпляра класса Application совпадает со временем существования соответствующего процесса Linux). Когда процесс завершается и перезапускается, создаётся новый экземпляр класса Application.

Компоненты

Основными составными частями любого Android-приложения являются компоненты, управляемые средой выполнения: Activity, Service, BroadcastReceiver и ContentProvider. Конфигурация и взаимодействие этих компонентов определяют поведение приложения. Перечисленные выше компоненты имеют разные области ответственности и жизненные циклы, но все они являются точками входа, посредством которых можно запускать приложения. После начала работы, любой компонент может активировать другой компонент и т.д. на протяжении всего времени выполнения приложения. Запуск компонента в текущем, либо в другом приложении производится с помощью объекта Intent. Объект Intent определяет операции, запрашиваемые у принимающей стороны (или получателя, receiver), например, отправка электронной почты или фотографирование, и может передавать данные от отправителя (sender) получателю. Объект Intent может быть явным или неявным:

  • явный объект Intent - определяет полностью классифицированное имя компонента, известное внутри приложения во время компиляции;
  • неявный объект Intent - среда выполнения создаёт связь с компонентом, для которого определён набор характеристик в IntentFilter. Если Intent обнаруживает совпадение характеристик компонента с IntentFilter, такой компонент может быть активирован.

Компоненты и их жизненные циклы относятся к терминологии, специализированной для ОС Android, поэтому нельзя установить однозначное соответствие с объектами языка Java, лежащими в их основе. Объект Java может существовать дольше соответствующего ему компонента, а среда выполнения может содержать несколько Java-объектов, относящихся к одному и тому же активному компоненту. Из-за этого могут возникать некоторые недоразумения и такая ситуация увеличивает вероятность утечек памяти.

Реализация компонента в приложении осуществляется созданием производного класса, и все компоненты в приложении должны быть зарегистрированы в файле AndroidManifest.xml.

Activity

Компонент Activity - это образ экрана, который почти всегда полностью занимает площадь реального экрана устройства. Здесь выводится информация, обрабатывается ввод пользователя и т.д. Здесь же располагаются элементы пользовательского интерфейса - кнопки, текстовые поля, изображения и др., - отображаемые на экране и содержащие ссылки на объекты в иерархии, включающей все экземпляры класса View. Следовательно, объём памяти, потребляемой компонентом Activity, может увеличиваться весьма существенно.

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

Sevice

Компонент Service может незаметно выполняться в фоновом режиме без прямого взаимодействия с пользователем. Обычно он используется для частичного снятия чрезмерной нагрузки с других компонентов, когда длительность операций превосходят длительность их существования. Компонент Service может работать в двух режимах: в режиме запускаемой службы (started) и в режиме подключаемой службы (bound):

  • в режиме запускаемой службы - компонент сервисе запускается вызовом метода Context.startService(Intent), с явным или неявным объектом Intent, и завершается вызовом метода Context.stopService(Intent);
  • в режиме подключаемой службы - несколько компонентов могут подключаться к компоненту Service, вызвав метод Context.bindService(Intent, ServiceConnection, int) и передав ему явный или неявный объект Intent. После подключения компонент может взаимодействовать с Service через интерфейс ServiceConnection и в любой момент разорвать установленную связь вызовом метода Context.unbindService(ServiceConnection). Компонент Service автоматически удаляется, когда последний компонент разорвёт связь с ним.

ContentProvider

Если возникает необходимость использовать большие объёмы данных внутри одного приложения или совместно с другими приложениями, можно воспользоваться компонентом ContentProvider. Он способен обеспечить доступ к любому источнику данных, но наиболее часто применяется в связке с базами данных SQLite, которые всегда принадлежат только одному приложению. С помощью компонента ContentProvider любое приложение может предоставлять свои данные другим приложениям, выполняющимся в удалённых процессах.

BroadcastReceiver

Этот компонент имеет узкую специализацию: он принимает сообщения, отправляемые другими компонентами внутри приложения, удалёнными приложениями или программной платформой. Входящие сообщения фильтруются, чтобы выделить предназначенные для данного экземпляра BroadcastReceiver. Компонент BroadcastReceiver должен зарегистрироваться, чтобы начать приём сообщений, и отменить регистрацию по завершении. Если этот компонент статически зарегистрирован в файле AndroidManifest.xml, он автоматически будет получать сообщения, пока приложение установлено в системе. Т.е. BroadcastReceiver может активировать связанное с ним приложение, если Intent обнаружит совпадение в отфильтрованных сообщениях.

Дополнительно

Потоки
SQLite