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

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 01.08.2017
Размер файла 690,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ

«ВЫСШАЯ ШКОЛА ЭКОНОМИКИ»

Московский институт электроники и математики им. А.Н. Тихонова

?????????????? ? ?????????? ?????????? ?????????? ?? ????????? Android ??? ?????? ????????? ??????? ?????? ?????

Кульпин Андрей Андреевич

Выпускная квалификационная работа

студента образовательной программы бакалавриата

«Фундаментальная информатика и информационные технологии»

по направлению 02.03.02 «Фундаментальная информатика

и информационные технологии»

Рецензент к.т.н., доцент Э.С. Клышинский

Руководитель ВКР Ассистент Ю.В. Зонтов

Москва, 2017

Аннотация

В настоящей работе решается задача построения программного продукта, направленного на поиск пунктов обмена валют в городах России, для операционной системы Android. Рассмотрены особенности целевой платформы и средства, предоставляемые для реализации базовых функций приложения. В дополнение к стандартному набору программных интерфейсов Android перечислены сторонние библиотеки, реализующие конкретные функции, в том числе Google Play Services и Google Maps API. Приводятся требования к функциональности приложения, прорабатываются варианты использования, на основе которых строится программная реализация приложения. В частности, исследуются вопросы получения данных от сервера и их локальное хранение. В заключительной части работы описывается опыт взаимодействия пользователя с финальным вариантом приложения.

Abstract

The work delves into development of an Android application for nearby exchange points searching in a few cities of Russian Federation. Starting with the review of such questions as the platform features and primary development tools that are necessary for common functions of an application the pages also consider additional APIs and third-party libraries that provide special functionality like location determining and working with maps. Requirements of the product as well as use cases are covered leading to the program implementation. Particularly the work studies the problems of retrieving data from a server and local storage of the information. The rest of the work is dedicated to the description of the final product, its structure and main facilities.

Содержание

  • Введение
  • 1. Обзор технологий
  • 1.1 Операции
  • 1.2 Фрагменты
  • 1.3 Сетевые запросы
  • 1.4 Локальное хранение данных
  • 1.4.1 SQLite
  • 1.4.2 SharedPreferences
  • 1.5 Система разрешений
  • 1.6 IntentService
  • 1.7 Intent
  • 1.8 Работа с картами
  • 1.9 Определение местоположения
  • Выводы
  • 2. Проектирование
  • 2.1 Функциональные требования
  • 2.1.1 Постановка требований
  • 2.1.2 Анализ требований
  • 2.2 Варианты использования
  • 2.2.1 Вход в приложение
  • 2.2.2 Определение местоположения
  • 2.2.3 Выбор пункта на карте
  • 2.2.4 Выбор пункта в списке
  • 2.2.5 Выбор валюты (действия)
  • 2.2.6 Фильтрация данных
  • 2.2.7 Обновление данных
  • 2.3 Проектирование классов
  • 2.3.1 Вход в приложение
  • 2.3.2 Определение местоположения
  • 2.3.3 Связь с сервером
  • 2.3.4 База данных
  • 2.3.5 Сохранение сессии
  • 2.3.6 Основная операция
  • 2.3.7 Экран карты
  • 2.3.8 Экран списка
  • 2.4 Конечный вариант приложения
  • Заключение
  • Список литературы
  • Приложение 1 Листинги основных классов
  • Приложение 2 Адрес репозитория

Введение

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

Самой распространенной мобильной операционной системой остается Android, занимая на рынке смартфонов более 85% от общего числа [1]. Таким образом, создавая приложение для этой операционной системы, разработчик покрывает достаточно большую аудиторию.

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

Анализ аналогов в магазине Google Play Store выявил два продукта схожей функциональности: "Обмен валюты в Москве" и "Курсы валют на карте". Первое приложение имеет схожую функциональность, но предоставляет информацию только для города Москвы. Второй вариант владеет данными для других городов, но значительно проигрывает в удобстве использования.

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

1. Обзор технологий

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

1.1 Операции

Чаще всего Android-приложение основывается на базовом компоненте - операции (класс «Activity»), которая представляет один экран пользовательского интерфейса [2]. Данный класс тесно связан со средой выполнения приложений Android: операция является входной точкой в приложение, то есть система при его вызове обращается именно к операции. У этого класса имеется ряд публичных методов, которые вызываются фреймворком Android при достижении какого-либо этапа жизненного цикла операции. Наиболее часто используемыми из них являются следующие:

а) Метод «onCreate» вызывается в тот момент, когда операция только была создана;

б) «onStart» - когда операция была запущена;

в) «onResume» - когда операция становится видна пользователю;

г) «onPause» - операция уходит с переднего плана;

д) «onStop» - операция остановлена;

е) «onDestroy» - операция уничтожена.

От жизненного цикла операции зависит работа всех сопутствующих компонентов.

Пользовательский интерфейс

Интерфейс пользователя представляет из себя иерархическую структуру, на нижнем уровне которой располагаются элементы интерфейса - объекты классов, наследующихся от класса «View» (представление). Их компоновка осуществляется за счет классов-контейнеров, наследников класса «ViewGroup».

