T.M. SoftStudio

feci quod potui, faciant meliora potentes

Купить полную версию курса "Программирование мобильных приложений для платформы Android" (русскоязычная версия, лекции, тесты, лабораторные работы)

Программирование мобильных приложений для платформы Android

Лекция 3. Основы Android приложений. Часть 1

Рассмотрим четыре фундаментальные блоки, на основе которых все Android приложения строятся.

Эти блоки реализованы в виде Java классов.

И первый из этих блоков – класс Activity.

Это главный класс, который пользователи видят при запуске приложения.

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

Остальные три компонента работают за сценой, поэтому они не имеют GUI.

И эти компоненты включают:

    Сервисы для поддержки продолжительных или фоновых операций.

    Радиовещательные приемники, которые прослушивают и реагируют на события, которые происходят в устройстве.

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

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

И каждый из этих компонентов служит различным целям в Android экосистеме.

И, следовательно, имеет свою точку входа, и собственные API интерфейсы.

Давайте рассмотрим каждый из этих компонентов.

Во-первых, давайте поговорим о классе Activity.

Как я сказал ранее, этот класс предназначен для представления графического пользовательского интерфейса для пользователя и для захвата взаимодействия пользователя с этим интерфейсом.

Как общее правило, активность должна поддерживать одну целенаправленную вещь, которую пользователь может сделать.

Такую как набор телефонного номера или ввод контактной информации для одного человека, и так далее.

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

Теперь, в качестве примера активности, давайте посмотрим на приложение телефон.

Вы помните из предыдущих уроков, что приложение телефон открывает пользователю интерфейс с несколькими вкладками.

Одну вкладку для телефонного дозвона, одну для журнала вызовов и одну для списка контактов.

В Android 4.2, исходный код этого приложения фактически является частью приложения contacts и содержится в файле dialtectsactivity.java.

(http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android-apps/)

Как вы можете видеть, класс активности приложения является подклассом активности.

И комментарии здесь объясняют, что эта активность отображает вкладки, содержащие телефон, журнал звонков, список контактов и предпочтения.

Следующим компонентом является класс Service.

В отличие от активности, служба работает в фоновом режиме.

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

Вместо этого, сервисы имеют две основные цели.

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

Во-вторых, они предоставляют возможность для различных процессов запрашивать операции и совместно использовать данные.

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

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

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

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

В музыкальном приложении откроем файл MediaPlaybackService.java.

Как вы можете видеть, сервис приложения это подкласс класса Service.

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

Следующий компонент – широковещательный приемник (broadcast receiver).

Broadcast receiver слушает и реагирует на события.

И по существу он играет роль абонента в шаблоне публикации/подписки (publish/subscribe).

В Android события представлены классом Intent.

Объект издателя создает объекты Intent, а затем широко вещает их.

Теперь, когда они в эфире, эти объекты Intent направляются на широковещательные приемники, которые подписаны или зарегистрированы для этих конкретных типов событий Intent.

В этот момент, приемник может реагировать на событие.

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

Давайте взглянем на это приложение.

Давайте представим, что кто-то решил отправить мне SMS сообщение.

Это сообщение SMS будет создано и отправлено и будет распространено через телефонные сети и в конечном итоге придет на мой телефон.

И когда это произойдет, Android поставит значок уведомления в панель уведомлений, давая мне знать, что SMS сообщение прибыло.

Теперь, конечно, вы не можете знать точно, когда вы собираетесь получить такое сообщение.

Поэтому Android имеет программное обеспечение, которое просто сидит и ждет прибытие SMS сообщений.

И когда SMS сообщения прибывают, программное обеспечение широко вещает события SMS_received Intent.

И есть еще широковещательный приемник, который прослушивает эти события и в конечном счете получает объект Intent и затем запускает сервис, который загружает и хранит входящие SMS сообщения.

Теперь в приложении MMS откроем широковещательный приемник SMSreceiver.java.

Как вы можете видеть, класс SMS приемника является подклассом BroadcastReceiver.

И комментарии объясняют, что этот приемник обрабатывает входящее SMS сообщение и является диспетчером для сервиса, который заботится о загрузке и хранении сообщения.

Последний компонент – это контент-провайдер.

Контент-провайдер позволяет приложениям хранить и обмениваться данными.

Контент-провайдеры используют интерфейс типа базы данных, но они больше, чем просто базы данных.

Например, контент-провайдеры обрабатывают низкоуровневые детали взаимодействия между процессами.

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

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

Запустим приложение браузер.

Если я нажму на значок рядом с адресной строкой, браузер откроет список закладок или сохраненных адресов для веб-сайтов, к которым я возможно захочу получить быстрый доступ в будущем.

Когда пользователь добавляет одну из таких закладок, приложение браузер сохраняет ее в контент-провайдере.

Давайте откроем исходный код приложения браузер и посмотрим на файл browserprovider.java.

Как вы можете видеть, провайдер браузера является подклассом контент-провайдера ContentProvider.

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

Ранее мы приложение HelloAndroid.

