Содержание
Введение
1. Обзор литературы
2. Системное проектирование
3. Функциональное проектирование
3.1 Описание взаимодействия с сервером
3.2 Описание классов системных компонентов
3.3 Описание классов взаимодействия с данными
3.4 Описание классов пакета dialogs
3.5 Обзор функциональных классов из пакета helpers
3.6 Описание классов пакета networking
4. Разработка программных модулей
5. Программа и методика испытаний
6. Руководство пользователя
7. Технико-экономическое обоснование проекта
7.1 Описание проекта
7.2 Расчет сметы затрат и цены ПО
8. Обеспечение пожарной безопасности на ЗАО «Итранзишэн»
Заключение
Список литературы
Приложения
Введение
Данный дипломный проект является частью системы, которая используется маркетинговым отделом компании для мониторинга и анализа работы сотрудников (мерчендайзеров), а также для слежения за динамикой продаж в соответствии с проделанной работой.
Система является вспомогательным инструментом для анализа и предполагает исключительно внутреннее использование. В первую очередь система ориентирована на визуальный сбор и анализ информации, то есть работу с фотографиями.
Разработка системы преследует две цели: с одной стороны, облегчить рядовым сотрудникам удобство и простоту ведения отчётности о проделанной работе, а с другой - предоставить руководителям возможность контроля за работой подчинённых.
По своей структуре система представляет собой клиент-серверную архитектуру, где в качестве клиентов выступает мобильное приложение, используемое мерчендайзерами в точках продаж, а также веб-интерфейс, предоставляющий основные возможности для просмотра данных. Специально для управляющего звена существует возможность использования веб-интерфейса администрирования для управления пользователями и редактирования данных.
Согласно логике работы системы, мерчендайзеры должны периодически отправлять на сервер снимки закреплённых за ними точек продаж в качестве краткого визуального отчёта о своей деятельности. В то же время, аналитики компании, имея доступ к общей базе снимков, сделанных мерчендайзерами, могут через веб-интерфейс осуществлять выборку снимков по определённой торговой точке за определённый промежуток времени для сопоставления динамики продаж с расположением товара на прилавках. Это может использоваться для экспериментального нахождения наиболее выгодного расположения товара, либо же для наблюдения за схожими действиями конкурирующих фирм. Помимо этого, менеджеры компании могут осуществлять выборку снимков по конкретному сотруднику для наблюдения за эффективностью его работы.
Проект предусматривает использование в закрытой
инфраструктуре, поэтому сложно сказать, существуют ли схожие решения. Хоть это
и не афишируется, вероятно, подобные системы используются другими компаниями,
однако, скорее всего, имеют свои особенности, связанные с производственной
отраслью и предметом наблюдений.
1. Обзор литературы
В основе программирования для операционной системы (ОС) Android лежит программирования на Java. Несмотря на свою закостенелость и ощутимое неудобство в работе, Java является одним из самым популярных языков программирования. Язык имеет большую историю - первый релиз Java состоялся ещё в 1995 году - поэтому не удивительно, что существует огромное количество учебников и специализированных сайтов, посвящённых Java-разработке. В качестве ярких примеров можно привести наиболее распространённые [1] и [2].- объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Приложения Java обычно транслируется в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине вне зависимости от компьютерной архитектуры. Bиртуальная машина Java (Java Virtual Machine, далее JVM)) - основная часть исполняющей системы Java, так называемой Java Runtime Environment (JRE). Виртуальная машина Java интерпретирует байт-код, предварительно созданный из исходного текста программы компилятором.
В своё время Java удалось сдать стандартом де-факто для бизнес решений. В многом на это повлияли удобство программирования (на тот момент это ещё было актуально) и простота освоения языка: синтаксис языка Java представляет собой более простой вариант синтаксиса языка С++. Зная С++, несложно перейти к языку Java. В настоящий момент Java ощутимо проигрывает в удобстве использования большинству современных языков программирования, однако не спешит сдавать позиции в рейтинге популярности. В основном это обусловлено политикой компании Oracle, из-за которой темпы развития Java существенно отстают от других распространённых языков программирования. Java-сообщество по-прежнему обширно, а экосистема языка содержит гигантскую кодовую базу с тысячами сторонних библиотек, существенно расширяющих функциональность. Несмотря на первый взгляд, оптимистичную картину, без многих популярных библиотек функциональность и удобство использования Java «из коробки» оставляет желать лучшего.
Одним из главных свойств Java, обеспечившим ему огромную популярность, является переносимость. Философия Java провозглашает принцип «Write once - run everywhere», указывающий на то, что, в теории, Java-код может быть исполнен на любой JVM, работающей на любом устройстве. В реальной жизни, конечно, данный принцип работает с большими оговорками, однако это не мешает успешной работоспособности JVM более чем на трёх миллиардах устройств. Скорее всего, благодаря заманчивой перспективе переносимости, именно Java был выбран в качестве языка программирования для операционной системы (ОС) Android. Философия платформы включает в себя варианты использования ОС на любом устройстве с любой микропроцессорной архитектурой, будь то ARM, x86 или любая другая.
ОС Android является хорошим примером лукавости принципа «Write once - run everywhere»: ввиду ограниченности ресурсов использование стандартной JVM было затруднено, и единственным возможным выбором было использование Java ME JVM, разработанной для мобильных устройств. Однако, компания Google решила разработать собственную виртуальную машину Dalvik VM, которая отличается от других JVM следующим [3]:
. Используется специальный формат DEX для хранения двоичных кодов с целью уменьшения их размера.
. Dalvik VM оптимизирована для выполнения нескольких процессов одновременно.
. Используется архитектуру, основанную на регистрах против стековой архитектуры в других JVM.
. Используется собственный набор инструкций, а не стандартный байткод JVM.
. Возможен запуск нескольких независимых Android-приложений в одном процессе.
. Реализован специальный механизм сериализации объектов, основанный на классах Parcel и Parcelable.
. Имеется особый способ для выполнения вызовов между процессами, основанный на Android Interface Definition Language (AIDL).
Кроме новой JVM, также были пересмотрены стандартные пакеты Java JDK API. Некоторые из ни были удалены, например, всё, что касалось Swing (библиотеки для создания графического интерфейса пользователя), но в том числе добавилось некоторое количество собственных android. пакетов. Таким образом, далеко не всякая программа или библиотека, написанная на Java, сможет без проблем быть скомпилированной и запуститься на Android-устройстве.
В связи с большой популярностью мобильных разработок, существует большое количество источников информации по Android-разработке. Основным источником, в первую очередь, является официальная документация [4]. Помимо технической документации комплекта средств разработки (Software Development Kit, SDK), официальный сайт содержит множество примеров, руководства по реализации стандартных компонентов, пошаговые рекомендации по разработке приложений с нуля, а также требования к дизайну.
Одной из наиболее популярных книг является [5]. Данная книга представляет собой практический курс по написанию программного обеспечения на базе второй версии Android SDK. Несомненно, книга сильно устарела на данный момент, однако всё ещё является хорошим структурированным руководством по изучению платформы. Поскольку множество приложений создается с условием совместимости с более старыми версиями ОС Android, многие примеры из данной книги не потеряли актуальности.
Как бы то ни было, из любого из выше приведенных источников можно почерпнуть сведения об архитектуре и процессе разработки приложений. Любое Android-приложение, содержит в себе хотя бы один из так называемых App Components - компонентов приложения. Существуют четыре вида основных компонентов приложения: Activity, Service, Content Provider и Broadcast Receiver. К сожалению, не существует какого-либо официального перевода этих терминов на русский язык. В переведённой литературе обычно используется калька с английского, например, Activity - «Активность». Поскольку термин «Активность» не совсем соответствует тому, для чего служит класс Activity (о его назначении будет написано ниже), в большинстве интернет-источников используется русская транскрипция терминов, например, Activity - «Активити».
Активити представляет собой одну «страницу» с пользовательским интерфейсом (если проводить аналоги с веб-интерфейсами). Все пользовательские активити являются классами, унаследованными от стандартного класса Activity. Здесь можно провести некоторую параллель с технологией Windows Forms, однако, поскольку Java не поддерживает частичные (partial) классы, в Android-приложениях используется иной способ связывания элементов интерфейса и пользовательского класса-активити. Каждая активити обладает определённым жизненным циклом (рисунок 1.1), который является хорошей демонстрацией специфики мобильных приложений. Поскольку ресурсы мобильных устройств весьма ограничены, достоверно можно сказать лишь то, что в памяти существуют лишь те объекты, которые так или иначе относятся к отображаемому на экране содержимому. Как только активити скрывается с экрана, например, если пользователь сворачивает приложение кнопкой «Домой», активити переходит в состояние «остановлено» (stopped). Начиная с этого момента, ОС может уничтожить все объекты в оперативной памяти, относящиеся к данной активити, включая саму активити. Исходя из этого очень важно вовремя сохранять состояние приложения. Второй особенностью активити является то, что каждый раз при смене ориентации устройства с ландшафтной на портретную или наоборот, активити уничтожается и создаётся заново. Сложно сказать, чем продиктовано подобное решение, скорее всего это сделано для того, чтобы обеспечить поддержку различных вариантов пользовательского интерфейса для различной ориентации устройства. Данная особенность порождает вторую важную проблему - проблему сохранения состояния при изменении конфигурации (например, при повороте экрана). Подробнее о работе с активити можно прочитать в специализированном разделе документации [4].
Сервис - это компонент, который работает в фоне и используется для длительных и ресурсоёмких операций. Отличительной особенностью сервиса является возможность запуска в привилегированном режиме (foreground mode), благодаря которому ОС не завершает приложение в фоне максимально долгое время. Несмотря на такую возможность, разработчикам крайне не рекомендуется злоупотреблять ею и наоборот, завершать сервисы как можно раньше. Привилегированный режим обычно используется для записи или воспроизведения потокового содержимого, а также для скачивания или загрузки файлов. Помимо упоминавшихся ранее источников, хорошим руководством по работе с сервисами является [6].
Ещё одним часто используемым компонентом
является Broadcast Receiver (в русскоязычной литературе встречается перевод
«широковещательный приемник»). Broadcast receiver - это компонент, служащий для
обработки широковещательных сообщений. ОС Android
использует специальные объекты для сообщения между компонентами - интенты (intent).
Иногда в литературе встречается прямой перевод - «намерения». Интент - это
объект класса Intent
представляющий собой некоторое сообщение. С каждым интентом может
ассоциироваться некий код ошибки, действие, URI
(Uniform Resource Identifier), а также произвольный набор пересылаемых
объектов. Объекты, так называемые extras,
хранятся в ассоциативном контейнере с уникальными строковыми ключами.
Поддерживаются все примитивные типы, строки, а также объекты, реализующие
интерфейсы Serializable
или Parcelable.
Интенты могут быть узконаправленными, например, для запуска сервиса или
активити, или же широковещательными, обычно используемые в качестве нотификации
о каком-либо событии. Интенты широко используются в ОС Android: благодаря
широковещательным интентам, с помощью широковещательных приемников можно
подписываться на различные системные события, от срабатывания будильника и до
перехода по ссылке в браузере.
Рисунок 1.1 - Жизненный цикл Activity
Последним нерассмотренным компонентом является поставщик контента - content provider. Это, пожалуй, наименее часто используемый компонент, служащий для предоставления доступа к некоторому хранилищу данных. Существуют системные поставщики контента для доступа к телефонным контактам, получения информации об установленных приложениях и многого другого. Доступ осуществляется с помощью URI по аналогии с доступом к веб-страницам. Низкая популярность данного компонента связана с его специфичностью: далеко не каждое приложение имеет необходимость в предоставлении доступа к своим данным.
Широковещательные приёмники и поставщики контента хорошо описаны во многих источниках, например, на популярном русскоязычном ресурсе, посвящённом изучению программирования для ОС Android - [7].
Связующим элементом, объединяющим разрозненные компоненты в единое Android-приложение, является манифест. Манифест - это специальный обязательный XML-файл, содержащий перечень всех компонентов приложения, минимальную и используемую для сборки версии ОС, а также требуемые для работы разрешение и необходимые возможности устройства (например, наличие фронтальной камеры или определённой версии OpenGL ES).
Помимо изучения работы с основными компонентами, каждый разработчик должен ознакомится с основными шаблонами проектирования ОС Android. Наиболее часто используемыми стандартными шаблонами проектирования являются наблюдатель (observer) и слушатель (listener). Также широко используются такие принципы как обмен сообщений и позднее связывание. Помимо этого, Android диктует свои правила при реализации некоторых стандартных процессов, тем самым заставляя разработчикам следовать определённым специфическим шаблонам проектирования. Ярким примеров этого могут служить загрузчики (loaders). Загрузчики являются потомками класса Loader и служат для асинхронной загрузки данных. Главным преимуществом загрузчиков является то, что их жизненный цикл не зависит от других компонентов. Для доступа к загрузчикам используется специальный компонент Loader Manager, который позволяется работать с загрузчиками любым классам, реализующим интерфейс Loader Manager Loader Callbacks. Несмотря на некоторые встроенные во фреймворк реализации, разработчикам довольно часто приходится реализовывать свои специфические загрузчики, например, для работы с локальной базой данных или получения массивов информации по сети. Хорошую статью о практической реализации загрузчиков можно найти по адресу [8]. Там же можно отыскать и другие полезные статьи по специфическим шаблонам проектирования.
Несмотря на довольно динамичное развитие SDK и внедрение новых шаблонов проектирования, в последнее время издавалось не много литературы с упором на актуальные версии средств разработки. В качестве одного из примером, можно привести [9]. Книга во много схожа с [2], однако базируется на современной версии платформы и отдельно затрагивает тему обеспечения совместимости с использованием стандартных компонентов.
Поскольку Android-разработка является фрэймворк-ориентированной, то есть, достаточно сильно завязанной на стандартные классы и генерацию кода, перед всеми разработчиками встаёт вопрос: какую же среду разработки следует использовать для максимально удобного программирования под Android? Однозначного ответа на него нет, скорее это вопрос личных предпочтений. Существует четыре основных интегрированных среды разработки (Integrated development environment, далее IDE) с поддержкой Android-проектов:
- Eclipse + ADT Plugin;
- InelliJ IDEA;
- NetBeans;
- Android Studio.
Долгое время чаще всего использовались первые две IDE. Eclipse является скорее платформой для создания универсальных сред разработки, основанных на интегрировании специальных модулей расширения - плагинов. Соответствующий плагин для Android-разработки носит имя ADT Plugin и обладает весьма обширным функционалом. Первоначально именно его широкая функциональность принесла популярность связке Eclipse + ADT Plugin, поскольку она позволяла, например, редактировать пользовательский интерфейс в WYSIWYG стиле. Несмотря на это, в последнее время Eclipse сильно уступила InelliJ IDEA в связи с бурным и динамичным развитием последней. InelliJ IDEA также поддерживает расширения в виде плагинов и позволяет создавать Android-проекты, однако объективно обладает намного более впечатляющими возможностями для написания, редактирования и рефакторинга исходного кода по сравнению с Eclipse.