Дипломная (вкр): Создание мобильного приложения для организации

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

colorPrimary - основной цвет приложения. Цвет заголовка приложения;

colorPrimaryDark - цвет строки состояния и контекстных заголовков приложения;

colorAccent - цвет таких элементов как флажки, радио кнопки и границы полей для ввода текста;

windowBackground - цвет фона экрана;

textColorPrimary - цвет текста основного текста приложения;

statusBarColor - цвет панели состояния;

navigationBarColor - цвет панели навигации.

Файлы с описанием пользовательского интерфейса находятся в папке Resources/layout разрабатываемого приложения. Список файлов показан на рисунке 2.7.

Рисунок 2.7 - Список файлов, содержащих описание пользовательского интерфейса

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

Визуального редактора пользовательского интерфейса запускается автоматически при создании макета или его открытии. Для того чтобы отобразить xml содержимое файла, в среде разработки VisualStudio нужно переключиться на вкладку Source редактора файла.

Файл Login.axml содержит описание пользовательского интерфейса для экрана входа в приложение. Макет экрана входа в приложение строится на основе макета Relative Layout. Макет содержит такие элементы как:

ImageView - для отображения логотипа организации;

EditText - для отображения поля для ввода пароля. Элемент EditText содержит атрибут android:inputType установленный в значение "textPassword", что делает введенные в это поле символы замаскированными;

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

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

Файл Main.axml cодержит единственный элемент Linear Layout который является контейнером для основных фрагментов приложения.

Фрагменты (Fragments) представляют собой активность или часть пользовательского интерфейса активности. Можно объединять несколько фрагментов в одной активности для создания многоуровневого пользовательского интерфейса и повторно использовать фрагменты в разных действиях. Фрагмент можно рассматривать модуль активности, который имеет свой собственный жизненный цикл, получает собственные входные события, которые можно добавлять или удалять во время работы.

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

Фрагменты находятся внутри иерархии представлений активности и имеет свой собственный макет. Фрагмент может быть добавлен в активность с помощью явного объявления в файле макета активности используя элемент <fragment> или динамически из кода приложения, с помощью добавления его в существующую ViewGroup активности. Однако фрагмент не обязан быть частью макета активности. Фрагмент может быть использован без пользовательского интерфейса в качестве рабочего потока активности.

Файл OrderListFragmet.axml содержит TextView для отображения текущего пользователя и ListView для отображения списка заказов. Для отображения каждого объекта заказа в виде сложного элемента CardView с множеством TextView реализован адаптер данных OrderListAdapter который возвращает View для каждого элемента списка на основе данных из объекта и макета, содержащегося в файле OrderListRow.axml.

Файл OrderDeatilsFragment.axml содержит ListView в котором в качестве заголовка используется детальная информация по заказу отображаемая с помощью макета OrderDeatilsHeader.axml, а элементы списка сформированы при помощи объектов данных о фотографиях прикрепленных к этому заказу и макета PhotoListRow.axml.

Файл ViewPhotoFragment.axml содержит элемент ImageView для отображения фотографии транспортного средства.

.6 Хранение данных

В мобильной платформе Android для хранения данных приложений используется база данных SQLite. Для работы с этой базой данных для приложений на платформе Xamarin есть возможность использовать библиотеку SQLite.NET, которая поддерживает технологию ORM (Object-Relational Mapping).

Благодаря технологии ORM используемой в библиотеке SQLite.NET, нет необходимости разрабатывать схему базы данных для несложных объектов, что значительно ускоряет разработку приложения.

Для хранения объектов в базе данных, достаточно описать их параметры с помощью атрибутов определенных в библиотеке SQLite.NET.

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

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

Для работы с данными используются следующие методы класса SQLiteConnection:

Insert - добавляет новый объект в соответствующую таблицу базы данных. Таблица автоматически определяется из типа передаваемого значения;

Get<T> - возвращает объект с заданным первичным ключом (таблица определяется по типу обобщенного параметра);

Table<T> - возвращает все записи из таблицы;

Delete - удаляет объект с заданным первичным ключом;

Query<T> - выполняет SQL запрос и возвращает список записей в качестве результата;

Execute - используется для выполнения SQL запросов, не предполагающих возврата значения (INSERT, UPDATE, DELETE).

2.7 Хранение настроек приложения

Для сохранения небольшой коллекции данных представленных в виде ключ/значение, можно использовать API общих настроек (SharedPreferences). Объект класса SharedPreferences предоставляет простые методы чтения/записи файла настроек приложения, содержащего коллекцию пар ключ/значение.

Для создания нового или доступа к существующему фалу настроек может быть использован один из двух методов:

getSharedPreferences() - используется, если необходимо обеспечить работу с несколькими файлами настроек. Имя файла настроек передается в качестве параметра метода;

getPreferences() - используется если необходимо создать или прочитать один файл общих настроек для заданной активности.

При именовании файлов общих настроек необходимо использовать уникальное имя приложения, например, "com.example.myapp.PREFERENCE_FILE_KEY".

Для записи в файл настрое нужно создать объект класса SharedPreferences.Editor, вызвав метод edit() объекта SharedPreferences.

Значения могут быть записаны с помощью последовательного вызова методов putInt() или putString() (для записи целочисленных и строчных значений соответственно) и метода commit() (для сохранения изменений) объекта SharedPreferences.

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

