Разработка приложений для мобильных интеллектуальных систем на платформе Intel Atom

Установка ПО для разработки и тестирования приложений

Разбить на страницы
Показывать лекцию целиком

Цель лабораторной работы

Освоить основные приемы разработки приложений для ОС Android, изучить процесс установки и настройки среды разработки, знакомство с Android Virtual Device и пользовательским интерфейсом (UI), проведение сеанса отладки.

Презентацию к лабораторной работе Вы можете скачать здесь.

Материалы к лабораторным работам Вы можете скачать здесь.

Инструкция по выполнению лабораторной работы

Подготовка

Перед тем, как приступать к созданию приложений на Android, необходимо выбрать и установить подходящую среду разработки и установить соответствующий инструментарий для разработки приложений под OC Android - Android SDK.

В качестве среды разработки мы будем использовать Eclipse IDE. Все примеры будут приведены для этой среды разработки. Конечно, можно выбрать любую другую платформу разработки, например Intellij IDEA, но лучше всего подходит Eclipse, так как она превосходно "заточена" для разработки под OC Android.

Убедитесь в том, что ваше ОС удовлетворяет системным требованиям для установки Eclipse IDE и Android SDK, описанным в http://developer.android.com/sdk/index.html.

Для начала разработки понадобится набор из Eclipse IDE, Android SDK и JDK (Java Development Kit). Весь набор программ можно скачать на официальном сайте Android для разработчиков по ссылке: http://developer.android.com/sdk/index.html. Также, программы доступны на официальных сайтах по ссылкам: http://www.oracle.com/technetwork/java/javase/downloads/index.html (JDK), http://www.eclipse.org/downloads/ (Eclipse IDE). Обратим внимание, что при скачивании программ из разных источников необходимо проверить, совместима ли версия Eclipse с Android SDK.