Графический интерфейс операции можно задать двумя способами: в виде файла разметки с расширением .XML - макет, либо через программный интерфейс класса «Activity». Первый способ является более предпочтительным, так как создание сложного интерфейса приведет к усложнению кода программы. В то же время динамически изменяющийся интерфейс можно создать только программными средствами.

1.2 Фрагменты

Важным классом фреймворка Android является «Fragment» (фрагмент) [3]. Для фрагмента определяется макет, как для операции, но сам фрагмент является её частью. Его жизненный цикл напрямую зависит от жизненного цикла операции.

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

Фрагмент может быть добавлен к операции двумя способами: при описании макета операции, либо же во время исполнения через объект класса «FragmentTransaction». Для этого определен метод «add(int containerViewId, Fragment fragment)», где containerViewId - это идентификатор контейнера, в который будет включен фрагмент, а fragment - добавляемый фрагмент.

Для управления фрагментами, входящими в операцию используется класс «FragmentManager». Его метод «findFragmentById (int id)» возвращает объект фрагмента по известному идентификатору id.

1.3 Сетевые запросы

Важной частью разрабатываемого приложения является отправка сетевых запросов с целью получения данных, которые будут показаны пользователю. Фреймворк Android предоставляет разработчикам класс «HttpURLConnection» для создания запросов по протоколу HTTP, но на практике его использование требует решения дополнительных задач, таких как декодирование входящих данных и обеспечение асинхронности запроса [4]. Поэтому при проектировании коммерческих программных продуктов для системы Android используются сторонние библиотеки.

Одной из таких библиотек является Retrofit, предоставляющая простой интерфейс для выполнения сетевых запросов, как синхронных, так и асинхронных [5].

1.4 Локальное хранение данных

1.4.1 SQLite

Если информация, принимаемая с сервера, представляет собой большое количество однотипных объектов, то удобнее всего хранить такие данные в базе данных. Фреймворк Android предполагает работу с базами данных SQLite, а для работы с ними предлагает класс SQLiteOpenHelper. Операции с базой осуществляются через объект класса «SQLiteDatabase», доступ к которому можно получить через методы getReadableDatabase() и getWritableDatabase(). В первом случае возможна запись в базу данных, а во втором только чтение.

1.4.2 SharedPreferences

Для хранения в постоянной памяти небольшого количества значений, например, настроек приложения существует интерфейс «SharedPreferences», входящий в стандартный пакет классов Android. Данные в файле SharedPreferences записаны в виде «ключ - значение». Доступ к SharedPreferences можно получить через метод «getSharedPreferences (String name, int mode)», где аргумент «name» используется для однозначной идентификации файла хранилища, а в «mode» указывается режим доступа к файлу. Чтобы доступ к файлу был только у текущего приложения, необходимо использовать режим «MODE_PRIVATE», в то время как константы «MODE_WORLD_WRITEABLE» и «MODE_WORLD_READABLE» позволяют производить запись и чтение SharedPreferences другим приложениям.

Для записи в файл должен использоваться объект класса «SharedPreferences.Editor», а сама модификация производится в виде транзакций, которые могут содержать несколько операций записи. Объект SharedPreferences.Editor имеет ряд методов для добавления записей в файл, например:

а) «putInt(String key, int value)» - запись целочисленного значения value под именем key.

б) «putString(String key, String value)» - запись строки символов.

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

Чтение же имеющихся значений выполняется через объект SharedPreferences посредством его методов, например:

«getInt(String key, int defValue)» - чтение целочисленного значения с ключом key. Если такой ключ в файле не найден, возвращается значение по умолчанию - defValue.

1.5 Система разрешений

В системе Android каждое приложение выполняется в своем выделенном процессе, отделенном от других приложений и системы [6]. Поэтому для доступа к данным вне данного процесса приложение должно явно запрашивать соответствующие права. В Android существует ряд стандартных разрешений, например, для доступа к памяти устройства или к местоположению.

Разрешения Android подразделяются на «нормальные» и «опасные»:

а) К «нормальным» относятся разрешения, которые предоставляющие права, которые не позволяют нанести существенный вред устройству. Если приложение запрашивает такое разрешение, система автоматически предоставляет его.

б) «Опасные» разрешения позволяют приложению получить доступ к личным данным пользователя или данным других приложений и внести в них изменения. Для получения таких прав приложением пользователь должен явно их предоставить.

Разрешения данной категории подразделяются на несколько групп, например:

1) «CALENDAR» - доступ к календарю;

2) «CONTACTS» - доступ к контактам;

3) «LOCATION» - доступ к местоположению устройства;

4) «STORAGE» - доступ к памяти устройства.

Если запрашивается какое-то разрешение, например, «READ_EXTERNAL_STORAGE» (чтение памяти), а разрешение из той же группы «WRITE_EXTERNAL_STORAGE» уже было предоставлено пользователем, то система автоматически разрешит требуемое.

Запрос разрешений у пользователя различается в зависимости от версии операционной системы. В первых версиях необходимые разрешения перечислялись при установке приложения. Если пользователь отказывался предоставить какое-либо право, то приложение не устанавливалось. Начиная с версии Android 6.0 (API 23) разрешения запрашиваются уже во время выполнения приложения. Если пользователь отказывает в предоставлении каких-то данных, он продолжает пользоваться приложением, но с ограниченной функциональностью.

