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

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

Еще больше усложняет управление жизненным циклом приложения изменения конфигурации (Configuration Changes). Изменения конфигурации - это быстрые циклы уничтожения/повторного создания активности, возникающие при изменении конфигурации активности, например, когда устройство повернуто (и необходимо, чтобы активность была восстановлена в ландшафтном или портретном режиме), когда отображается клавиатура или, когда устройство помещено в док-станцию [7].

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

2.3.1 Методы жизненного цикла

Android SDK и Xamarin.Android обеспечивают мощную модель управления состоянием активности в приложении. Когда состояние активности изменяется, активность уведомляется операционной системой через вызовы определенных методы для этой активности. Диаграмма, представленная на рисунке 2.2 иллюстрирует эти методы в отношении жизненного цикла активности.

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

Следует рассмотреть работу каждого из методов жизненного цикла активности отдельно.

Метод OnCreate - это первый метод, который вызывается при создании активности. OnCreate всегда переопределяется для выполнения инициализации активности. Во время выполнения этого метода обычно происходит:

создание представлений;

инициализация переменных;

связывание статических данных со списками.

Рисунок 2.2 - Методы жизненного цикла активности

принимает параметр Bundle, который является словарем для хранения и передачи информации состояния и объектов между активностями. Если bundle не является равен null, это указывает на то, что активность перезагружается и должна восстановить свое состояние из предыдущего экземпляра.

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

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

Сразу после завершения метода, операционная система вызывает метод OnResume активности.

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

запуск анимации;

запуск прослушивания обновлений GPS;

отображение любых необходимых предупреждений или диалогов.

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

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

запись несохраненных изменений в постоянные данные;

уничтожение или объектов, потребляющих ресурсы;

уменьшение частоты кадров и приостановка анимации;

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

После завершений метода OnPause может быть вызван один из двух методов:

OnResume. Будет вызван, если активность должна быть возвращена на передний план;

OnStop. Будет вызван, если активность помещается в фоновом режиме.

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

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

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

Метод OnDestroy - это последний метод, который вызывается активности перед ее уничтожением и полным удалением из памяти. В экстремальных ситуациях операционная система может убить процесс приложения, которому принадлежит активность, что приведет к тому, что метод OnDestroy не будет вызван. Обычно этот метод не переопределяется, так как большинство необходимых операций выполняется в методах OnPause и OnStop. Метод OnDestroy обычно переопределяется только для остановки долгоживущих фоновых потоков, которые могут вызвать утечку ресурсов.

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

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

На многих устройствах Android есть две различные кнопки: кнопка "Назад" и кнопка "Домой". Существует тонкая разница между этими двумя кнопками, хоть обе они и оказывают похожий эффект на приложение отправляя его в фоновый режим. Когда пользователь нажимает кнопку "Назад", она сообщает операционной системе, что пользователь закончил работу с текущей активностью и Android ее уничтожает. Когда же пользователь нажимает кнопку "Домой", активность просто помещается в фоновый режим [9].

2.3.2 Сохранение состояния

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

Основным методом сохранения состояния активности является использование словаря ключ/значения, известного как bundle. Этот объект передается методу OnCreate в качестве параметра, и его можно использовать для восстановления состояния активности. Bundle рекомендуется использовать для сохранения простых значений, таких как строки.

Активность предоставляет методы, помогающие сохранить и восстановить состояние в Bundle.

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

Метод OnRestoreInstanceState, вызывается после завершения метода OnCreate и предоставляет еще одну возможность для активности восстановить состояние после завершения инициализации.

Метод OnSaveInstanceState получает в качестве параметра объект Bundle, в котором активность может сохранить в свое состояние.

Переопределение OnSaveInstanceState является подходящим механизмом для сохранения временных данных активности, однако реализация OnSaveInstanceState по умолчанию позаботится о временных данных содержащихся в элементах пользовательского интерфейс, а активности, если такие элементы имеют определенный идентификатор, который может быть назначен с помощью атрибута android:id в файле разметки XML. Например, если активность содержит элемент EditText определенный в XML, и он имеет идентификатор, то данные введенные пользователем будут сохранены при изменении конфигурации (повороте экрана).

Метод OnRestoreInstanceState получает в качестве параметра тот же объект Bundle что и метод OnCreate. Этот метод существует для обеспечения некоторой гибкости при восстановлении состояния. Иногда более целесообразно подождать полной инициализации активности прежде чем восстанавливать состояние.

