Основы приложения

Материал из AndroidFan

Перейти к: навигация, поиск
Руководство разработчика
Основы Андройд
Что такое Андройд?
Описание фреймворка
Основы приложения
Пользовательский интерфейс
Ресурсы приложения new!
Intent'ы и Intent фильтры
Хранение данных new!
Контент провайдеры
Безопастность и права доступа
Файл AndroidManifest.xml
Графика
Аудио и видео
Позиционирование и карты
Виджеты
Bluetooth
Поиск new!
Тестирование и наладка new!
Разработка
В Eclipse с ADT плагином
В других IDE
На устройстве
Отладка
Тестирование new!
Инструментарий
Публикация
Подписывание приложения
Управление версиями приложения
Подготовка к публикации
Публикация приложения
Лучшие приёмы
Совместимость new!
Поддержка множества экранов
Рекомендации по UI
Проектирование для повышения производительности
Проектирование для улучшения отзывчивости
Проектирование для достижения цельности
Приложения
Уровни Android API
Фильтрация в Android Merket new!
Место установки приложения new!
Поддерживаемые форматы медиа
Список Intent'ов: Google Apps
Словарь терминов

Содержание

Основы приложения

Приложения для Андройд пишутся на языке программирования Java. Скомпилированный Java-код вместе с данными и ресурсными файлами, необходимыми для приложения - упаковываются с помощью инструмента aapt в пакет Андройд как архивный файл с расширением .apk . Этот файл является техническим средством распространения и установки на мобильные устройства; это файл который пользователи скачивают на свои устройства. Весь код в одном .apk файле относится к одному приложению.

Во многих отношениях, каждое Андройд приложение живет в его собственном мире:

  • По умолчанию каждое приложение Андройд запускается в собственном процессе Linux. Андройд стартует процесс когда любой код приложения нуждается в исполнении и ликвидрует процесс когда болеше не нужен и системные ресурсы требуются для других приложений.
  • Каждый процесс имеет свою собственную виртуальную машину (VM), так код приложения запускается в изоляции от кода других приложений.
  • По умолчанию каждому приложению присваивается уникальный идентификатор пользователя (ID) Linux. Разрешения устанавливаются таким образом, что файлы приложения видимы только тому пользователю и самому приложению - хотя есть способы экспортировать их в другие приложения с таким же успехом.

Возможно наладить для двух приложений совместное использование одинакового идентификатора пользователя (ID), в этом случае они будут видеть файлы друг друга. Для экономии системных ресурсов приложения с одинаковым ID могут быть также запущены в одном и том же процессе Linux, совместно используя VM.


Компоненты приложения.

Основная возможность Андройда это возможность одного приложения использовать части других приложений (предоставляемые теми приложениями которые позволяют это). К примеру если вашму приложению нужно отобразить прокручивающийся список из картинок и в другом приложении разработан подходящий скроллер и сделан доступным другим, вы можете вызвать этот скроллер для выполнения работы в вашем приложении, вместо его самостоятельной разработки. Ваше приложение не включает в себя код другого приложения или ссылку на него. Вернее оно просто запускается как часть другого приложения когда появляентся необходимость.

Для этой работы система должна иметь возножность запускать процесс приложения когда понадобится любая его часть, и подвергать обработке оъекты Java для его части. Поэтому, в отличие от приложений на большинстве других систем, приложения Андройд не имеют одной точки входа в приложение (нет main() функции к примеру). Вернее они имеют основные компоненты, которые система может подвергнуть обработке и запустить при необходимости. Есть четыре типа компонет:

