Продолжение экспериментов с программирование под Andoid

Изменения внесенные перед отпуском:

  • Главное меню;
  • Страница отсчета времени тренировки;
  • Дополнительное меню, для переключения между страницами;
  • Фоновое изображение

Скриншоты:

menu

time

stopwatch

А так же демонстрация на живом устройстве HUAWEI U8825 на rutube

Анатомия Qt5 для Android

Вольный перевод Anatomy of a Qt 5 for Android application.

Предпосылки

Это выходит за рамки блога, чтобы объяснить, как работает слой абстракции Qt(Qt Platform Abstraction (QPA) ) . Кроме того, за рамками остается  подробное введение в разработку и сопровождение приложений в Android.  Она должна быть понятной и полезной без глубоких знаний технологий, если хотите знать больше, есть документация и блоги в интернете.

Достаточно сказать: Qt абстрагирует от оконной системы(windowing system) в API под названием «QPA«, так что зависимый от платформы код может быть выделен в плагин. Этот плагин будет управлять всеми обработчиками, от отображения, до передачи сообщений от оконной системы в цикл обработки событий Qt.  Android является одной из таких платформ, но во многом отличается от других платформ, поддерживаемых Qt, так как он по своей сути является Java-платформой. Android приложения это Java приложений, работающие под виртуальной машине «Dalvik». Это создает дополнительные проблемы при интеграции с C++  фреймворком  Qt.

Что приводит нас к «Java Native Interface» (или JNI для краткости). Это слой коммуникации между Java и C, и используется для передачи данных туда и обратно между операционной системой и платформой плагинов Qt. В Qt, мы работаем над некоторыми удобным API, вокруг JNI API, чтобы помочь вам объединить Qt код с кодом JNI, если вы хотите, чтобы ваш код взаимодействовал с Java.

В разрезе

На самом верхнем уровне, Qt для Android состоит из двух частей:

  • Qt приложение: Это кросс-платформенный код и ресурсы, которые вы, как разработчик приложения, управляете сами, и которые приведены в вашем qmake.pro файле
  • Пусковое приложение под Android, которое генерирует Qt Creator для вас, в при первом подключению к проекту.

Последнее состоит из:

  • Подкласса android.app.Application, что поддерживает привязку к Qt средствами Java’s Reflection API;
  • Подкласс android.app.Activity : Это точка входа в приложение.  Android, приложение может состоять из нескольких activitys, отвечая на различные intents. Однако по умолчанию приложений Qt будет состоять только из одного activity, которое может быть запущено из сетки приложений Android.  Несколько событий системы распространяется на activity вашего приложения, и распространяются по подклассам Qt, QtActivity класс также проводит загрузку родные файлы на основе выбранного метода развертывания и запуска приложения вызывая функцию main ();
  • Интерфейс, для подключения к службе Ministro: Ministro является механизмом развертывания, где Qt библиотеки загружаются и поддерживается внешней службой на целевом устройстве, и служит для уменьшения объема используемого пространства на каждое приложение Qt. Интерфейс используются для связи со службой в случае, если был выбран этот механизм развертывания
  • AndroidManifest.xml: Это jоснова мета-данных в Android приложениях. В какой-то момент вам придется изменить его, чтобы установить такие вещи, как имя вашего приложения, имя пакета, версию кода, значок, разрешений и т.д.
  • Другие мета-данные: Есть набор дополнительных файлов, используемых для хранения дополнительной информации о приложении. Это, например, информация о выбранном механизме развертывания в Qt Creator, макет для отображения заставки, перевод текста интерфейса Ministro и т.д.

Когда Qt Creator настраивает проект на работу с Qt под Android, он будет копировать эти файлы из каталога $QT/src/Android/Java . Он будет вносить изменения в файлы на основе параметров настройки развертывания вашей,  версии Android и т.д.  При разработке обычного приложения Qt, вам не придется изменять все это самостоятельно, за исключением AndroidManifest.xml и даже то, что может подождать, пока вы на самом деле не захотите развернуть приложения пользователям или в маркете. В этот момент вы, вероятно, захотите установить некоторые специализированные данные, такие как имя и значок.

Последняя часть пазла состоящая из:

  • QtActivityDelegate.java и других java файлов. Это позволит создать пользовательский интерфейс для приложений (только один SurfaceView для отрисовки  Qt), и заботиться о взаимодействия Android и QPA. Когда приложения получает activity события от операционной системы, они будут вызывать функции QtActivityDelegate и они будут передаваться  в Qt.
  • Платформа плагинов. Есть две платформы плагинов в Qt для Android, которые рассчитаны на двух различных вариантах использования. Первым из них является растровой плагин, который используется для QtWidget -приложений, которые не зависят от OpenGL.  Это имитирует некоторые поведения в традиционной оконной системы рабочего стола.  Другой на GL основе, и использоваться, например, для Qt Quick 2 приложения, которые зависят от OpenGL ES 2.

Запуск

Когда запускается Qt приложение, приложение будет просто обычным Java приложение. Точка входа будет в QtActivity.java которую можно найти в  android/src/ … в каталоге проекта. Этот код сначала проверит ваш проект мета-данных, который содержится в android/AndroidManifest.xml  и android/res/values/libs.xm , чтобы увидеть, какой механизм развертывания был выбран. Qt Creator будет обновлять мета-данных в соответствии с настройками проекта.  Для более глубокое представление о различных значениях, вы можете попробовать выбрать различные механизмы развертывания в Qt Creator и запустить приложение, затем просмотреть мета-данные, чтобы увидеть, что изменилось.

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

  • Связка Qt библиотек в APK. При запуске, приложение скопирует некоторые из включенных в набор файлов в кэш;
  • Использовать сервис Ministro;
  • Развертывание  локальных Qt библиотек  во временный каталог.

Как только подготовка закончена, приложение будет первыми явно загружать Qt (и друге) библиотек, перечисленных в android/RES/values/libs.xml в указанном порядке. Когда это будет сделано, он загрузит платформу плагинов, который служит как плагин QPA и прослойку между Qt и Java. Этот плагин зарегистрирует набор собственных обратных вызовов, которые вызываются из Java в качестве реакции на Android событий, и это будет регистрацией интерфейсов QPA. Как только это будет сделано, то приложение будет загружать последнюю библиотеку: это ваше приложение.

Первое приложение Qt 5.1 под Android. Секундомер.

3 июля увидел свет Qt 5.1, в котором появилась поддержка Android в качестве preview. Полноценную поддержку обещают в 5.2, но ничто не мешает пощупать и начать что-то делать уже сейчас.

У меня давно была идея, создать своё приложение, для записи, хранения, и отображения результатов своих тренировок в спортзале.

Мои требования к секундомеру:

  • задавать время отдыха между подходами
  • отображать прогресс
  • отображение времени

Вот что в итоге получилось:
Секундомер: итог

Рассмотрим по подробней назначение элементов:

  1. контрол задающий время отдыха(вращается по часовой стрелке);
  2. прогресс пройденного времени;
  3. отображение времени;
  4. общее отображение времени

trainingBookTimerItems

За не знанием канваса(canvas) прогресс представляет из себя кастомный объект на C++.

Все исходные коды доступны на Google Code