1.6 IntentService

По умолчанию все задачи и вычисления приложения Android выполняются в основном потоке пользовательского интерфейса. Часто же необходимо произвести сложные вычисления или получить данные с сервера. Такие операции могут занять продолжительное время, а их выполнение в основном потоке приведет к зависаниям интерфейса. Опыт использования приложения в этом случае ухудшится, и пользователь может отказаться от использования данного продукта. Поэтому выполнять длительные задачи необходимо в фоновом потоке. К тому же, начиная с версии Android 3.0 (API 11) система запрещает производить сетевые запросы в основном потоке приложения выбрасывая исключение «NetworkOnMainThreadException».

В состав Android SDK входит класс «Service» (служба) [7]. Данный класс служит для выполнения долгоиграющих задач в фоновом режиме. Достоинство службы состоит в том, что даже если система уничтожила компонент, запустивший службу, например, при недостатке оперативной памяти, класс «Service» продолжит выполнение задачи. Однако, по умолчанию, служба работает в потоке пользовательского интерфейса, поэтому необходимо реализовывать фоновый поток.

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

1.7 Intent

Важным понятием в Android является «намерение» (класс «Intent»). Объекты Intent используются для передачи сообщений между компонентами приложения, также для запуска операций и служб. Запуск операции производится методом «startActivity()» с передачей в аргументе объекта Intent, указав в нём название класса или действие, которое надо произвести. Служба запускается методом «startService()».

1.8 Работа с картами

Компания Google обеспечивает разработчиков программ под операционную систему Android и другие платформы большим количеством библиотек разносторонней направленности. Одной из таких библиотек является Google Maps Android API, позволяющая добавить в приложение работу с картами [8]. Сервис предоставляет карты всего земного шара, причем возможен просмотр как схемы, так и спутниковых снимков Земли.

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

Встраивание карт Google Maps в приложение Android происходит посредством фрагмента класса «MapFragment», содержащий объект класса «GoogleMap», через который происходит непосредственная работа с картой. Обзор карты задается так называемой «камерой», направленной на плоскость карты. Пользователь может изменять обзор перетаскивая и поворачивая карту, а также изменяя масштаб и угол наклона камеры. Эти четыре параметра можно задавать и отслеживать их изменения. Класс имеет ряд публичных методов для настройки отображения карты и получения информации о текущем состоянии:

а) moveCamera(CameraUpdate update) - установка камеры в определенное положение. В объекте CameraUpdate можно задать координаты центра, степень приближения, направление и наклон. Направление камеры задается углом, отсчитываемым по часовой стрелке от линии, направленной на север. Наклон определяет угол, под которым просматривается карта.

б) getProjection() - получение объекта Projection, который содержит информацию о координатах области на поверхности Земли, видимые при текущем положении камеры.

Класс GoogleMap содержит большое число функций обратного вызова, реализовав которые можно отслеживать события карты, например, панорамирование, изменение масштаба или простое нажатие на карту. Также через метод «addMarker(MarkerOptions markerOptions)» на карту можно добавить объекты-маркеры, отметив таким образом какое-либо место. В объекте MarkerOptions передаются параметры добавляемого маркера, в том числе координаты и изображение на самом маркере.

1.9 Определение местоположения

Важным преимуществом мобильного устройства под управлением Android является возможность получения информации о текущем положении [9]. Фреймворк операционной системы имеет встроенный компонент для определения местоположения, но рекомендованным компанией Google средством достижения данной цели является клиент Google Services API. Данный сервис предоставляет более точные данные о местоположении, простой интерфейс и лучшую энергоэффективность по сравнению со встроенным сервисом.

Выводы

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

2. Проектирование

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

2.1 Функциональные требования

2.1.1 Постановка требований

Для данного проекта были поставлены следующие требования:

а) Приложение должно предоставлять информацию о пунктах обмена валют.

б) Пользователь должен иметь возможность просмотреть данные на карте или в виде списка.

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

г) Пользователь должен иметь возможность самостоятельно выбрать город поиска информации.

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

е) Пользователь должен иметь возможность отфильтровать данные по цене.

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

з) Приложение должно показывать подробную информацию об обменном пункте при его выборе.

и) Данные должны быть получены с сервера.

к) Приложение должно предоставлять информацию даже при отсутствии доступа в Интернет и связи с сервером.

2.1.2 Анализ требований

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

Еще одним понятием, которое стоит отметить, это курс обмена, которое имеет два атрибута: стоимость покупки и стоимость продажи. У одного пункта чаще всего имеется несколько курсов обмена.

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

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

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

2.2 Варианты использования

2.2.1 Вход в приложение

Основной сценарий

Пользователь выбирает иконку приложения в Интерфейсе системы. Система запускает приложение и показывает Экран инициализации. Приложение запускает Определение местоположения, проверяет, имеются ли данные в базе данных, получает данные из Базы данных, обрабатывает полученные данные с учетом местоположения и показывает Выбор пункта на карте.

Альтернативный сценарий