Активити
Активити представляет собой видимый пользовательский интерфейс для одной специальной задачи которую пользователь может решать. К примеру активити может представлять список опций меню которые могут быть выбраны пользователем или отображать фотографии вместе с их подписями. Приложение для отправки текстовых сообщений может иметь одну активити которая показывает список контактов и другие активити для просмотра старых сообщений или изменения настроек. Хотя они работают вместе формируя цельный пользовательский итерфейс, каждая активити независима от других. Каждая реализовывается как подкласс базового класса Activity.
Приложение может содержать только одну активити или, как было упомянуто в приложении для текстовых сообщений, оно может содержать несколько. Что такое активити и сколько имеется зависимостей, конечно, в приложении и его проекте. Обычно одна из активити помечается как первая, которая должна быть показана пользователю при запуске приложения. Перемещение с одной активити на другую совершается с помощью запуска следующей активити.
Каждая активити вписывается в окно по умолчанию. Обычно окно заполняет экран, но оно может быть меньше чем экран и находиться поверх других окон. Активити может также использовать дополнительные окна - например pop-up сообщение которое вызывается для ответа пользователя в середине активити или окно, которое отображается пользователю с необходимой информацией когда они выбирают некоторый пункт на экране.
Видимое содержимое окна обеспечивается иерархией view'ов - объектов полученных от базового класса View. Каждый view управляет некоторой прямоугольной облатью пространства внутри окна. Родительские view содержат и планируют размещение своих наследников. Страница с view'ами (теми что внизу иерархии) рисуются а прямоугольниках которыми они управляют и отвечают на действия пользователя направленные на их область пространства. Таким образом view'ы так где имеет место взаимодействие с пользователем. Например, view может отобразить небольшое изображение и инициировать действие когда пользователь нажимает на изображение. Андройд имеет некоторое количество готовых view которые вы можете использовать - включая кнопки, текстовые поля, полосы прокрутки, пункты меню, кнопки-флажки и так далее.
Иерархия view располагается а окне активити с помощью метода Activity.setContentView(). Контент view это объект View во главе иерархии. (Смотри отдельный документ Пользовательский интерфейс для более подробной информации по view и их иерархии.


Службы
Служба не имеет видимого пользовательского интерфейса, а запускается в фоновом режиме на неопределенный промежуток времени. К примеру служба может проигрывать фоновую музыку пока пользователь занят чем-то другим, или она может запросить данные через сеть или вычислить что-нибудь и предоставить результат активити при необходимости. Каждая служба расширяет базовый класс Service.
Важнейший пример это медиаплеер проигрывающий песни из плейлиста. Приложение плеера мероятно может содержать одну или более активити которые позволяют пользователю выбрать песни и начать проигрывать их. Однако воспроизведение музыки не может быть обработано активити, потому что пользователи предполагают что музыка продолжит играть даже если пользователь покинет плеер и начнет делать что-то другое. Для того чтобы музыка продолжала играть, активити медиаплеера должна запустить службу для работы в фоне. В таком случае система оставит службу воспроизведения музыки даже если стартовавшая его активити покинет экран.
Есть возможность подключиться (связаться) с запущенной службой (или запустить службу, если она еще не запущена). Пока вы подключены, вы можете взаимодействовать со службой через предоставляемый внешний интерфейс. Для службы музыки этот интерфейс может позволять пользователю ставить на паузу, прематывать, останавливать и перезапускать воспроизведение.
Как и активити и другие компоненты, службы запускаются в основном потоке процесса приложения. Так что они не могут блокировать другие компоненты или пользовательский интерфейс, они часто порождают еще один поток для ресурсоемких задач (как воспроизведение музыки). Смотрите главу Процессы и потоки далее.


Броадкаст ресиверы
Броадкаст ресивер это компонент который не делает ничего кроме получения и реагирования на широковещательные сообщения (броадкасты|broadcasts). Много броадкастов исходят от системного кода - к примеру сообщение что часовй пояс изменился, что батарея разряжена, что фотография сделана или что пользователь сменил языковую настройку. Приложения согут также отправлять броадкасты - к примеру чтобы позволить другим приложениям знать что некоторые данные были загружены на усройство и доступны им для использования.
Приложение может иметь любое число броадкаст ресиверов для ответа на любое число сообщений считающихся важными. Все ресиверы расширяют базовый класс BroadcastReceiver.
Броадкакаст ресиверы не отображают информацию в пользовательском интерфейсе. Однако они могут запустить активити в ответ на информацию, которую они получили, они могут использовать Менеджер Уведомлений (NotificationManager) чтобы оповестить пользователя. Уведомления могут привлечь внимание пользователя различными способами - миганием подсветки, вибрацией, воспроизведением звука, и так далее. Они обычно оставляют постоянную иконку в статус баре, который пользователь может открыть для получения информации.


Контент провайдеры
Контент провайдер создает некоторый набор даннных приложения, которые доступны для других приложений. Данные могут храниться в файловой системе, в SQL базе данных, или любым другим способом, который имеет смысл. Контент провайдер расширяет базовый класс ContentProvider для реализации стандартного набора методов, которые делают возможным другим приложениям запрашивать и хранить данные управляемые контент провайдером. Однако приложения не вызывают эти методы напрямую. Вернее они вместо этого используют объект контент-резолвер (ContentResolver) и вызывают его методы. Контент-резолвер может общаться с любым контент провайдером; он взаимодействует с провайдером для управления любыми взаимодействиями между процессами которые связаны.
Смотрите отдельный документ Контент провайдеры для более подробной информации по использованию контент провайдеров.


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


Активирующие компоненты: интенты (intents)

Контент провайдеры активируются когда они вызываются запросом от контент-резолвера. Три другие компоненты - активити, службы и броадкаст ресиверы - активируются с помощью асинхронных сообщений называемыми интентами (intents). Интент это объект Intent который хранит содержание сообщения. Для активити и служб он определяет запрашиваемоем действие и, помимо всего прочего, задает URI данных для него. К примеру он может передать запрос на отображение картинки пользователю или позволить пользователю отредактировать некоторый текст. Для броадкаст ресиверов объект Intent определяет действие для будущего оповещения. Например он может оповестить заинтересованные стороны, что кнопка камеры была нажата.

Существуют отдельные методы для активизации каждого типа компонент: Активити запущена (или получена путем какого-то действия) с помощью передаци объекта Intent в Context.startActivity() или Activity.startActivityForResult(). Отвечающая активити может посмотреть на исходный интент являющийся причиной запуска активити путем вызова его метода getIntent(). Андройд вызывает метод onNewIntent() у активити для передаци ему любых последующих интентов.

Одна активити часто запускает следующую. Если можно ожидать возвращения результата от первичной активити вызывается метод startActivityForResult() вместо startActivity(). Например если запускается активити которая позволяет пользователю выбрать фото, можно ожидать возвращения выбранного фото. Результат возвращается в объект Intent который передается вызываемому методу активити onActivityResult().

Служба запускается (или инструкции получаются уже запущенной службой) путем передачи объекта Intent в Context.startService(). Андройд вызывает метод службы onStart() и передает ему объект Intent.

Подобным образом интент может быть передан в Context.bindService() для установления постоянного подключения между вызывемым компонентом и необходимой службой. Similarly, an intent can be passed to Context.bindService() to establish an ongoing connection between the calling component and a target service. The service receives the Intent object in an onBind() call. (If the service is not already running, bindService() can optionally start it.) For example, an activity might establish a connection with the music playback service mentioned earlier so that it can provide the user with the means (a user interface) for controlling the playback. The activity would call bindService() to set up that connection, and then call methods defined by the service to affect the playback.

A later section, Remote procedure calls, has more details about binding to a service.

An application can initiate a broadcast by passing an Intent object to methods like Context.sendBroadcast(), Context.sendOrderedBroadcast(), and Context.sendStickyBroadcast() in any of their variations. Android delivers the intent to all interested broadcast receivers by calling their onReceive() methods.

For more on intent messages, see the separate article, Intents and Intent Filters.

Останавливающие компоненты

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

Активити, с другой стороны, обеспечивают пользовательский интерфейс. Они общаются с пользователем; пока общение продолжается могут оставаться активными, даже когда ничего не делают. Аналогично, Службы могут оставаться запущенными долгое время. Таким образом, Андройд имеет методы для выключения активити и сервисов в следующем порядке: Активити может быть выключена вызовом finish(). Одна активити может выключить дргугю вызовом метода finishActivity() Служба может быть остановлена вызовом stopSelf() или вызовом Context.stopService()

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

Файл манифеста

Перед тем, как Андройд сможет запустить компонент приложения, он должен понять где компонент находится. Поэтому приложения регистируют компоненты в файле манифеста, который зашит в apk-пакет, содержащий код, файлы и ресурсы.

Файл Манифеста — это структурированный xml файл и он всегда называется AndroidManifest.xml для всех приложений. Он состоит из нескольких определений компонентов приложения, таких как названия библиотек, нужных приложению, и определений превилегий приложения.

Но принципиальная задача манифеста — это информировать Андройд о компонентах приложения. Например, активити может быть декларирована следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<manifest . . . >
    <application . . . >
        <activity android:name="com.example.project.FreneticActivity"
                  android:icon="@drawable/small_pic.png"
                  android:label="@string/freneticLabel" 
                  . . .  >
        </activity>
        . . .
    </application>
</manifest>

Атрибут name элемента <Activity> называет подкласа Activity, который реализует активити. Icon и Label указывают на файлы ресурсов, которые показываются пользователю.

Другие компоненты декларируются аналогичным путем - <service> для Служб,<recevier> для Бродкаст ресиверов и <provider> для контент провайдеров. Активити, Службы и конетн провайдеры не определенные в файле манифеста не будут видны системе и не будут никогда запущены. Однако, Бродкаст ресиверы могут быть декларированы в манифесте или созданы динамически и зарегистрированы вызовом Context.registerReceiver()

Интент фильтры

Активити и Задания

Как описано ранее, одна активити может запустить другую, включая описанные в других приложениях. As noted earlier, one activity can start another, including one defined in a different application.