Это простое приложение, в котором участвует только одна активность.

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

И, конечно, как только вы узнаете, как использовать две активности, вы легко добавите третью активность и так далее.

Это приложение называется MapLocation и одна из ее активностей позволяет пользователю ввести почтовый адрес.

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

И нажатие на эту кнопку запускает вторую активность Google Maps, которая представляет карту с центром в адресе, который пользователь только что ввел.

Этот график изображает процесс написания и создания приложения Android.

Во-первых, вы создаете исходный код и ресурсы, которые составляют ваше приложение.

Далее, инструменты компилируют исходный код и подготавливают ресурсы.

На выходе появляется Android пакет или APK, который соответствует вашему исполняемому приложению.

Далее APK подписывается цифровой подписью, чтобы идентифицировать вас как его разработчика.

И, наконец, APK устанавливается на устройство или эмулятор и запускается.

В качестве разработчика, ваше участие в процессе создания , как правило, включает следующие четыре шага:

    Определение ресурсов.

    Реализация классов приложения.

    Упаковка приложения.

    Установка и запуск приложения, в частности, для тестирования и отладки.

Шаг 1, определение ресурсов вашего приложения.

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

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

И управление ресурсами отдельно от приложения имеет несколько преимуществ.

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

Одним типом общих ресурсов являются строки.

В Android есть три типа строковых ресурсов.

    Отдельные строки.

    Массивы строк.

    Разнообразия (Plurals).

Plurals это строковые массивы, которые могут быть использованы, чтобы выбрать специфические строки, которые связаны с определенными величинами, например, одна книга или две книги.

И строки обычно хранятся в XML файле в res/values каталоге приложения.

И формат это XML строковый тег, содержащий атрибут name, а затем содержащий фактически саму строку.

И фактическая строка может включать в себя информацию о форматировании и оформлении, например, HTML теги.

Наконец, другие ресурсные файлы могут обращаться к строкам, которые вы определили, как @string/string_name.

В Java коде вы также можете получить доступ к этим строкам как R.string.string_name.

Итак, вернемся в Eclipse.

Я определил некоторые строки для приложения MapLocation.

Давайте откроем файл strings.xml в каталоге res/values.

Этот файл показывает две строки show_map_string со значением show map и location_string со значением enter location.

У меня также определен второй строковый XML файл.

На этот раз для итальянского языка в каталоге res/values-it.

Теперь, если мы посмотрим на этот файл, мы увидим те же две строки show_map_string и location_string, но на этот раз их значения – итальянские слова, а не английские.

В этом примере я просто показал, что если ваш язык по умолчанию является итальянским, тогда строка расположения будет иметь значение Digita l' Indirizzo.

В противном случае, она будет иметь значение enter location.

Лекция 3. Основы Android приложений. Часть 2

Другой вид ресурсов – это файл компоновки или макета.

Файл компоновки определяет, как будет выглядеть GUI-интерфейс части вашего приложения.

И опять же, эти файлы записываются в формате XML, хотя некоторые инструменты позволяют вам создать макет визуально. А затем эти инструменты будут генерировать XML файлы.

Eclipse обеспечивает хранение файлов компоновок в каталоге res/layout вашего приложения.

И вы можете получить доступ к макету в Java коде как r.layout.layout_name.

И вы можете получить доступ к макету в другом файле ресурсов как @layout/layout_name.

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

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

Давайте рассмотрим это на примере.

Итак, давайте взглянем на главный .xml файл, который находится в каталоге res/layout.

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/RelativeLayout1"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >



<EditText

android:id="@+id/location"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:hint="@string/location_string"

android:inputType="textPostalAddress" />



<Button

android:id="@+id/mapButton"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@+id/location"

android:layout_centerHorizontal="true"

android:text="@string/show_map_string" />



</RelativeLayout>



Этот файл определяет, что компоновка состоит из относительной компоновки (relative layout).

А внутри относительной компоновки есть еще один элемент редактирования текста – поле, которое вы используете для ввода почтового адреса.

Там также есть кнопка с меткой Show Map.

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

И вы можете это увидеть, открыв вкладку Graphical Layout, где вы также можете нажать на отдельные элементы.

И Eclipse покажет вам более подробную информацию об их свойствах компоновки.

MapLocation также имеет еще один файл, который также называется main.xml, но находится в каталоге res/layout-land.

Если MapLocation работает с устройством в ландшафтном режиме, тогда этот файл используется, а не тот, который мы видели раньше.

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

Но я изменил позиционирование незначительно, так что все элементы появляются на одной строке.

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/RelativeLayout1"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >



<EditText

android:id="@+id/location"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:hint="@string/location_string"

android:inputType="textPostalAddress" />



<Button

android:id="@+id/mapButton"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@+id/location"

android:layout_centerHorizontal="true"

android:text="@string/show_map_string" />



</RelativeLayout>



Который я думаю, выглядит лучше в ландшафтном режиме.

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

Теперь давайте запустим приложение.

Телефон слева работает в портретном режиме, поэтому он использует по умолчанию main.xml файл.