а) База данных пуста. Приложение получает данные с Сервера.

б) Данные от Сервера не получены. Приложение показывает сообщение «Сервер недоступен».

Для данного варианта использования изобразим робастную диаграмму (рис. 1). На такой диаграмме показываются классы и выполняемые действия, таким образом изображаются взаимодействия между объектами, где каждое действие на диаграмме соответствует шагу варианта использования. При этом применяются следующие обозначения:

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

- сущностные объекты, термины модели предметной области.

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

Рис.1 Робастная диаграмма варианта использования «Вход в приложение»

2.2.2 Определение местоположения

Основной сценарий

Приложение проверяет наличие разрешения на определение местоположения, получает информацию о местоположении, используя Службу определения местоположения.

Альтернативный сценарий

а) Разрешение не предоставлено. Приложение запускает Окно запроса разрешения. Пользователь разрешает определение местоположения.

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

2.2.3 Выбор пункта на карте

Основной сценарий

Приложение показывает Экран карты, устанавливает центр карты в месте Местоположения пользователя. Пользователь выбирает Пункт на карте. Приложение показывает Окно детальной информации.

Альтернативный сценарий

Местоположение устройства неизвестно. Приложение устанавливает центр карты в условном центре города.

2.2.4 Выбор пункта в списке

Приложение показывает Экран списка пунктов. Пользователь выбирает Пункт. Приложение показывает Экран подробной информации о пункте.

2.2.5 Выбор валюты (действия)

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

2.2.6 Фильтрация данных

Основной сценарий

Пользователь выбирает пункт меню «Фильтр». Приложение показывает Окно установки фильтров. Пользователь вводит диапазон стоимости и нажимает кнопку «Применить». Приложение проверяет корректность введенных данных, закрывает Окно установки фильтров и обновляет отображаемые данные с учетом введенных фильтров.

Альтернативный сценарий

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

2.2.7 Обновление данных

Основной сценарий

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

Альтернативный сценарий

а) Нет соединения с Интернет. Приложение показывает сообщение об ошибке.

б) Сервер недоступен. Приложение показывает сообщение об ошибке.

2.3 Проектирование классов

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

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

2.3.1 Вход в приложение

В варианте «Вход в приложение» участвует экран инициализации. Для реализации данного экрана создадим класс операции и назовем его «LaunchActivity». Поскольку он является стартовым в приложении, то в файле манифеста необходимо указать что эта операция является входной точкой в приложение.

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

2.3.2 Определение местоположения

Для этой задачи будем использовать Google Services API. Для обращения к данному сервису используется объект класса «GoogleApiClient», при инициализации которого указывается, какой интерфейс будет использоваться, в данном случае - интерфейс получения местоположения. Помимо этого, нужно реализовать методы обратного вызова данного сервиса:

а) «onConnected» - сервис подключен;

б) «onConnectionSuspended» - подключение приостановлено;

в) «onConnectionFailed» - подключение не удалось.

В методе «onConnected», когда сервис Google Services подключен, уже могут быть получены искомые данные, но начиная с версии Android 23 система требует проверки разрешения на определенные действия, в том числе определение местоположения. Для этого используется статический метод «checkSelfPermission» класса «ContextCompat». Данный метод возвращает значение true, если права были предоставлены. В ином случае необходимо явно спрашивать разрешение пользователя вызвав метод «requestPermissions» класса «ActivityCompat». В этой ситуации пользователь видит предопределенное системой окно с вопросом о разрешении и возможностью разрешить действия или запретить. Если пользователь нажимает кнопку «Разрешить», тогда приложение может запросить данные о местоположении, вызвав метод «getLastLocation» класса «FusedLocationProviderApi», объект имеется в числе статических полей класса «LocationServices». Метод «getLastLocation» возвращает объект «Location», в котором содержится информация о последнем известном местонахождении данного устройства.

Альтернативным сценарием к описанному является случай, когда объект «Location» не может быть получен. Согласно ему, пользователю должен быть предложен список городов. Для реализации такого экрана будем использовать фрагмент «ListFragment», который будет содержать список класса «RecyclerView». Нажатие на элемент списка вернёт операции инициализации выбранный город.

2.3.3 Связь с сервером

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

· Bank - название банка;

· Point - название филиала;

· Address - адрес места;

· Timetable - расписание работы;

· Rates - список валют. Каждый элемент списка представлен объектом со следующими полями:

§ Sell - стоимость продажи валюты;

§ Buy - стоимость покупки;

§ Date - дата обновления стоимостей;

· Location - географические координаты места. Объект содержит два поля:

§ Latitude - широта;

§ Longitude - долгота.

Для реализации такой же структуры в приложении создан простой Java-объект - класс «Place», содержащий все перечисленные поля.

За работу с сервером в приложении будут отвечать два инструмента: библиотека Retrofit и наследник IntentService - класс «WebService». С помощью Retrofit осуществляется собственно сетевой запрос, а IntentService выступает в качестве компонента, в котором этот запрос происходит, и обеспечивает асинхронность.

