ПЗ (1194863), страница 4
Текст из файла (страница 4)
С помощью данного сервиса осуществлено прототипирование экранов мобильного приложения в соответствии с требованиями заказчика.
Ниже представлены прототипы экранов «Купоны» (рисунок 18, а) и «Магазины» (рисунок 18, б).
а) б)
Рисунок 18 – Экраны приложения «Купоны» и «Магазины»
а) б)
Рисунок 18 – Экраны приложения «Категории»
Выше представлен прототип экрана «Категории» (рисунок 18, а), а также прототип экрана какой-либо выбранной категории (рисунок 18, б). В случае выбора магазина из экрана «Магазины», произойдет переход на экран «Магазин», представленный на рисунке 19.
Рисунок 19 – Экран «Магазин»
2.3 Реализация мобильного приложения
Для реализации мобильного приложения выбрана среда разработки Android Studio. Разработка приложений для Android ведется на языке Java. Для компиляции приложения необходимо установить дополнительное программное обеспечение – Java Development Kit (JDK). JDK – комплект разработчика приложения на языке Java, включающий компилятор, стандартные библиотеки классов, примеры, документацию и исполнительную систему Java Runtime Environment (JRE – минимальная реализация виртуальной машины, в которой запускается и выполняется программный код на Java).
2.3.1 Создание экранов мобильного приложения
В соответствии с созданным прототипом необходимо разработать интерфейс мобильного приложения. Интерфейс включает в себя несколько экранов. Для их реализации необходимо несколько классов Activity.
Класс представляет Activity собой визуальную активность приложения. Класс отвечает за создание окна, с которым взаимодействует с пользователем, например, он может набрать номер телефона, сделать фото, отправить письмо и т.д. Каждому классу присваивается окно для прорисовки соответствующего пользовательского интерфейса. Интерфейсы именно этих окон создаются на основе прототипа, разработанного ранее.
Интерфейс класса называется layout и имеет расширение .xml. Разработчику доступно два режима работы с настройкой интерфейса: design и text. Режим работы design (рисунок 20) позволяет разработчику настроить внешний вид мобильного приложения интерактивно, то есть используя существующие примитивы, доступные в Android Studio: виджеты, текстовые блоки, контейнеры и другие элементы дизайна. При добавлении или изменении элементов интерфейса произойдет автоматическая запись в текстовом представлении интерфейса класса.
Рисунок 20 – Режим работы «design»
Режим текстового изменения интерфейса (рисунок 21) даёт разработчику возможность создавать интерфейс приложения привычным ему способом – непосредственным изменением кода.
Рисунок 21 – Режим работы «text»
Такой способ работы позволяет настроить мелкие детали интерфейса или задать какие-либо параметры элементам интерфейса.
2.3.2 Жизненный цикл приложения
В операционной системе Android все мобильные приложения имеют строго определенный системой жизненный цикл. Каждый раз при запуске какого-либо мобильного приложения система дает ему наивысший приоритет. Это возможно благодаря тому, что каждое приложение запускается в виде отдельного процесса. Например, благодаря этому, при работе с приложениями система не блокирует входящие звонки. После прекращения работы работы с приложением система, система освобождает ресурсы, переводит приложение в разряд низкоприоритетного и закрывает его.
Все объекты Activity, которые есть в приложении, управляются системой в виде стека Activity, который называется back stack. При запуске новой Activity она помещается поверх стека и выводится на экран устройства, пока не появится новая Activity. Когда текущая Activity заканчивает свою работу (например, пользователь уходит из приложения), то она удаляется из стека, и возобновляет работу та Activity, которая ранее была второй в стеке.
После запуска Activity проходит через ряд событий, которые обрабатываются системой и для обработки которых существует ряд обратных вызовов.
Рисунок 22 – Взаимосвязь обратных вызовов
Взаимосвязь между всеми обратными вызовами можно представить схематично (рисунок 22).
2.3.2.1 Метод onCreate()
Данный метод вызывается при создании или перезапуске Activity. Этот метод является обязательным элементом. В нем производится первоначальная настройка Activity. В частности, создаются объекты визуального интерфейса. Метод onCreate() принимает объект Bundle, который содержит прежнее состояние Activity, если оно было сохранено. В случае, если Activity была создана заново, то данный объект имеет значение null.
2.3.2.2 Метод onStart()
В методе onStart() осуществляется подготовка Activity на экран устройства. Как правило, этот метод не требует переопределения, а всю работу производит встроенный код. Сопровождается вызовом метода onResume(), если активность получает передний план, или вызовом метода onStop(), если становится скрытой.
2.3.2.3 Метод onResume()
При вызове метода onResume Activity переходит в состояние Resumed, а пользователь может с ней взаимодействовать. Activity остается в этом состоянии, пока она не потеряет фокус, например, вследствие переключения на другую Activity или просто из-за выключения экрана устройства.
2.3.2.4 Метод onPause()
Данный метод может быть вызван системой в том случае, если пользователь переходит к работе с другой Activity. Происходит свертывание активности. Сохраняются незафиксированные данные. Для увеличения производительности системы останавливается воспроизведение видео, аудио, анимации. Если пользователь решит вернутся к данной Activity, то система вызовет метод onResume() и Activity снова появится на экране. Однако если для работы активных приложений потребуется больше памяти, система может вызвать метод onStop().
2.3.2.5 Метод onStop()
Данный метод вызывается, когда окно становится невидимым для пользователя. Это может произойти как при уничтожении текущей Activity, так и при запуске новой Activity, перекрывшей текущее окно. В этом методе Activity переходит в состояние Stopped. Однако сохраняется состояние всех элементов интерфейса. При повторном открытии Activity восстанавливаются объекты, хранящиеся в памяти. Если пользователь возвращается к текущей Activity, предварительно перейдя на другую, то система вызовет метод onRestart. Однако, если Activity полностью завершила свою работу (например, из-за закрытия приложения), то вызывается метод onDestroy().
2.3.2.6 Метод onRestart()
Данный метод вызывается в случае, если окно возвращается в приоритетный режим после вызова метода onStop(). Это означает, что Activity была остановлена, а затем снова запущена пользователем. Данный метод всегда сопровождается вызовом метода onStart().
2.3.2.7 Метод onDestroy()
Работа Activity завершается вызовом данного метода. При этом удаляются все статические данные Activity. Отдаются все используемые ресурсы. Также данный метод вызывается при изменении ориентации экрана, уничтожая Activity, а затем создавая заново, используя метод onCreate().
Переходы между перечисленными выше методами можно представить в виде простой схемы (рисунок 23).
Рисунок 23 – Переход между состояниями Activity
Рассмотренные методы жизненного цикла мобильных приложений в операционной системе Android позволяют сделать некоторые выводы. Жизненный цикл приложения жестко контролируется системой и сильно зависит от нужд пользователя и доступных ресурсов. В Android ресурсы более ограничены, чем в других операционных системах, поэтому если система решит, что работу приложения необходимо остановить, чтобы мобилизовать дополнительные ресурсы для выполнения более приоритетных задач, то работа приложения будет прекращена.
2.3.3 Взаимодействие мобильного приложения с сервером
2.3.3.1 Класс AsyncTask
Одной из операций, выполняемой мобильным приложением, является получение информации с удаленного сервера. Однако, получение информации через интернет может занять некоторое количество времени, зависящее от качества соединения. По этой причине в Android целесообразно использовать асинхронные задачи (AsyncTask).
Асинхронная задача – это вычисление, которое работает в фоновом режиме в отдельном потоке. После выполнения вычислений, результаты передаются в пользовательский интерфейс. AsyncTask позволяет избежать блокировки интерфейса в то время, когда система занята выполнением какой-то «тяжелой» задачи.
Для работы с классом необходимо создать класс-наследник, в котором описывается реализация необходимых методов. При описании класса-наследника в угловых скобках указываются три типа данных:
– тип входных данных;
– тип промежуточных данных;
– тип возвращаемых данных.
Тип входных данных подразумевает под собой данные, необходимые для обработки задачи. Тип промежуточных данных определяет тип объектов, который используется для индикации процесса выполнения задачи. Тип возвращаемых данных – то, что вернет AsyncTask после работы.
Асинхронная задача при работе использует несколько методов.
Метод Execute().
Данный метод вызывается, чтобы начать выполнение задачи. В него передается набор данных определенного типа. Этот тип указан первым в угловых скобках при описании класса AsyncTask.
Метод onPreExecute()
Данный метод вызывается в главном потоке после старта задачи перед методом doInBackground. На данном этапе обычно настраивают задачу, например, показывая индикатор прогресса в пользовательском интерфейсе.
Метод doInBackground()
Данный метод непосредственно выполняет задачу. Вызывается в фоновом потоке сразу после того, как завершит работу метод onPreExecute(). Этот метод используется для фоновых вычислений, которые займут значительное время. На данном этапе передаются параметры асинхронной задачи. Результат вычисления должен быть возвращен на этом этапе, и в дальнейшем передан в метод onPostExecute(). Также на этом шаге могут использоваться вызовы publishProgress(), которые посредством дальнейшего выполнения метода onProgressUpdate() позволяют передавать в главный поток информацию о прогрессе выполнения задачи.
Метод onPostExecute()
Данный метод выполняется из главного потока после завершения метода doInBackground(). Результат фонового вычисления передается на этом шаге как параметр.
Помимо вышеуказанных методов существует еще несколько, выполняющих операции при отмене пользователем выполнения фоновой задачи.
В любой момент времени задача может быть отменена посредством вызова метода cancel(boolean). После вызова этого метода вызов isCancelled() будет возвращать true. Также после вызова этого метода вместо метода onPostExecute(Object) будет вызван метод onCancelled(Object) после того, как завершится выполнение метода doInBackground(Object[]).