Хотя OnSaveInstanceState упрощает сохранение временных данных, он имеет некоторые ограничения:

вызывается не во всех случаях. Например, нажатие кнопки "Домой" или "Назад" для выхода из действия не приведет к вызову метода OnSaveInstanceState;

объект Bundle передаваемый в качестве параметра в OnSaveInstanceState предназначен для хранения больших объектов;

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

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

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

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

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

Для прототипирования пользовательского интерфейса разрабатываемого мобильного приложения была использована бесплатная версия онлайн сервиса NinjaMock.com.

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

Экран входа в приложение представлен на рисунке 2.3.

Рисунок 2.3 - Прототип экрана входа в приложение

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

Заголовок экрана входа содержит название приложения.

В верхней части экрана входа находится логотип организации.

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

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

Рисунок 2.4 - Прототип экрана, содержащего список заказов

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

В подзаголовке отображается имя текущего пользователя.

В списке заказов содержатся карточки заказов отображающие основную информацию по ним.

При нажатии кнопки "Фильтр" появляется диалоговое окно с опциями фильтрации заказов представленное на рисунке 2.5.

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

В заголовке экрана содержится название "Просмотр заказа".

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

Рисунок 2.5 - Прототип диалогового окна с опциями фильтрации заказов

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

Прототип экрана с подробной информацией по заказу представлен на рисунке 2.6.

Рисунок 2.6 - Прототип экрана отображения детальной информации о заказе

.5 Разработка пользовательского интерфейса

Все элементы пользовательского интерфейса в приложении для Android построены с использованием объектов View и ViewGroup. View - это объект, который рисует что-то на экране, с которым пользователь может взаимодействовать. ViewGroup - это объект, который содержит другие объекты View (и ViewGroup), чтобы определить макет интерфейса.предоставляет коллекцию подклассов View и ViewGroup которые содержат часто используемые элементы, такие как кнопки и поля для ввода текста, и различные макеты (Layouts) для группировки элементов: линейный (Linear Layout), относительный (Relative Layout), табличный (Table Layout) и другие.

Каждый подкласс класса ViewGroup предоставляет уникальный способ расположения View, которые вы в нем размещаете. В разработанном мобильном приложении используются два наиболее часто используемых макета: Linear Layout и Relative Layout.

Макет Linear Layout представляет из себя подкласс ViewGroup который выравнивает все дочерние элементы в одном из направлений: вертикально или горизонтально. Направление выравнивания указывается с помощью атрибута android: orientation. Все дочерние элементы Linear Layout располагаются один за другим, поэтому в вертикальном списке будет только один дочерний элемент на строку, независимо от того, насколько они широки, а в горизонтальном списке будет только один дочерний элемент на колонку.

Relative Layout - это подкласс ViewGroup, который отображает дочерние элементы в относительных положениях. Позиция каждого элемента может быть указана относительно соседних в иерархии элементов (например, слева или ниже другого элемента) или в относительно родительской области Relative Layout (например, элемент прижат к низу родительской области, к левому краю, выравнен по центру). Relative Layout - очень мощная макет, так как он помогает избежать множественных вложений макетов и сохранить иерархию элементов пользовательского интерфейса максимально плоской, что повышает производительность мобильного приложения [6].

Макет пользовательского интерфейса можно задать двумя способами:

объявить элементы пользовательского интерфейса в XML файле. Android предлагает простой синтаксис XML, который содержит элементы, соответствующие классам и подклассам View и ViewGroup определенным в Android SDK;

создавать элементы макета во время выполнения. Приложение может создавать объекты View и ViewGroup, и устанавливать их свойства программно.дает возможность использовать один или оба этих метода для объявления и управления пользовательским интерфейсом мобильного приложения. Например, вы можете объявить макеты по умолчанию вашего приложения в XML, включая элементы экрана, которые будут отображаться в них и их свойства. Затем вы можете добавить код в приложение, которое изменит состояние объектов экрана, в том числе объявленных в XML, во время выполнения.

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

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

Для создания темы приложения соответствующей цветам организации необходимо создать файл styles.xml в папке Resources/values-v21 приложения. Данное расположение файла специфично для версий Android 5 и выше. В файле стилей приложения возможно задать следующие свойства встроенной темы Material Theme:

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