Таким образом, в создаваемой архитектуре операция «LaunchActivity» является граничным объектом, а службу можно считать сущностным объектом Server на робастной диаграмме. Для облегчения класса «LaunchActivity» можно создать класс-прослойку «DataController», который будет запускать IntentService, а также принимать и обрабатывать сигналы от него. В дальнейшем этот же контроллер будет использоваться в основной операции приложения для обновления данных.

Запуск службы осуществляется посредством класса «Intent», а обратную связь будет обеспечивать класс «ServiceResultReceiver». Метод «onReceiveResult» данного класса выполняется при вызове метода «send», который имеет следующую сигнатуру: «void send(int resultCode, Bundle resultData)», где resultCode - это код результата, а resultData - данные. Первый метод будет реализован в контроллере, а при запуске службы в отправляемом намерении будет указано, что сам контроллер является адресатом результатов работы IntentService. Служба же, при получении данных от сервера будет вызывать метод send, указывая в аргументе «resultData» успешность получения информации, а во втором - полученные данные при их наличии. Контроллер, в зависимости от кода результата, будет либо передавать данные операции через метод «onPlacesReceived(Arrayist<Place> places)», либо вызывать её метод «onSyncronizationError()» показывающий сообщение об ошибке.

2.3.4 База данных

Информация о пунктах обмена, принимаемая с сервера, помещается в базу данных SQLite. Для приложения созданы две таблицы: основная таблицу, где каждая строка соответствует одному пункту на карте, и таблицу, содержащую информацию о курсах в этих пунктах. Основная таблица содержит три внешних ключа - идентификаторы курсов для трёх возможных валют во второй таблице.

Доступ к ней организован через вспомогательный класс «DBHelper», унаследованный от класса «SQLiteOpenHelper».

Создание таблиц базы данных происходит в методе «onCreate(SQLiteDatabase db)», который вызывается при первом доступе к базе. В классе SQLiteDatabase имеется метод «execSQL(String sql)», где в качестве аргумента передается текст команды к базе данных.

В классе «DBHelper» описаны необходимые методы для работы с базой:

а) «insertPlaces(List<Place> placesList)» - добавление в базу списка пунктов;

б) «getAllPlaces()» - получение всех элементов, находящихся в базе;

в) «clearDatabase()» - очистка базы;

г) «isDatabaseEmpty()» - проверка наличия данных в базе. Если она пуста, возвращается true.

Вызовы этих методов также будут производиться из контроллера «DataController», чтобы отделить работу с данными от операции - граничного объекта, то есть графического интерфейса. Операция вызывает метод контроллера «fetchData()», в нём сначала проверяется пуста ли база данных через метод «isDatabaseEmpty()», и, если нет, то через метод «getAllPlaces()» извлекаются локально хранящиеся данные. В ином случае делается запрос через службу «WebService».

2.3.5 Сохранение сессии

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

а) «currentRate» - выбранная пользователем валюта;

б) «currentIntent» - выбранное действие;

в) «currentSortOrder» - порядок сортировки списка;

г) «currentScreen» - вариант поиска, карта или список;

д) «currentLocalityId» - идентификатор населённого пункта.

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

2.3.6 Основная операция

После подготовки данных в операции инициализации, она вызывает основную операцию (класс «MainActivity»), в которой происходит основное взаимодействие пользователя. Поскольку данная так же, как и LaunchActivity должна работать с контроллером «DataController», методы onPlacesReceived и onSyncronizationError вынесены в интерфейс «IBaseActivity», реализациями которого будут LaunchActivity и MainActivity.

Данная операция включает два фрагмента: фрагмент с картой (класс «MapFragment») и фрагмент со списком (класс «ListFragment»). Оба фрагмента показывают одни и те же данные, но в разном формате.

Для работы с фрагментами определим методы:

а) «showScreen()» - для запуска основного фрагмента, с картой или с со списком;

б) «showPlaceDetails(Place place)» - для запуска фрагмента с детальной информацией о пункте.

2.3.7 Экран карты

Для работы с картой в классе «MapFragment» описано поле класса «GoogleMap», а также метод «showPlaces(ArrayList<Place> places)». Когда в список мест, которые нужно показать на карте, MainActivity из метода onPlacesReceived вызовет метод «showPlaces» в классе «MapFragment», передав список мест через аргумент places. В методе showPlaces посредством метода addMarker объекта GoogleMap на карту будут нанесены маркеры.

Для отслеживания нажатия на маркер класс «MapFragment» реализует интерфейс GoogleMap.OnMarkerClickListener, определив метод «onMarkerClick(Marker marker)», из которого будет вызываться метод «showPlaceDetails(Place place)», определенный в основной операции.

2.3.8 Экран списка

Для реализации списка в данном фрагменте используется класс «RecyclerView». При нажатии на элемент списка так же вызывается метод «showPlaceDetails(Place place)» операции.

2.4 Конечный вариант приложения

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

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

На карту нанесены маркеры, каждый из которых обозначает отдельный пункт обмена (рис. 2). Маркеры окрашены в три цвета: зеленый, желтый и красный - в зависимости от стоимости валюты в данном месте. Самые выгодные варианты для пользователя обозначены зеленым цветом. Помимо цвета на каждый маркер нанесена стоимость покупки или продажи выбранной валюты.

Рис. 2, 3