В приложении используется шаблон проектирования Синглетон для доступа к общим настройкам. Синглетон - это порождающий шаблон проектирования, гарантирующий, что в однопроцессном приложении будет единственный экземпляр некоторого класса, и предоставляющий глобальную точку доступа к этому экземпляру [11]. Класс ApplicationPreferences реализует этот шаблон проектирования и инкапсулирует доступ к настройкам приложения через свойства. Для сохранения текущего пользователя внешнему коду достаточно присвоить значение свойству CurrentUser класс, а для чтения, сохраненного в файле настроек данных о текущем пользователе достаточно соответственно получить значение свойства CurrentUser.

2.8 Синхронизация данных

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

К ним относятся:

AlarmManager;

JobScheduler;

GCM Network Manager;

- SyncAdapter.

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

.8.1 AlarmManager

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

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

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

.8.2 JobScheduler

Класс JobScheduler помогает эффективно работать в фоновом режиме. Сервисы JobService запускаются согласно критериям, установленным в JobInfo с помощью метода JobInfo.Builder(). Эти критерии задают необходимые условия для выполнения JobService, например, выполняться только в режиме ожидания, только при подключении к сети интернет или только при безлимитном подключении. JobInfo также может задавать минимальные задержки между выполнениями JobService и максимальный срок ожидания выполнения JobService. Задания сохраняются в очереди операционной системой если критерии не выполнены, для того чтобы быть исполненными позднее. Операционная система также попытается объединить эти задания вместе таким образом, чтобы сократить время работы при подключении к сети [9].

Для того чтобы создать подкласс базового класса JobService требуется переопределить методы onStartJob и onStopJob.

Метод onStartJob() - вызывается при срабатывании планировщика. Этот метод выполняется в основном потоке и может заблокировать выполнение приложения. Если необходимо выполнить длительную работы, то следует создать новый поток для ее выполнения и вернуть значение true в качестве результата работы метода или false если создание дополнительного потока не понадобилось и вся работа выполнена. Также если потребовалось создание дополнительного потока следует вызвать метод jobFinished() когда задание завершено.

Метод onStopJob() будет вызван операционной системой после завершения работы сервиса или когда состояние устройства больше не удовлетворяет критериям заданным в JobInfo.обладает гораздо большей гибкостью, чем AlarmManager. Запланированные таким образом задания сохраняются даже после перезагрузки устройства

.8.3 GCM Network Manager

GCM (Google Cloud Messaging) Network Manager фактически использует JobService при работе с Android версии 5 и выше, а поддержка предыдущих версий Android осуществляется я с помощью сервисов Google Play. GCMNetworkManager обладает теми же преимуществами в плане экономии заряда, что и JobScheduler, при этом обладая лучшей обратной совместимостью и более простым API.

Задания создаются с помощью методов OneoffTask.Builder() или PeriodicTask.Builder(). Шаблон Builder (строитель) упрощает добавление критериев планирования к задаче. Критерии почти идентичны критериям JobInfo, и система стремится оптимизировать время автономной работы с помощью объединения вызова заданий, запланированных с помощью GCMNetworkManager.

Для обработки запланированных заданий требуется подкласс базового класса GcmTaskService. GcmTaskService требует переопределения метода onRunTask(), и именно в нем должна выполняться вся работа. Метод onRunTask() запускается в фоновом потоке, что делает его использование немного удобней, чем использование метода onStartJob() класса JobService.

В отличие от JobScheduler задания, установленные с помощью GCMNetworkManager, могут быть потеряны при обновлении приложения или сервисов Google Play. Метод onInitializeTask() класса GcmTaskService может быть переопределен для того чтобы получать уведомление об этом событии и соответствующим образом реагировать на него для повторного планирования заданий [7].и JobScheduler не созданы для выполнения задач сразу или в определенное время. Они предназначены для выполнения повторяющихся или одноразовых, низкоприоритетных работ и сохранения срока службы батареи. Приложение требующие какой-либо точности во времени вызова сервизов, не должно использовать ни один из этих методов планирования. Это особенно актуально после введения режима Doze в Android версии 5.

2.8.4 Адаптеры синхронизации

Адаптеры синхронизации (Sync Adapters) были созданы с целью решения задач синхронизации Android устройств и серверов. Запуск синхронизации моет быть инициирован изменениями данных на сервере или устройстве, или по истечении определенного времени. Операционная система будет пытаться выполнять синхронизацию пакетно, чтобы сохранить время автономной работы мобильного устройства, и транзакции будут накапливаться в очереди для передачи позже. Система будет пытаться запустить синхронизацию только тогда, когда устройство подключено к сети [6].

Дополнительным плюсом адаптеров синхронизации является возможность для пользователя видеть информацию о состоянии синхронизации и возможность отключать ее.

Для использования адаптера синхронизации приложениям требуется компонент аутентификатор и поставщик контента. Ожидается, что приложение будет иметь учетную запись и базу данных, если требуется синхронизация между устройством и сервером. Это может быть не всегда так, но для работы адаптера синхронизации требуются подклассы базовых классов AbstractAccountAuthenticator и ContentProvider. Приложениям, которые не нуждаются в этих классах, но в которых нужно использовать адаптер синхронизации, можно просто заменить аутентификатор и поставщик контента классами-заглушками.

Адаптер синхронизации объявляется в XML файле. В нем указывается поставщик контента и аутентификатор, а также, другие опции, такие как: видимость адаптера синхронизации в настройках и другие.

Существуют следующие варианты запуска адаптера синхронизации:

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

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

когда система посылает сетевое сообщение. Запуск адаптера синхронизации, когда операционная система Android посылает по сети сообщение, которое держит TCP/IP соединение открытым; это сообщение является частью сетевого взаимодействия. Эта опция является одним из способов для автоматического запуска адаптера синхронизации;

Источник: https://www.bibliofond.ru/detail.aspx?id=897268