Телефон справа работает в ландшафтном режиме, поэтому он будет использовать main.xml файл, который находится в res/layout-land.

И как вы можете видеть, элементы на самом деле располагаются по-разному в зависимости от ориентации устройства.

Теперь я уже говорил несколько раз, что ресурсы могут быть доступны в Java коде.

Это достигается тем, что Android генерирует класс под названием R в вашем приложении, и вы можете затем использовать поля этого R класса, чтобы получить доступ к строкам, макетам и другим ресурсам, которые вы определили в XML- файлах.

Давайте взглянем на сам файл R.java.

Как я уже говорил, этот файл генерируется Android, так что вы не должны изменять его.

Вы можете видеть, что файл определяет R класс, и этот R класс содержит еще один класс под названием layout, который имеет поле с названием main.

И это на самом деле дает вам ссылку на файл main.xml.

Там также есть id класс, обеспечивающий доступ к относительному макету, текстовому полю и к кнопке, определенным в файле main.xml.

В самом деле, если вы вернетесь и проверите файл main.xml, вы увидите, что там есть строки android:id.

И, наконец, есть класс с именем string, который обеспечивает доступ ко всем строкам, о которых мы говорили.

Следующим шагом в разработке приложений является реализация своих Java классов.

И это, как правило, включает в себя написание, по крайней мере, одного вида активности.

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

Давайте рассмотри OnCreate метод немного подробнее.

В OnCreate, вы обычно делаете следующие четыре вещи.

    Вы восстанавливаете сохраненное состояние приложения.

    Вы устанавливаете представление содержимого (content view), которое говорит Android что отображать в виде GUI активности.

    Вы инициализируете конкретные элементы GUI активности.

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

Давайте посмотрим, как эти шаги реализуются в MapLocation.

Итак, давайте посмотрим на MapLocation исходный код, который содержится в файле MapLocation.java, в каталоге src приложения.

Этот файл реализует класс с именем MapLocation.

Который является подклассом активности.

Как активность он имеет OnCreate метод, где инициализируется приложение.

Первым шагом OnCreate является вызов super.onСreate, передавая сохраненное состояние в качестве параметра.

Это сохраненное состояние является структурой данных, которая содержит любую информацию, которую Android мог бы сохранить с прошлого раза, когда активность работала.

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

Но сейчас просто знайте, что OnCreate должен вызвать super.onCreate, или вы получите ошибку.

Далее, есть вызов setContentView.

В этом случае передается ссылка на файл макета R.layout.main.

После этого есть некоторый код, который получает ссылки на отдельные элементы пользовательского интерфейса в макете, такие как текстовое поле ввода, которая хранится в переменной с именем adderText, и кнопка, которая хранится в переменной button.

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

И, наконец, есть некоторый код, который определяет, что делать, когда пользователь нажимает кнопку Show Map.

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

И код данного метода сначала получает, который пользователь ввел в адресном поле, а затем он обрабатывает этот текст, удаляя пробелы и конвертируя его в формат, который Google Maps понимает.

Тут-то и запускается приложение Google Maps, получая модифицированный текст адреса.

И опять же, я объясню, что этот код делает более подробно в дальнейших уроках, когда мы углубимся в работу класса активности и класс намерения (Intent).

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

Но, конечно, в рабочем коде, вы захотите это сделать.

Следующим шагом в создании Android приложений является предоставление информации, которая позволяет Android утилитам сборки создать пакет приложения или APK и эта информация записывается в XML файл с именем AndroidManifest.xml.

Файл AndroidManifest.xml содержит широкое разнообразие информации для сборки.

В том числе и имя приложения и список компонентов, которые составляют приложение.

Он также включает в себя другую информацию, которую мы обсудим позже.

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

Давайте посмотрим на файл AndroidManifest.xml для MapLocation.

Файл AndroidManifest.xml находится в корневом каталоге приложения.

В файле AndroidManifest.xml вы увидите, что есть тэг manifest, который говорит Android, что этот файл содержит всю информацию для сборки, которая необходима.

Там также очень много другой информации, но мы просто обсудим несколько элементов.

Одним из элементов, как мы видим здесь, является элемент uses-sdk.

Этот элемент содержит атрибут minSdkVersion, который определяет минимальный уровень API для этого приложения.

И в этом случае это уровень десять, что соответствует Android релизу 2.3.

Этот элемент также включает другой атрибут targetSdkVersion, который определяет максимальный уровень API, для которого это приложение было протестировано.

В данном случае это уровень 17 и это соответствует Android релизу 4.2.

Там также есть элемент application, который определяет такие вещи, как значок приложения и лейбл, который отображается в заголовке приложения.

Внутри элемента application есть элемент activity, который определяет один вид активности, в этом случае MapLocation.

И последний шаг – это установка приложения на устройстве или эмуляторе для того, чтобы проверить и отладить приложение.

В одном из предыдущих уроков мы видели, как это сделать в Eclipse, и вы можете также сделать это из командной строки, например, с помощью инструмента adb.