В списке каждый элемент соответствует одному маркеру на карте (рис. 3). Пункт списка отображает название банка, филиал и стоимость выбранной валюты. Также, если было определено местоположение пользователя, будет показано расстояние от пользователя до данного места.

Нажатие на маркер или элемент списка приводит к переходу на экран подробной информации о пункте обмена (рис. 4).

В верхней части любого экрана приложения всегда располагается панель инструментов. Для экранов списка и карты на ней располагаются выпадающие списки выбора валюты и действия с валютой, а также функция «Фильтр». При её выборе пользователь видит окно с двумя полями ввода границ стоимостей (рис. 5). При вводе некорректных значений, например, если введенная стоимость меньше, чем любая из имеющихся в списке, после нажатия кнопки «Применить» будет показано сообщение с просьбой корректировки. В панели инструментов экрана списка имеется элемент «Сортировка», при нажатии которого появляется возможность выбрать критерий сортировки: по стоимости валюты или по расстоянию до пункта.

Рис. 4, 5

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

Также в меню навигации имеется кнопка «Выбрать город». Она переводит пользователя на экран со списком доступных для поиска пунктов обмена городов (рис. 7).

Рис. 6, 7

Заключение

Данный проект был посвящен проектированию Android-приложения. Работа включала несколько этапов: сбор требований, их анализ, перебор возможных вариантов использования, реализация поставленных сценариев с учетом особенностей целевой программной платформы и собственно программирование приложения.

Были освещены базовые средства фреймворка Android, а также ряд библиотек, которые нашли применение в разрабатываемом приложении. Описан процесс разработки классов основного сценария приложения. Листинги ключевых классов программы добавлены в конце работы (Приложение 1), а весь исходный код приложения размещен в открытом репозитории Github (Приложение 2).

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

Список литературы

[1] С. Карасёв «Доля Android на рынке смартфонов достигла почти 90 процентов». URL: https://3dnews.ru/942083 (дата обращения 10.05.2017).

[2] “API Guides”. Introduction to Activities. URL: https://developer.android.com/guide/components/activities/intro-activities.html (дата обращения 24.11.2016).

[3] “API Guides”. Fragments. URL: https://developer.android.com/guide/components/fragments.html (дата обращения 26.11.2016).

[4] Sending and Managing Network Requests. URL: http://guides.codepath.com/android/sending-and-managing-network-requests (дата обращения 04.02.2017).

[5] V. Chijwani “Comparing Retrofit 2.0 vs. Volley”. URL: http://vickychijwani.me/retrofit-vs-volley/ (дата обращения 12.02.2017).

[6] “API Guides”. Permissions. URL: https://developer.android.com/guide/topics/permissions/index.html (дата обращения 07.01.2017).

[7] “API Guides”. Services. URL: https://developer.android.com/guide/components/services.html (дата обращения 04.03.2017).

[8] “Maps Android API”. URL: https://developers.google.com/maps/documentation/android-api/ (дата обращения 15.04.2017).

[9] “Making Your App Location-Aware”. URL: https://developer.android.com/training/location/index.html (дата обращения 20.04.2017).

Приложение 1 Листинги основных классов

Класс LaunchActivity

public class LaunchActivity extends BaseActivity {

private DataController mController;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_launch);

mController = new DataController(this, new ServiceResultReceiver(new Handler()));

mController.fetchData();

}

@Override

public void onSyncronizationError() {

setProgressAnimationVisibility(false);

Snackbar snackbar = Snackbar

.make(findViewById(R.id.layout_activity_launch), getString(R.string.snack_connection_error), Snackbar.LENGTH_INDEFINITE)

.setAction(getString(R.string.snack_retry), new View.OnClickListener() {

@Override

public void onClick(View view) {

setProgressAnimationVisibility(true);

request.allPlacesRequest();

}

});

snackbar.show();

}

/*…*/

}

Класс DataController

public class DataController implements ServiceResultReceiver.Receiver {

private BaseActivity activity;

public ServiceResultReceiver mReceiver;

private DBHelper dbHelper;

public DataController(BaseActivity activity, ServiceResultReceiver receiver) {

this.activity = activity;

mReceiver = receiver;

mReceiver.setReceiver(this);

dbHelper = new DBHelper(activity);

}

public void fetchData() {

if (dbHelper.isDatabaseEmpty()){

fetchDataFromApi();

}

else {

dbHelper.getAllPlaces();

}

}

public void fetchDataFromApi(){

if (checkInternetConnection()) {

final Intent intent = new Intent("", null, activity, WebService.class);

intent.putExtra(Const.WEB_SERVICE_KEY, Const.WEB_SERVICE_INIT);

intent.putExtra(Const.RECEIVER_KEY, mReceiver);

activity.startService(intent);

} else {

activity.onSyncronizationError();

}

}

public void refreshData(){

final Intent intent = new Intent("", null, activity, WebService.class);

intent.putExtra(Const.WEB_SERVICE_KEY, Const.WEB_SERVICE_REFRESH);

intent.putExtra(Const.RECEIVER_KEY, mReceiver);

activity.startService(intent);

}

@Override

public void onReceiveResult(int resultCode, Bundle data) {

switch (resultCode) {

case Const.STATUS_FINISHED :

List<Place> list = data.getParcelableArrayList(Const.BUNDLE_KEY_RESULT);

activity.onPlacesReceived(list);

break;

case Const.STATUS_CONNECTION_ERROR:

activity.onSyncronizationError();

break;

case Const.STATUS_CONNECTION_ERROR_REFRESH:

break;

}

}

public boolean checkInternetConnection(){

ConnectivityManager cm = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo();

if (activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting())

return true;

return false;

}

public void onAddPlacesToPlacesOnMapList() {

if (dbHelper.isDatabaseEmpty()) dbHelper.insertPlaces(PlacesUtilities.getAllPlacesList());

}

}