Android SDK представляет собой средство разработки приложений под ОС Android, и распространяется в виде ZIP или EXE файлов. Android SDK состоит из пакетов, содержимое которых возможно подгружать с помощью Android SDK Manager. В Android SDK входят следующие пакеты:

  • пакет с версиями платформ (SDK Platform) – содержит папки с версиями платформ, в каждую из которых входит файл android.jar – файл архива Java, содержащий все классы SDK Android, необходимые для создания приложений;
  • пакет с образами систем (System Image) – образ системы используется в иммуляторе Android устройства при отладке и разработке приложений;
  • пакет с исходным кодом платформы Android (sources);
  • пакет документации (Documentation) – документация SDK предоставляется локально и через Интернет. В основном она выполнена в формате Javadocs, что позволяет легко ориентироваться во множестве пакетов SDK;
  • каталоги инструментов (SDK Tools, SDK Platform-tools) – содержат все инструменты для отладки и тестирования Android-приложений;
  • USB-driver – каталог, содержащий все необходимые драйвера для подключения к поддерживающим Android устройствам.
  • Начальный пакет Android представляет только основные инструменты. Остальные компоненты, при необходимости, можно скачать и установить (например, GoogleAPI).

    Android предлагает плагин ADT (Android Developer Tools) для Eclipse IDE, который обеспечивает разработчиков эффективными инструментами для создания Android-приложений. Он расширяет богатые возможности Eclipse новыми полезными утилитами. К примеру, после установки ADT на панелях toolbar и menubar появятся "контролы", позволяющие быстро создавать проект.

    Для установки ADT, необходимо открыть панель расширения среды (InstallNewSoftware) в закладке "Help", а затем в появившемся окне добавить новый путь https://dl-ssl.google. com/android/ eclipse/.

    Далее Eclipse выполнит поиск требуемых данных, и в выпадающем списке вы сможете выбрать ADT и установить его, нажав Install. Запустится процесс инсталляции плагина. Если в ходе установки возникнут ошибки, то, возможно, что указанный ресурс более по каким-то причинам недоступен, либо вы используете старую версию Eclipse, либо не установили JDK.

    Запустите AVD Manager прямо из Eclipse (Window->Android SDK and AVD Manager). На экране появится окошко, содержащее слева список из трех основных компонентов: виртуальные устройства, установленные и доступные пакеты. В установленных пакетах находятся все компоненты, установленные по умолчанию или по необходимости. С помощью вкладки "доступные пакеты" можно автоматически скачивать и устанавливать необходимые решения. К примеру, мы можем установить Google API's любой версии, с целью использования в разрабатываемом приложении сервисов Google (карты, поиск).

    (рис 2.11) Android API для элементов UI

    Прежде чем писать приложение с использованием Android API's необходимо создать виртуальное устройство, которое позволит тестировать написанное. Чтобы создать виртуальное устройство в главном окне Android SDK and AVD Manager, кликните на кнопку New. Появится диалоговое окно, которое позволяет настроить виртуальную машину. Заполняйте поля сверху вниз. Всплывающие мини-окошки помогут вам при заполнении. На этом установка Android полностью завершена, теперь можно приступать к написанию приложений.

    Кнопки являются неотъемлемым компонентом любого интерактивного приложения. ОС Android обладает превосходными средствами создания и управления кнопками. Кнопка описана классом android.widget.Button, который является суперклассом для всевозможных типов кнопок (флажковая кнопка, радиокнопка, переключатель).

    У кнопки определено несколько конструкторов:

  • Button(Context context);
  • Button(Context context, AttributeSetattr);
  • Button(Context context, AttributeSetattr, intdefStyle).
  • Context – это класс содержащий информацию о среде приложения и предоставляющий доступ к различным системным ресурсам и классам.

    Поля текстового ввода. Android.widget.EditText является небольшой облицовкой вокруг TextView, позволяющей создавать редактируемый текст.

    EditText имеет несколько конструкторов:

  • EditText(Contextcontext);
  • EditText(Contextcontext, AttributeSetattr);
  • EditText(Context context, AttributeSetattr, intdefStyle).
  • Класс EditText содержит несколько методов. Рассмотрим некоторые из них:

  • public void selectAll(Spannable); метод фиксирует целиком в качестве текста указанный ресурс. Spannable — это интерфейс для организации текста в виде блоков (кусков текста).
  • public Editable getText(); возвращает текст, отображаемый TextView. Editable интерфейс для описания динамического текста, содержимое и разметка которого могут быть изменены.
  • public void setText(CharSequence, TextView.BufferType); устанавливает текст, отображаемый в TextView. Первый параметр определяет текст, второй - способ его хранения: динамический текст, нормальный текст(default), блочный текст.
  • Списки. Android.widget.ListView – класс, отображающий набор элементов в виде списка с возможностью прокрутки. Элементы, ассоциированные с этим представлением, описываются классом ListAdapter.

    ListAdapter – наследует базовый класс Adapter и служит мостом между данными и ListView. Часто данные могут быть представлены курсорами, но необязательно. Удобство в том, что ListView может отображать любые данные, лишь бы они были завернуты в ListAdapter. ListAdapter имеет несколько подклассов (ArrayAdapter, BaseAdapter,..), которые предназначены для различных целей. Приведем пример использования ArrayAdapter.

    ArrayAdapter – представляет данные в виде массива и добавляет удобный функционал (добавление, удаление, поиск) для работы с ними.

  • ArrayAdapter(Context, TextViewResourceId) ;
  • ArrayAdapter(Context, TextViewResourceId, T[] objects) .
  • TextViewResourceId – ссылка на xml-файл представления, данных списка. Параметр T[] objects задает отображаемые данные.
  • LinearLayout. Линейный менеджер размещения используется для отображения элементов в виде линейных списков, горизонтальных или вертикальных. Причем можно использовать несколько Layouts одновременно, в этом случае они будут делить экран.

  • LinearLayout(Context context) ;
  • LinearLayout(Context context, AttributeSet ) ;
  • LinearLayout(Context context, AttributeSet , intdefStyle) .
  • Рассмотрим основные методы:

  • generateLayoutParams(AttributeSet attr) – задает параметры layout (ширина, длина, фон, притяжение);
  • getOrientation()– задает направление размещения.
  • RelativeLayout. Этот менеджер размещения используется в том случае, если необходимо размещать элементы относительно какого-то виджета. Позиция размещения задается в виде: элемент X расположить ниже элемента Y.

    RelativeLayout очень мощное средство расположения элементов, не зависящее от размеров окна приложения и не привязанное к какой-то конкретной позиции. Таким образом, с помощью RelativeLayout мы получаем "резиновый", легко программируемый интерфейс. Конструкторы те же самые, что и у LinearLayout.

    TableLayout. Этот менеджер размещения, располагает элементы в табличном виде по строкам и колонкам. TableLayout состоит из элементов разметки TableRow, определяющих строку в которой будет содержаться виджет. TableLayout не отображает границы ячеек, из которых состоит. Каждая строка TableLayout имеет ноль или более ячеек, а каждая ячейка может хранить объект для отображения (ViewObject) . Число столбцов в таблице определяется самой длинной по количеству ячеек строкой. Таблица может содержать пустые ячейки. Ячейки могут охватывать несколько столбцов, также как и в HTML. Ширина колонки есть максимум по длинам ячеек, принадлежащих этому столбцу.

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

    TabLayout. Иногда нам приходиться описывать несколько различных отображений в одном окне обеспечивая между ними быстрое и комфортное переключение. В таком случае необходимо использовать вкладочный менеджер размещения (tablayout). Чтобы создать tablayout, необходимо выполнить следующее: создать TabHost либо в виде xml описания, либо непосредственно кодом в программе. Этот элемент является контейнером для вкладок (табов) оконного вида. TabHost должен иметь два дочерних элемента: TabWidget и FrameLayout.

    TabWidget – элемент представляющий список вкладок FrameLayout, используемый для отображения содержимого каждой вкладки.

    Существует два способа использования TabLayout:

  • Можно создать несколько представлений в одной Activity и переключаться между ними, кликая по табам.
  • Можно создать несколько Activity, описывающих различные представления, а в главном Activity обеспечить корректное переключение.
  • Android SDK обеспечивает большой набор инструментов, которые необходимы для отладки приложений. У вас должен быть JDWP-совместимый отладчик (Java Debug Wire Protocol (JDWP) – это протокол, используемый для обмена данными между отладчиком и виртуальной машиной Java, которую он и отлаживает).

    Основные компоненты среды отладки Android:

    ADB (AndroidDebugBridge) – выступает в качестве посредника между устройством и программой.

    Dalvik Debug Monitor Service (DDMS) – это элемент плагина Android, используемый для анализа работы виртуальной машины. Последовательно отображает поток информации, которая описывает каждый шаг работы виртуальной машины.

    Device or Android Virtual Device (AVD). Ваше приложение должно выполняться на устройстве или в AVD так чтобы оно могло быть отлажено. Демон adb устройства работает на устройстве или эмуляторе, и предоставляет средства для демона adb хоста для предоставления связи с устройством или эмулятором.

    ADB – клиент-серверное приложение, состоящее из трех компонентов (рис. 2.12).

    Клиент запускается на машине разработчика. Клиент можно запустить из командной строки при помощи команд, посылаемых adb. Другие инструменты Android, вроде плагина ADT и DDMS, тоже создают adb-клиенты.

    Сервер запускается на машине разработчика в виде фонового процесса. Сервер управляет соединениями между клиентами и adb-сервисом, запущенным на эмуляторе или устройстве.

    Сервис – фоновый процесс, который запускается на каждом эмуляторе или устройстве.

    Debug
    logcat[<option>]
    {<filter-specs>]
    Prints log data to the screen
    bigreport Prints dumpsys, dumpstate and logcat data to rhe screen, for the purposes of bug reporting.
    jdwp Prints a list of available JDWP processes on a given device. You can use the forward jdwp:<pid> port-forwarding specification to connect to a specific JDWP process. For example:
    adb forward tcp:800 jdwp:472
    jdb -attach localhost:8000
    (рис 2.12) Пример использования клиент-серверного приложения ADB

    LogCat – система ведения лога в Android обеспечивает механизм для сбора и просмотра системных отладочных сообщений. Логи из различных приложений и элементов системы Android собираются воедино, а затем их можно просматривать и фильтровать посредством команды logcat (рис. 2.13).

    >Logcat можно использовать для просмотра и слежения за содержанием буферов системного лога. Формат использования:

    [adb] logcat [<option>] ... [<filter-spec>] … 

    Фильтрация вывода лога: каждое сообщение лога в Android имеет тэги приоритет.

    Тэг – это строка, указывающая на компонент системы, от которого принято сообщение (например, View для системы view).

    Приоритет имеет одно из нижеследующих значений (в порядке от меньшего к большему): V – Verbose (низший приоритет); D – Debug; I – Info; W – Warning; E – Error; F – Fatal; S – Silent (наивысший приоритет, при котором ничего не выводится).

    Выражения фильтра позволяют указать системе нужные комбинации <тэг> и <приоритет>. Остальные сообщения система не выводит. Выражения фильтра имеют следующий формат: <тэг>:<приоритет>.

    (рис 2.13) Пример использования LogCat

    Отлаживать приложения в Eclipse гораздо проще, чем в консоли, благодаря использованию standpoints. Но проблема отладки через Eclipse может возникнуть, если вы отлаживаете приложения, запущенные на эмуляторе, а не на устройстве. Эмулятор работает довольно медленно, а при отладке каждый переход работает более 3 секунд. Это очень долго. Так что, если вы отлаживаете большое приложение, и при отладке наткнулись на цикл, содержащий 100 итераций, то, чтобы его пройти, вам потребуется более length(circle)*3*100 секунд. В таких случаях лучше использовать отладку с фильтрами через консоль и выводить отладочную информацию в файл с дальнейшим выявлением ошибок.

    При отладке в Eclipse пользуйтесь утилитой

    LogCat (Window->Show view->Android->LogCat, 

    которая, по сути, является оболочкой команд отладки через консоль.

    Описание приложения

    Приложение, которое будет подробно рассмотрено ниже, написано в IDE Eclipse Indigo, поэтому используйте именно эту версию или более позднюю.

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

    Общая идея. Обычно, если приложение не имеет сложной структуры, то в одном состоянии приложения используется только один стиль размещения. Мы рассмотрим приложение, которое содержит в себе много различных layouts. Это достигается путем создания в качестве главного layout, TabLayout, у которого каждый tab имеет свой способ размещения. Конечно, такая архитектура используется редко, так как пользователю приятнее видеть плавное переключение между табами в противовес нашему варианту.

    Структура.

    TabLayout →

  • Tab1: -> LinearLayout.
  • Tab2: -> RelativeLayout.
  • Tab3: -> GridLayout.
  • Архитектура Tab1.

    Интерфейс для работы с датой в Android.

    Компоненты:

  • TextView – простое текстовое поле, в котором будет отображаться текущая или вручную установленная дата.
  • Button – кнопка, которая инициирует появление окошка DitaPicker, в котором отображается текущая дата.
  • В окне стандартно есть контролы, позволяющие изменить дату.

    Архитектура Tab2.

    В этом табе будут представлены некоторые виджеты UI и в качестве бонуса будет продемонстрирован Spinner и процесс взаимодейтвия с ним.

    Компоненты:

  • TextView – текстовое поле, отображающее статическую информацию.
  • EditText – текстовое поле с поддержкой редактирования.
  • Button – кнопка OK.
  • Button – кнопка Cancel.
  • Spinner – выпадающий список с обработкой события выбора.
  • Архитектура Tab3.

    В этом табе будут представлены графические объекты (картинки), размещенные в виде таблицы.

    Компоненты:

  • GridView – представление, отображающее элементы в двумерной сетке с поддержкой вертикального или горизонтального скрола. Элементы, ассоциированные с Grid представлением, должны быть представлены с помощью ListAdapter.
  • Модель "Дизайн-XML"

    Two hands. Android SDK очень удобен, не только тем, что представляет понятный и прозрачный API, который позволяет даже неквалифицированному разработчику быстро освоить основные библиотеки Android и приступить к написанию собственных приложений, но и тем, что структура программы может быть разделена на две независимые части: Java-код, описывающий поведение программы, и Xml-код, описывающий компоненты UI(кнопки, списки, окна, …).

    Xml-подход. Такой способ был выбран по нескольким причинам:

  • Разделение работы веб-дизайнера и программиста.
  • Уменьшение массивности программы за счет использования фрагментов xml-файла в качестве виджетов UI.
  • Выполнение работы

    Проделайте следующие шаги, чтобы посмотреть предварительно подготовленное приложение в действии.

    Приложение может быть запущено с использованием виртуальной машины Davlik.

  • Импорт приложения.

    Запустите Eclipse, выберите пункт меню "File", в списке выполните команду "Import". В появившемся окне во вкладке General, щелкните на "Existing project into workspace". Появиться диалоговое окно, в котором вы можете указать путь до проекта приложения в виде архива, либо в виде простой папки. Пример находится в каталоге lab01 файла labAtom32.rar. Затем нажимаете на кнопку "OK". В "Packageexplorer" у вас появится проект с исходным кодом.

  • Запуск приложения.

    Нажмите на стрелку рядом с кнопкой "Run", в раскрывшемся списке выберите:

  • Run as->Android application

    В результате действий проект перестроится и запустится приложение. После загрузка эмулятора можно убедиться в работоспособности программы.

    Файл графического интерфейса. Рассмотрим подробнее файл описания графического интерфейса приложения. Очень часто при написании приложений возникает необходимость разместить на экране несколько представлений, совершенно различных и не связанных друг с другом по логике. В этом случае программист сразу же представляет себе интерфейс расположения вкладок браузера. Такой интерфейс поддерживает и операционная система Android.

    В папке layouts проекта, откройте с помощью xml редактора файл "tab_layout.xml". Рассмотрим его содержимое.

    Самый первый узел, "Tabhost", представляет собой контейнер для вкладок. Он содержит всего два типа элементов: "TabWidget" и "FrameLayout". Элемент "TabWidget" используется для описания дизайна панели вкладок, содержит список вкладок. Менеджер размещения "FrameLayout" необходим при описании содержимого одной вкладки. Для "TabHost" и "FrameLayout" заданы идентификаторы, так как в коде программы нам будет необходимо к ним обращаться. Менеджер размещения "LinearLayout" будет использоваться на первой вкладке. Он содержит текстовое поле для отображения даты и кнопку, позволяющую установить дату. Следующий менеджер размещения – "RelativeLayout" – содержит несколько текстовых полей: поле с поддержкой редактирования, несколько кнопок и выпадающий список. И, наконец, последний менеджер размещения – "LinearLayout" – содержит "Grid" представление, для отображения картинок в таблице. Количество колонок жестко не задано, зато можно увидеть, что ширина каждой колонки – 90 пикселей.

    Код приложения. В файле "LabAndroidActivity.java" находится код, описывающий всю логику программы. Архитектура приложения основана на следующей идее: внутри одной activity обеспечить навигацию между represent-tab используя "TabHost".

    Прежде, чем переходить к подробному разбору кода, остановимся на вопросе "Жизненный цикл приложения".

    В отличие от приложений в большинстве других систем приложения Android не имеют единой точки входа (например, отсутствует функция main()). Вместо этого существуют четыре типа основных компонентов, из которых строятся андроид-приложения и которые система может запускать по мере необходимости. Это Activity, Service, Broadcast receiver и Content provider. Как упоминалось раньше, Activity представляет собой визуальный интерфейс для одного действия, которое пользователь может совершить. Приложение обычно строится из нескольких Activity, каждый из которых выполняет свою определенную функцию. Обычно Activity не зависят друг от друга. Activity может находиться в одном из трех состояний:

  • Активно (active) или запущено (running) – находится на переднем плане (на вершине стека activity текущей задачи) и имеет фокус для взаимодействия с пользователем.
  • Приостановлено (paused) – потеряло фокус, но всё ещё видно пользователю. Сверху находится другое activity, которое или прозрачно или закрывает не весь экран. Приостановленное activity полностью <живое> (его состояние сохранено и оно привязано к оконному менеджеру), но может быть уничтожено системой в случае нехватки памяти.
  • Остановлено (stopped) – полностью перекрыто другим activity. Оно больше не видно пользователю и будет уничтожено системой, когда понадобится память.
  • Жизненный цикл activity состоит из трёх вложенных циклов:

  • Жизненный цикл activity начинается с вызова метода onCreate(), в котором производится первоначальная настройка глобального состояния, и завершается вызовом метода onDestroy(), в котором оно освобождает занятые ресурсы. Например, в onCreate() можно создать поток, загружающий данные из сети в фоновом режиме, и затем остановить его в onDestroy().
  • Видимая часть жизненного цикла происходит между вызовами onStart() и onStop(). В течение этого времени пользователь может видеть activity на экране, хотя оно может быть не на переднем плане и не взаимодействовать с пользователем. Между этими двумя методами вы можете выделять ресурсы, необходимые для отображения activity пользователю. Методы onStart() и onStop() могут вызываться столько раз, сколько activity становится видимым или скрытым для пользователя.
  • На переднем плане activity находится между вызовами onResume() и onPause(). В течение этого времени activity находится поверх других и взаимодействует с пользователем. Activity может часто переходить в состояние паузы и выходить из него. Например, метод onPause() может быть вызван, когда устройство переходит в спящий режим или когда запускается другое activity, а метод onResume() – при получении результата от закрывающегося activity. Таким образом, код в этих двух методах должен быть довольно легким.
  • Рассмотрев основные детали построения приложения, перейдем к обзору кода. В главном методе onCreate(), зададим в качестве содержимого Activity созданный нами интерфейс с помощью вызова метода setContentView ("Путь к файлу через класс ресурсов"). Очень часто при раздельном описании интерфейса и логики приложения, необходимо получить доступ к конкретному элементу интерфейса (кнопка), чтобы назначить ему определенную функцию. В таком случае, лучшим способом является использование метода findViewById (идентификатор). Параметр идентификатор – это имя компонента, определенное в файле интерфейса. Использование метода setup(), перед добавлением вкладок необходимо, если объект "TabHost" загружается через файл, как в нашем примере.

    Далее используется TabSpec для создания вкладки, устанавливания индикатора и содержимого вкладки. В классе определена закрытая переменная mDateDisplay, в которой храниться время, и переменная mPickDate – кнопка, вызывающая диалог DatePicker. У кнопки установлен фон с авто-триггером, подключаемым из файла "Button.xml". Кнопке назначен слушатель на нажатие, внутри определения которого реализован метод onClick(View) , вызываемый всякий раз при возникновении события. В методе onClick() вызывается функция ShowDialog(), которая влечет функцию onCreateDialog(). Обратите внимание, что внутри этой функции инициализируется объект DatePickerDialog , причем вторым параметром конструктору передается объект слушателя для события "изменение даты". В переменные mYear, mMonth, mDay заносится текущая дата и вызывается метод UpdateDisplay(), который обновляет содержимое текстового блока.

    Аналогично, создается вторая вкладка и заполняется содержимым. Единственное, что стоит здесь отметить, это класс Spinner . Объект класса Spinner – выпадающий вниз список, с возможностью выбора элементов. В файле strings.xml определен тег string-array, содержащий элементы item. По сути, там содержатся данные, которые будут отображены в Спиннере. Метод createFromResource() создает новый ArrayAdapter , который связывает каждый элемент из массива "planets_array" с начальным представлением Спиннера. Иначе говоря, как каждый элемент будет отображаться в тот момент, когда пользователь надумает раскрыть Спиннер. Метод setDropDownViewResource , устанавливает настройку "раскрытие-вниз" для Спиннера. И наконец, все элементы ArrayAdapter сопоставляются со Спиннером при помощи метода setAdapter(). Для Спиннера регистрируется слушатель на событие "Выбор элемента списка". Реализация объекта слушателя описана в отдельном классе с целью проведения аналогии читателем с предыдущим способом. Класс MyOnItemSelectedListener реализует интерфейс OnItemSelectedListener . В методе onItemSelected() пользователю показывается всплывающее окошко с информацией о выбранном элементе.

    Последняя вкладка отображает элементы с помощью табличного менеджера компоновки, описанного в файле интерфейса. С помощью метода setAdapter(), назначаются данные для отображения. ImageAdapter - дочерний класс BaseAdapter . Массив mThumbs содержит ссылки на картинки через класс ресурсов. Аналогично, как и Спиннеру, GridView устанавливается слушатель на событие "Выбор элемента". Заканчивают метод onCreate() три строки кода, в которых контейнеру табов добавляются созданные вкладки, по очереди.

    Выводы

    Материал этой главы вместе с лабораторной работой № 1 поможет читателям выбрать для себя необходимое устройство на платформе Intel Atom, загрузить и проинсталлировать необходимое программное обеспечение и начать с ней работать.

    Материалы к лабораторным работам Вы можете скачать здесь.

    Страницы:

    Цель лабораторной работы

    Освоить основные приемы разработки приложений для ОС Android, изучить процесс установки и настройки среды разработки, знакомство с Android Virtual Device и пользовательским интерфейсом (UI), проведение сеанса отладки.

    Презентацию к лабораторной работе Вы можете скачать здесь.

    Материалы к лабораторным работам Вы можете скачать здесь.

    Инструкция по выполнению лабораторной работы

    Подготовка

    Перед тем, как приступать к созданию приложений на Android, необходимо выбрать и установить подходящую среду разработки и установить соответствующий инструментарий для разработки приложений под OC Android - Android SDK.

    В качестве среды разработки мы будем использовать Eclipse IDE. Все примеры будут приведены для этой среды разработки. Конечно, можно выбрать любую другую платформу разработки, например Intellij IDEA, но лучше всего подходит Eclipse, так как она превосходно "заточена" для разработки под OC Android.

    Убедитесь в том, что ваше ОС удовлетворяет системным требованиям для установки Eclipse IDE и Android SDK, описанным в http://developer.android.com/sdk/index.html.

    Для начала разработки понадобится набор из Eclipse IDE, Android SDK и JDK (Java Development Kit). Весь набор программ можно скачать на официальном сайте Android для разработчиков по ссылке: http://developer.android.com/sdk/index.html. Также, программы доступны на официальных сайтах по ссылкам: http://www.oracle.com/technetwork/java/javase/downloads/index.html (JDK), http://www.eclipse.org/downloads/ (Eclipse IDE). Обратим внимание, что при скачивании программ из разных источников необходимо проверить, совместима ли версия Eclipse с Android SDK.

    Android SDK представляет собой средство разработки приложений под ОС Android, и распространяется в виде ZIP или EXE файлов. Android SDK состоит из пакетов, содержимое которых возможно подгружать с помощью Android SDK Manager. В Android SDK входят следующие пакеты:

  • пакет с версиями платформ (SDK Platform) – содержит папки с версиями платформ, в каждую из которых входит файл android.jar – файл архива Java, содержащий все классы SDK Android, необходимые для создания приложений;
  • пакет с образами систем (System Image) – образ системы используется в иммуляторе Android устройства при отладке и разработке приложений;
  • пакет с исходным кодом платформы Android (sources);
  • пакет документации (Documentation) – документация SDK предоставляется локально и через Интернет. В основном она выполнена в формате Javadocs, что позволяет легко ориентироваться во множестве пакетов SDK;
  • каталоги инструментов (SDK Tools, SDK Platform-tools) – содержат все инструменты для отладки и тестирования Android-приложений;
  • USB-driver – каталог, содержащий все необходимые драйвера для подключения к поддерживающим Android устройствам.
  • Начальный пакет Android представляет только основные инструменты. Остальные компоненты, при необходимости, можно скачать и установить (например, GoogleAPI).

    Android предлагает плагин ADT (Android Developer Tools) для Eclipse IDE, который обеспечивает разработчиков эффективными инструментами для создания Android-приложений. Он расширяет богатые возможности Eclipse новыми полезными утилитами. К примеру, после установки ADT на панелях toolbar и menubar появятся "контролы", позволяющие быстро создавать проект.

    Для установки ADT, необходимо открыть панель расширения среды (InstallNewSoftware) в закладке "Help", а затем в появившемся окне добавить новый путь https://dl-ssl.google. com/android/ eclipse/.

    Далее Eclipse выполнит поиск требуемых данных, и в выпадающем списке вы сможете выбрать ADT и установить его, нажав Install. Запустится процесс инсталляции плагина. Если в ходе установки возникнут ошибки, то, возможно, что указанный ресурс более по каким-то причинам недоступен, либо вы используете старую версию Eclipse, либо не установили JDK.

    Запустите AVD Manager прямо из Eclipse (Window->Android SDK and AVD Manager). На экране появится окошко, содержащее слева список из трех основных компонентов: виртуальные устройства, установленные и доступные пакеты. В установленных пакетах находятся все компоненты, установленные по умолчанию или по необходимости. С помощью вкладки "доступные пакеты" можно автоматически скачивать и устанавливать необходимые решения. К примеру, мы можем установить Google API's любой версии, с целью использования в разрабатываемом приложении сервисов Google (карты, поиск).

    (рис 2.11) Android API для элементов UI

    Прежде чем писать приложение с использованием Android API's необходимо создать виртуальное устройство, которое позволит тестировать написанное. Чтобы создать виртуальное устройство в главном окне Android SDK and AVD Manager, кликните на кнопку New. Появится диалоговое окно, которое позволяет настроить виртуальную машину. Заполняйте поля сверху вниз. Всплывающие мини-окошки помогут вам при заполнении. На этом установка Android полностью завершена, теперь можно приступать к написанию приложений.

    Кнопки являются неотъемлемым компонентом любого интерактивного приложения. ОС Android обладает превосходными средствами создания и управления кнопками. Кнопка описана классом android.widget.Button, который является суперклассом для всевозможных типов кнопок (флажковая кнопка, радиокнопка, переключатель).

    У кнопки определено несколько конструкторов:

  • Button(Context context);
  • Button(Context context, AttributeSetattr);
  • Button(Context context, AttributeSetattr, intdefStyle).
  • Context – это класс содержащий информацию о среде приложения и предоставляющий доступ к различным системным ресурсам и классам.

    Поля текстового ввода. Android.widget.EditText является небольшой облицовкой вокруг TextView, позволяющей создавать редактируемый текст.

    EditText имеет несколько конструкторов:

  • EditText(Contextcontext);
  • EditText(Contextcontext, AttributeSetattr);
  • EditText(Context context, AttributeSetattr, intdefStyle).
  • Класс EditText содержит несколько методов. Рассмотрим некоторые из них:

  • public void selectAll(Spannable); метод фиксирует целиком в качестве текста указанный ресурс. Spannable — это интерфейс для организации текста в виде блоков (кусков текста).
  • public Editable getText(); возвращает текст, отображаемый TextView. Editable интерфейс для описания динамического текста, содержимое и разметка которого могут быть изменены.
  • public void setText(CharSequence, TextView.BufferType); устанавливает текст, отображаемый в TextView. Первый параметр определяет текст, второй - способ его хранения: динамический текст, нормальный текст(default), блочный текст.
  • Списки. Android.widget.ListView – класс, отображающий набор элементов в виде списка с возможностью прокрутки. Элементы, ассоциированные с этим представлением, описываются классом ListAdapter.

    ListAdapter – наследует базовый класс Adapter и служит мостом между данными и ListView. Часто данные могут быть представлены курсорами, но необязательно. Удобство в том, что ListView может отображать любые данные, лишь бы они были завернуты в ListAdapter. ListAdapter имеет несколько подклассов (ArrayAdapter, BaseAdapter,..), которые предназначены для различных целей. Приведем пример использования ArrayAdapter.

    ArrayAdapter – представляет данные в виде массива и добавляет удобный функционал (добавление, удаление, поиск) для работы с ними.

  • ArrayAdapter(Context, TextViewResourceId) ;
  • ArrayAdapter(Context, TextViewResourceId, T[] objects) .
  • TextViewResourceId – ссылка на xml-файл представления, данных списка. Параметр T[] objects задает отображаемые данные.
  • LinearLayout. Линейный менеджер размещения используется для отображения элементов в виде линейных списков, горизонтальных или вертикальных. Причем можно использовать несколько Layouts одновременно, в этом случае они будут делить экран.

  • LinearLayout(Context context) ;
  • LinearLayout(Context context, AttributeSet ) ;
  • LinearLayout(Context context, AttributeSet , intdefStyle) .
  • Рассмотрим основные методы:

  • generateLayoutParams(AttributeSet attr) – задает параметры layout (ширина, длина, фон, притяжение);
  • getOrientation()– задает направление размещения.
  • RelativeLayout. Этот менеджер размещения используется в том случае, если необходимо размещать элементы относительно какого-то виджета. Позиция размещения задается в виде: элемент X расположить ниже элемента Y.

    RelativeLayout очень мощное средство расположения элементов, не зависящее от размеров окна приложения и не привязанное к какой-то конкретной позиции. Таким образом, с помощью RelativeLayout мы получаем "резиновый", легко программируемый интерфейс. Конструкторы те же самые, что и у LinearLayout.

    TableLayout. Этот менеджер размещения, располагает элементы в табличном виде по строкам и колонкам. TableLayout состоит из элементов разметки TableRow, определяющих строку в которой будет содержаться виджет. TableLayout не отображает границы ячеек, из которых состоит. Каждая строка TableLayout имеет ноль или более ячеек, а каждая ячейка может хранить объект для отображения (ViewObject) . Число столбцов в таблице определяется самой длинной по количеству ячеек строкой. Таблица может содержать пустые ячейки. Ячейки могут охватывать несколько столбцов, также как и в HTML. Ширина колонки есть максимум по длинам ячеек, принадлежащих этому столбцу.

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

    TabLayout. Иногда нам приходиться описывать несколько различных отображений в одном окне обеспечивая между ними быстрое и комфортное переключение. В таком случае необходимо использовать вкладочный менеджер размещения (tablayout). Чтобы создать tablayout, необходимо выполнить следующее: создать TabHost либо в виде xml описания, либо непосредственно кодом в программе. Этот элемент является контейнером для вкладок (табов) оконного вида. TabHost должен иметь два дочерних элемента: TabWidget и FrameLayout.

    TabWidget – элемент представляющий список вкладок FrameLayout, используемый для отображения содержимого каждой вкладки.

    Существует два способа использования TabLayout:

  • Можно создать несколько представлений в одной Activity и переключаться между ними, кликая по табам.
  • Можно создать несколько Activity, описывающих различные представления, а в главном Activity обеспечить корректное переключение.
  • Android SDK обеспечивает большой набор инструментов, которые необходимы для отладки приложений. У вас должен быть JDWP-совместимый отладчик (Java Debug Wire Protocol (JDWP) – это протокол, используемый для обмена данными между отладчиком и виртуальной машиной Java, которую он и отлаживает).

    Основные компоненты среды отладки Android:

    ADB (AndroidDebugBridge) – выступает в качестве посредника между устройством и программой.

    Dalvik Debug Monitor Service (DDMS) – это элемент плагина Android, используемый для анализа работы виртуальной машины. Последовательно отображает поток информации, которая описывает каждый шаг работы виртуальной машины.

    Device or Android Virtual Device (AVD). Ваше приложение должно выполняться на устройстве или в AVD так чтобы оно могло быть отлажено. Демон adb устройства работает на устройстве или эмуляторе, и предоставляет средства для демона adb хоста для предоставления связи с устройством или эмулятором.

    ADB – клиент-серверное приложение, состоящее из трех компонентов (рис. 2.12).

    Клиент запускается на машине разработчика. Клиент можно запустить из командной строки при помощи команд, посылаемых adb. Другие инструменты Android, вроде плагина ADT и DDMS, тоже создают adb-клиенты.

    Сервер запускается на машине разработчика в виде фонового процесса. Сервер управляет соединениями между клиентами и adb-сервисом, запущенным на эмуляторе или устройстве.

    Сервис – фоновый процесс, который запускается на каждом эмуляторе или устройстве.

    Debug
    logcat[<option>]
    {<filter-specs>]
    Prints log data to the screen
    bigreport Prints dumpsys, dumpstate and logcat data to rhe screen, for the purposes of bug reporting.
    jdwp Prints a list of available JDWP processes on a given device. You can use the forward jdwp:<pid> port-forwarding specification to connect to a specific JDWP process. For example:
    adb forward tcp:800 jdwp:472
    jdb -attach localhost:8000
    (рис 2.12) Пример использования клиент-серверного приложения ADB

    LogCat – система ведения лога в Android обеспечивает механизм для сбора и просмотра системных отладочных сообщений. Логи из различных приложений и элементов системы Android собираются воедино, а затем их можно просматривать и фильтровать посредством команды logcat (рис. 2.13).

    >Logcat можно использовать для просмотра и слежения за содержанием буферов системного лога. Формат использования:

    [adb] logcat [<option>] ... [<filter-spec>] … 

    Фильтрация вывода лога: каждое сообщение лога в Android имеет тэги приоритет.

    Тэг – это строка, указывающая на компонент системы, от которого принято сообщение (например, View для системы view).

    Приоритет имеет одно из нижеследующих значений (в порядке от меньшего к большему): V – Verbose (низший приоритет); D – Debug; I – Info; W – Warning; E – Error; F – Fatal; S – Silent (наивысший приоритет, при котором ничего не выводится).

    Выражения фильтра позволяют указать системе нужные комбинации <тэг> и <приоритет>. Остальные сообщения система не выводит. Выражения фильтра имеют следующий формат: <тэг>:<приоритет>.

    (рис 2.13) Пример использования LogCat

    Отлаживать приложения в Eclipse гораздо проще, чем в консоли, благодаря использованию standpoints. Но проблема отладки через Eclipse может возникнуть, если вы отлаживаете приложения, запущенные на эмуляторе, а не на устройстве. Эмулятор работает довольно медленно, а при отладке каждый переход работает более 3 секунд. Это очень долго. Так что, если вы отлаживаете большое приложение, и при отладке наткнулись на цикл, содержащий 100 итераций, то, чтобы его пройти, вам потребуется более length(circle)*3*100 секунд. В таких случаях лучше использовать отладку с фильтрами через консоль и выводить отладочную информацию в файл с дальнейшим выявлением ошибок.

    При отладке в Eclipse пользуйтесь утилитой

    LogCat (Window->Show view->Android->LogCat, 

    которая, по сути, является оболочкой команд отладки через консоль.

    Описание приложения

    Приложение, которое будет подробно рассмотрено ниже, написано в IDE Eclipse Indigo, поэтому используйте именно эту версию или более позднюю.

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

    Общая идея. Обычно, если приложение не имеет сложной структуры, то в одном состоянии приложения используется только один стиль размещения. Мы рассмотрим приложение, которое содержит в себе много различных layouts. Это достигается путем создания в качестве главного layout, TabLayout, у которого каждый tab имеет свой способ размещения. Конечно, такая архитектура используется редко, так как пользователю приятнее видеть плавное переключение между табами в противовес нашему варианту.

    Структура.

    TabLayout →

  • Tab1: -> LinearLayout.
  • Tab2: -> RelativeLayout.
  • Tab3: -> GridLayout.
  • Архитектура Tab1.

    Интерфейс для работы с датой в Android.

    Компоненты:

  • TextView – простое текстовое поле, в котором будет отображаться текущая или вручную установленная дата.
  • Button – кнопка, которая инициирует появление окошка DitaPicker, в котором отображается текущая дата.
  • В окне стандартно есть контролы, позволяющие изменить дату.

    Архитектура Tab2.

    В этом табе будут представлены некоторые виджеты UI и в качестве бонуса будет продемонстрирован Spinner и процесс взаимодейтвия с ним.

    Компоненты:

  • TextView – текстовое поле, отображающее статическую информацию.
  • EditText – текстовое поле с поддержкой редактирования.
  • Button – кнопка OK.
  • Button – кнопка Cancel.
  • Spinner – выпадающий список с обработкой события выбора.
  • Архитектура Tab3.

    В этом табе будут представлены графические объекты (картинки), размещенные в виде таблицы.

    Компоненты:

  • GridView – представление, отображающее элементы в двумерной сетке с поддержкой вертикального или горизонтального скрола. Элементы, ассоциированные с Grid представлением, должны быть представлены с помощью ListAdapter.
  • Модель "Дизайн-XML"

    Two hands. Android SDK очень удобен, не только тем, что представляет понятный и прозрачный API, который позволяет даже неквалифицированному разработчику быстро освоить основные библиотеки Android и приступить к написанию собственных приложений, но и тем, что структура программы может быть разделена на две независимые части: Java-код, описывающий поведение программы, и Xml-код, описывающий компоненты UI(кнопки, списки, окна, …).

    Xml-подход. Такой способ был выбран по нескольким причинам:

  • Разделение работы веб-дизайнера и программиста.
  • Уменьшение массивности программы за счет использования фрагментов xml-файла в качестве виджетов UI.
  • Выполнение работы

    Проделайте следующие шаги, чтобы посмотреть предварительно подготовленное приложение в действии.

    Приложение может быть запущено с использованием виртуальной машины Davlik.

  • Импорт приложения.

    Запустите Eclipse, выберите пункт меню "File", в списке выполните команду "Import". В появившемся окне во вкладке General, щелкните на "Existing project into workspace". Появиться диалоговое окно, в котором вы можете указать путь до проекта приложения в виде архива, либо в виде простой папки. Пример находится в каталоге lab01 файла labAtom32.rar. Затем нажимаете на кнопку "OK". В "Packageexplorer" у вас появится проект с исходным кодом.

  • Запуск приложения.

    Нажмите на стрелку рядом с кнопкой "Run", в раскрывшемся списке выберите:

  • Run as->Android application

    В результате действий проект перестроится и запустится приложение. После загрузка эмулятора можно убедиться в работоспособности программы.

    Файл графического интерфейса. Рассмотрим подробнее файл описания графического интерфейса приложения. Очень часто при написании приложений возникает необходимость разместить на экране несколько представлений, совершенно различных и не связанных друг с другом по логике. В этом случае программист сразу же представляет себе интерфейс расположения вкладок браузера. Такой интерфейс поддерживает и операционная система Android.

    В папке layouts проекта, откройте с помощью xml редактора файл "tab_layout.xml". Рассмотрим его содержимое.

    Самый первый узел, "Tabhost", представляет собой контейнер для вкладок. Он содержит всего два типа элементов: "TabWidget" и "FrameLayout". Элемент "TabWidget" используется для описания дизайна панели вкладок, содержит список вкладок. Менеджер размещения "FrameLayout" необходим при описании содержимого одной вкладки. Для "TabHost" и "FrameLayout" заданы идентификаторы, так как в коде программы нам будет необходимо к ним обращаться. Менеджер размещения "LinearLayout" будет использоваться на первой вкладке. Он содержит текстовое поле для отображения даты и кнопку, позволяющую установить дату. Следующий менеджер размещения – "RelativeLayout" – содержит несколько текстовых полей: поле с поддержкой редактирования, несколько кнопок и выпадающий список. И, наконец, последний менеджер размещения – "LinearLayout" – содержит "Grid" представление, для отображения картинок в таблице. Количество колонок жестко не задано, зато можно увидеть, что ширина каждой колонки – 90 пикселей.

    Код приложения. В файле "LabAndroidActivity.java" находится код, описывающий всю логику программы. Архитектура приложения основана на следующей идее: внутри одной activity обеспечить навигацию между represent-tab используя "TabHost".

    Прежде, чем переходить к подробному разбору кода, остановимся на вопросе "Жизненный цикл приложения".

    В отличие от приложений в большинстве других систем приложения Android не имеют единой точки входа (например, отсутствует функция main()). Вместо этого существуют четыре типа основных компонентов, из которых строятся андроид-приложения и которые система может запускать по мере необходимости. Это Activity, Service, Broadcast receiver и Content provider. Как упоминалось раньше, Activity представляет собой визуальный интерфейс для одного действия, которое пользователь может совершить. Приложение обычно строится из нескольких Activity, каждый из которых выполняет свою определенную функцию. Обычно Activity не зависят друг от друга. Activity может находиться в одном из трех состояний:

  • Активно (active) или запущено (running) – находится на переднем плане (на вершине стека activity текущей задачи) и имеет фокус для взаимодействия с пользователем.
  • Приостановлено (paused) – потеряло фокус, но всё ещё видно пользователю. Сверху находится другое activity, которое или прозрачно или закрывает не весь экран. Приостановленное activity полностью <живое> (его состояние сохранено и оно привязано к оконному менеджеру), но может быть уничтожено системой в случае нехватки памяти.
  • Остановлено (stopped) – полностью перекрыто другим activity. Оно больше не видно пользователю и будет уничтожено системой, когда понадобится память.
  • Жизненный цикл activity состоит из трёх вложенных циклов:

  • Жизненный цикл activity начинается с вызова метода onCreate(), в котором производится первоначальная настройка глобального состояния, и завершается вызовом метода onDestroy(), в котором оно освобождает занятые ресурсы. Например, в onCreate() можно создать поток, загружающий данные из сети в фоновом режиме, и затем остановить его в onDestroy().
  • Видимая часть жизненного цикла происходит между вызовами onStart() и onStop(). В течение этого времени пользователь может видеть activity на экране, хотя оно может быть не на переднем плане и не взаимодействовать с пользователем. Между этими двумя методами вы можете выделять ресурсы, необходимые для отображения activity пользователю. Методы onStart() и onStop() могут вызываться столько раз, сколько activity становится видимым или скрытым для пользователя.
  • На переднем плане activity находится между вызовами onResume() и onPause(). В течение этого времени activity находится поверх других и взаимодействует с пользователем. Activity может часто переходить в состояние паузы и выходить из него. Например, метод onPause() может быть вызван, когда устройство переходит в спящий режим или когда запускается другое activity, а метод onResume() – при получении результата от закрывающегося activity. Таким образом, код в этих двух методах должен быть довольно легким.
  • Рассмотрев основные детали построения приложения, перейдем к обзору кода. В главном методе onCreate(), зададим в качестве содержимого Activity созданный нами интерфейс с помощью вызова метода setContentView ("Путь к файлу через класс ресурсов"). Очень часто при раздельном описании интерфейса и логики приложения, необходимо получить доступ к конкретному элементу интерфейса (кнопка), чтобы назначить ему определенную функцию. В таком случае, лучшим способом является использование метода findViewById (идентификатор). Параметр идентификатор – это имя компонента, определенное в файле интерфейса. Использование метода setup(), перед добавлением вкладок необходимо, если объект "TabHost" загружается через файл, как в нашем примере.

    Далее используется TabSpec для создания вкладки, устанавливания индикатора и содержимого вкладки. В классе определена закрытая переменная mDateDisplay, в которой храниться время, и переменная mPickDate – кнопка, вызывающая диалог DatePicker. У кнопки установлен фон с авто-триггером, подключаемым из файла "Button.xml". Кнопке назначен слушатель на нажатие, внутри определения которого реализован метод onClick(View) , вызываемый всякий раз при возникновении события. В методе onClick() вызывается функция ShowDialog(), которая влечет функцию onCreateDialog(). Обратите внимание, что внутри этой функции инициализируется объект DatePickerDialog , причем вторым параметром конструктору передается объект слушателя для события "изменение даты". В переменные mYear, mMonth, mDay заносится текущая дата и вызывается метод UpdateDisplay(), который обновляет содержимое текстового блока.

    Аналогично, создается вторая вкладка и заполняется содержимым. Единственное, что стоит здесь отметить, это класс Spinner . Объект класса Spinner – выпадающий вниз список, с возможностью выбора элементов. В файле strings.xml определен тег string-array, содержащий элементы item. По сути, там содержатся данные, которые будут отображены в Спиннере. Метод createFromResource() создает новый ArrayAdapter , который связывает каждый элемент из массива "planets_array" с начальным представлением Спиннера. Иначе говоря, как каждый элемент будет отображаться в тот момент, когда пользователь надумает раскрыть Спиннер. Метод setDropDownViewResource , устанавливает настройку "раскрытие-вниз" для Спиннера. И наконец, все элементы ArrayAdapter сопоставляются со Спиннером при помощи метода setAdapter(). Для Спиннера регистрируется слушатель на событие "Выбор элемента списка". Реализация объекта слушателя описана в отдельном классе с целью проведения аналогии читателем с предыдущим способом. Класс MyOnItemSelectedListener реализует интерфейс OnItemSelectedListener . В методе onItemSelected() пользователю показывается всплывающее окошко с информацией о выбранном элементе.

    Последняя вкладка отображает элементы с помощью табличного менеджера компоновки, описанного в файле интерфейса. С помощью метода setAdapter(), назначаются данные для отображения. ImageAdapter - дочерний класс BaseAdapter . Массив mThumbs содержит ссылки на картинки через класс ресурсов. Аналогично, как и Спиннеру, GridView устанавливается слушатель на событие "Выбор элемента". Заканчивают метод onCreate() три строки кода, в которых контейнеру табов добавляются созданные вкладки, по очереди.

    Выводы

    Материал этой главы вместе с лабораторной работой № 1 поможет читателям выбрать для себя необходимое устройство на платформе Intel Atom, загрузить и проинсталлировать необходимое программное обеспечение и начать с ней работать.

    Материалы к лабораторным работам Вы можете скачать здесь.

    Вернуться к учебному плану