Класс ServiceResultReceiver

public class ServiceResultReceiver extends ResultReceiver {

public interface Receiver {

public void onReceiveResult(int resultCode, Bundle data);

}

private Receiver mReceiver;

public ServiceResultReceiver(Handler handler) {

super(handler);

}

public void setReceiver(Receiver receiver) {

mReceiver = receiver;

}

@Override

protected void onReceiveResult(int resultCode, Bundle resultData) {

if (mReceiver != null) {

mReceiver.onReceiveResult(resultCode, resultData);

}

}

}

Класс DBHelper

public class DBHelper extends SQLiteOpenHelper {

private BaseActivity activity;

private SQLiteDatabase db;

private ContentValues contentValues;

private Cursor cursor;

public DBHelper(BaseActivity activity) {

super(activity, Const.DBNAME, null, Const.DBVERSION);

this.activity = activity;

}

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL("create table places ("

+ "id integer primary key,"

+ "bank text,"

+ "point text,"

+ "id_usd integer,"

+ "id_eur integer,"

+ "id_gbp integer,"

+ "timetable text,"

+ "address text,"

+ "latitude double,"

+ "longitude double,"

+ "distance integer" + ");");

db.execSQL("create table rates ("

+ "id integer primary key,"

+ "buy float,"

+ "sell float,"

+ "date text" + ");");

db.execSQL("create table eur ("

+ "id integer primary key,"

+ "buy float,"

+ "sell float,"

+ "date text" + ");");

db.execSQL("create table gbp ("

+ "id integer primary key,"

+ "buy float,"

+ "sell float,"

+ "date text" + ");");

}

public void insertPlaces(final List<Place> placesList){

db = getWritableDatabase();

db.beginTransaction();

try{

final String sqlPlace = "insert into " + Const.PLACESTABLE + "("

+ " bank,"

+ " point,"

+ " id_usd,"

+ " id_eur,"

+ " id_gbp,"

+ " timetable,"

+ " address,"

+ " latitude,"

+ " longitude,"

+ " distance"

+ " ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );";

final String sqlRate = "insert into " + Const.RATE_TABLE + "("

+ " buy,"

+ " sell,"

+ " date"

+ " ) values ( ?, ?, ? );";

SQLiteStatement placeStatement = db.compileStatement(sqlPlace);

SQLiteStatement usdStatement = db.compileStatement(sqlRate);

SQLiteStatement eurStatement = db.compileStatement(sqlRate);

SQLiteStatement gbpStatement = db.compileStatement(sqlRate);

long rowId = 0;

for (Place place : placesList){

long usdId = 0;

long eurId = 0;

long gbpId = 0;

if (place.getRates().get(Const.RATE_USD) != null) {

usdStatement.bindDouble(1, place.getRates().get(Const.RATE_USD).getBuy());

usdStatement.bindDouble(2, place.getRates().get(Const.RATE_USD).getSell());

usdStatement.bindString(3, place.getRates().get(Const.RATE_USD).getDate());

usdId = usdStatement.executeInsert();

usdStatement.clearBindings();

}

if (place.getRates().get(Const.RATE_EUR) != null) {

eurStatement.bindDouble(1, place.getRates().get(Const.RATE_EUR).getBuy());

eurStatement.bindDouble(2, place.getRates().get(Const.RATE_EUR).getSell());

eurStatement.bindString(3, place.getRates().get(Const.RATE_EUR).getDate());

eurId = eurStatement.executeInsert();

eurStatement.clearBindings();

}

if (place.getRates().get(Const.RATE_GBP) != null) {

gbpStatement.bindDouble(1, place.getRates().get(Const.RATE_GBP).getBuy());

gbpStatement.bindDouble(2, place.getRates().get(Const.RATE_GBP).getSell());

gbpStatement.bindString(3, place.getRates().get(Const.RATE_GBP).getDate());

gbpId = gbpStatement.executeInsert();

gbpStatement.clearBindings();

}

placeStatement.bindString(1, place.getBank());

placeStatement.bindString(2, place.getPoint());

placeStatement.bindLong(3, usdId);

placeStatement.bindLong(4, eurId);

placeStatement.bindLong(5, gbpId);

placeStatement.bindString(6, place.getTimetable());

placeStatement.bindString(7, place.getAddress());

placeStatement.bindDouble(8, place.getLatlng().latitude);

placeStatement.bindDouble(9, place.getLatlng().longitude);

placeStatement.bindLong(10, place.getDistance());

rowId = placeStatement.executeInsert();

placeStatement.clearBindings();

//Log.d(TAG, "DBHelper: place inserted, id = " + rowId);

}

//Log.d(TAG, "DBHelper: number of places inserted: " + rowId);

db.setTransactionSuccessful();

} finally {

db.endTransaction();

PlacesUtilities.clearAllPlacesList();

}

}

this.close();

}

public void getAllPlaces(){

db = getWritableDatabase();

db.beginTransaction();

try{

Cursor placeCursor = db.query("places", null, null, null, null, null, null);

if (placeCursor.moveToFirst()) {

int idColIndex = placeCursor.getColumnIndex("id");

int bankColIndex = placeCursor.getColumnIndex("bank");

int pointColIndex = placeCursor.getColumnIndex("point");

int timetableColIndex = placeCursor.getColumnIndex("timetable");

int addressColIndex = placeCursor.getColumnIndex("address");

int latitudeColIndex = placeCursor.getColumnIndex("latitude");

int longitudeColIndex = placeCursor.getColumnIndex("longitude");

...

Подобные документы

  • Структура и архитектура платформы Android. Основные достоинства и недостатки операционной системы Android. Среда разработки Eclipse, платформа Java. Подготовка среды разработки. Вкладка "Погода", "Курс валют", "Новости". Просмотр полной новости.

    дипломная работа [1,0 M], добавлен 11.07.2014

  • Создание, изучение и разработка приложение на Android. Среда разработки приложения DelphiXE5. Установка и настройка среды программирования. Этапы разработки приложения. Инструменты для упрощения конструирования графического интерфейса пользователя.

    курсовая работа [1,6 M], добавлен 19.04.2017

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

    курсовая работа [3,6 M], добавлен 16.07.2016

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

    дипломная работа [2,6 M], добавлен 13.09.2017

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

    дипломная работа [1,5 M], добавлен 22.03.2018

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

    курсовая работа [987,1 K], добавлен 27.06.2019

  • Разработка приложений для смартфонов на ОС Android для сети аптек "Фармация". Архитектура операционной системы Android. Архитектура и реализация приложения. Его функциональность. Описание работы мобильного приложения. Расчет затрат на создание продукта.

    дипломная работа [1,6 M], добавлен 17.06.2017

  • Основные инструменты построения Web-приложения. Язык сценариев PHP. Системный анализ предметной области базы данных. Коды SQL запросов на создание таблиц. Разработка Web-приложения. Описание функциональности модулей. Система управления содержимым статей.

    курсовая работа [4,8 M], добавлен 28.04.2014

  • Обзор мобильной ОС Android. Выбор инструментов и технологий. Проектирование прототипа графического интерфейса. Характеристика и описание пользовательского интерфейса. Проектирование и разработка базы данных. Определение списка необходимых разрешений.

    курсовая работа [376,6 K], добавлен 13.09.2017

  • Архитектура и история создания операционной системы Android. Язык программирования Java. Выбор средства для реализации Android приложения. Программная реализация Android приложения. Проведение тестирования разработанного программного обеспечения.

    курсовая работа [167,8 K], добавлен 18.01.2017

  • Средства разработки развивающих и обучающих игр и используемой программы. Среда выполнения и Dalvik. Разработка приложения для платформы Android. Графический интерфейс и обработка касаний экрана. Разработка экранов приложения и их взаимодействия.

    дипломная работа [2,1 M], добавлен 18.01.2016

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

    дипломная работа [1,2 M], добавлен 04.02.2016

  • Анализ целевой аудитории. Функциональные характеристики пользовательского приложения. Разработка алгоритмов и интерфейса программного продукта, функций рабочей области. Написание скриптов на языке C#. Тестирование программы методом чёрного ящика.

    дипломная работа [1,5 M], добавлен 09.11.2016

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

    дипломная работа [3,4 M], добавлен 12.08.2017

  • Создание приложения для получения информации о расписании движения междугороднего транспорта Владимирской области. Параметры совместимости приложения с различными версиями Android. Схема взаимодействия между классами. Описание внешнего вида интерфейса.

    контрольная работа [2,5 M], добавлен 17.02.2016

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

    презентация [853,9 K], добавлен 08.04.2019

  • Структура Android-приложений. Особенности игрового движка. Алгоритмизация и программирование. Список игровых состояний. Настройка, отладка и тестирование программы. Разработка руководства пользователя. Тестирование инсталляции и отображения элементов.

    дипломная работа [4,5 M], добавлен 19.01.2017

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

    курсовая работа [911,5 K], добавлен 16.04.2014

  • Анализ российского рынка мобильных приложений. Мобильное приложение как новый канал коммуникации с целевой аудиторией. Этапы создания мобильного приложения. План продвижения мобильного приложения в сети Интернет. Бесплатные инструменты продвижения.

    дипломная работа [1,6 M], добавлен 23.06.2016

  • Изучение языков программирования PHP, SQL, C++, HTML. Рассмотрение правил запуска и использования локального сервера Denwer. Составление технического задания по разработке программного продукта. Описание создаваемого мобильного и веб-приложения.

    курсовая работа [212,4 K], добавлен 07.04.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.