Руководство по платформе Android
В данном руководстве показано, как настроить вашу среду SDK для развертывания приложений Cordova на устройствах Android и как использовать инструменты командной строки, ориентированные на Android, в вашем рабочем процессе разработки. Вам необходимо установить Android SDK независимо от того, хотите ли вы использовать эти инструменты командной строки, ориентированные на платформу, или кроссплатформенный Cordova CLI для разработки. Сравнение двух путей разработки см. в Обзоре. Подробности о CLI см. в Справочнике по Cordova CLI.
Требования и поддержка
Cordova для Android требует Android SDK, который можно установить на OS X, Linux или Windows. См. Системные требования Android SDK. Последний пакет Android Cordova поддерживает до Android уровня API 25. Поддерживаемые уровни API Android и версии Android для последних нескольких выпусков cordova-android представлены в этой таблице:
| Версия cordova-android | Поддерживаемые уровни API Android | Эквивалентная версия Android |
|---|---|---|
| 7.X.X | 19 - 27 | 4.4 - 8.1 |
| 6.X.X | 16 - 26 | 4.1 - 8.0.0 |
| 5.X.X | 14 - 23 | 4.0 - 6.0.1 |
| 4.1.X | 14 - 22 | 4.0 - 5.1 |
| 4.0.X | 10 - 22 | 2.3.3 - 5.1 |
| 3.7.X | 10 - 21 | 2.3.3 - 5.0.2 |
Обратите внимание, что указанные здесь версии относятся к пакету Android Cordova, cordova-android, а не к Cordova CLI. Чтобы определить, какая версия пакета Android Cordova установлена в вашем проекте Cordova, выполните команду cordova platform ls в каталоге, где находится ваш проект.
Как общее правило, версии Android, которые опускаются ниже 5% на панели мониторинга распределения Google в Google, больше не поддерживаются Cordova.
Установка необходимых компонентов
Java Development Kit (JDK)
Установите Java Development Kit (JDK) 8.
При установке на Windows вам также необходимо установить JAVA_HOME переменную среды в соответствии с путем установки JDK (см. Настройка переменных среды)
Gradle
Начиная с cordova-android 6.4.0, для сборки Android теперь требуется установленный Gradle.
При установке на Windows необходимо добавить Gradle в вашу переменную пути (см. Настройка переменных среды)
Android SDK
Установите Android Studio. Подробные инструкции по установке находятся на сайте разработчиков Android.
Добавление пакетов SDK
После установки Android SDK необходимо также установить пакеты для выбранного вами уровня API. Рекомендуется установить самую последнюю версию SDK, которую поддерживает ваша версия cordova-android (см. Требования и поддержка).
Откройте Android SDK Manager (выполните sdkmanager из терминала) и убедитесь, что установлены следующие компоненты:
- Платформа Android SDK для выбранной вами версии Android
- Инструменты сборки Android SDK версии 19.1.0 или выше
- Репозиторий поддержки Android (находится в разделе "Extras")
См. документацию Android по установке пакетов SDK для получения более подробной информации.
Настройка переменных среды
Инструменты командной строки Cordova требуют некоторых переменных среды для корректной работы. CLI попытается установить эти переменные за вас, но в некоторых случаях вам может потребоваться установить их вручную. Следующие переменные должны быть обновлены:
- Установите переменную среды
JAVA_HOMEв расположение установки JDK. - Установите переменную среды
ANDROID_HOMEв расположение установки Android SDK. - Рекомендуется также добавить каталоги
tools,tools/binиplatform-toolsAndroid SDK в вашу переменнуюPATH
OS X и Linux
На Mac или Linux вы можете использовать текстовый редактор для создания или изменения файла ~/.bash_profile. Для настройки переменной среды добавьте строку, использующую export, как показано ниже (замените путь на ваш локальный путь установки):
export ANDROID_HOME=/Development/android-sdk/
Для обновления вашей переменной PATH добавьте строку, подобную следующей (замените пути на расположение вашей локальной установки Android SDK):
export PATH=${PATH}:/Development/android-sdk/platform-tools:/Development/android-sdk/tools
Перезагрузите терминал, чтобы увидеть изменения, или выполните следующую команду:
$ source ~/.bash_profile
Windows
Эти шаги могут отличаться в зависимости от установленной версии Windows. Закройте и снова откройте все окна командной строки после внесения изменений, чтобы увидеть их отражение.
Щелкните Пуск в левом нижнем углу рабочего стола
В строке поиска введите Переменные среды и выберите Изменить системные переменные среды из появившихся вариантов
В открывшемся окне нажмите кнопку Переменные среды
Для создания новой переменной среды:
- Нажмите Создать... и введите имя и значение переменной.
Для установки вашей переменной PATH:
Выберите переменную PATH и нажмите Изменить.
-
Добавьте записи для соответствующих расположений в PATH. Например (замените пути на расположение вашей локальной установки Android SDK):
C:\Users\[your user]\AppData\Local\Android\Sdk\platform-tools C:\Users\[your user]\AppData\Local\Android\Sdk\tools
Настройка проекта
Настройка эмулятора
Если вы хотите запустить ваше приложение Cordova в эмуляторе Android, сначала необходимо создать виртуальное устройство Android (AVD). См. документацию Android по управлению AVD, настройке эмулятора и настройке аппаратного ускорения.
После правильной настройки вашего AVD вы сможете развернуть ваше приложение Cordova в эмуляторе, выполнив:
$ cordova run --emulator
Настройка Gradle
Начиная с cordova-android@4.0.0, проекты Cordova для Android строятся с использованием Gradle. Инструкции по сборке с использованием Ant см. в более ранних версиях документации. Обратите внимание, что сборка с использованием Ant устарела начиная с Android SDK Tools 25.3.0.
Настройка свойств Gradle
Можно настроить сборку Gradle, задавая значения определенных свойств Gradle, которые предоставляет Cordova. Доступны следующие свойства:
| Свойство | Описание |
|---|---|
cdvBuildMultipleApks | Если это свойство установлено, будут сгенерированы несколько файлов APK: по одному на каждую поддерживаемую платформу проекта (x86, ARM и т. д.). Это может быть важно, если ваш проект использует большие нативные библиотеки, что может значительно увеличить размер сгенерированного APK. Если не установлено, будет сгенерирован один APK, который можно использовать на всех устройствах |
cdvVersionCode | Переопределяет значение versionCode, заданное в AndroidManifest.xml |
cdvReleaseSigningPropertiesFile |
По умолчанию: release-signing.propertiesПуть к файлу .properties, содержащему информацию о подписи для релизных сборок (см. Подпись приложения) |
cdvDebugSigningPropertiesFile |
По умолчанию: debug-signing.propertiesПуть к файлу .properties, содержащему информацию о подписи для отладочных сборок (см. Подпись приложения). Полезно при совместном использовании ключа подписи с другими разработчиками |
cdvMinSdkVersion | Переопределяет значение minSdkVersion, установленное в AndroidManifest.xml. Полезно при создании нескольких APK на основе версии SDK |
cdvBuildToolsVersion | Переопределяет автоматически обнаруженное значение android.buildToolsVersion |
cdvCompileSdkVersion | Переопределяет автоматически обнаруженное значение android.compileSdkVersion |
Вы можете установить эти свойства четырьмя способами:
-
Установив переменные среды, например:
$ export ORG_GRADLE_PROJECT_cdvMinSdkVersion=20 $ cordova build android
-
Используя флаг
--gradleArgв ваших командах Cordovabuildилиrun:$ cordova run android -- --gradleArg=-PcdvMinSdkVersion=20
-
Поместив файл, названный
gradle.propertiesв папку вашей платформы Android (<your-project>/platforms/android) и установив свойства в нем, как показано:# In <your-project>/platforms/android/gradle.properties cdvMinSdkVersion=20
-
Расширив
build.gradleс помощью файлаbuild-extras.gradleи установив свойство, как показано:// In <your-project>/platforms/android/build-extras.gradle ext.cdvMinSdkVersion = 20
Два последних варианта предполагают добавление дополнительного файла в папку вашей платформы Android. Как правило, не рекомендуется редактировать содержимое этой папки, так как эти изменения легко потеряются или перезапишутся. Вместо этого эти два файла должны быть скопированы из другого местоположения в эту папку как часть команды сборки с помощью before_build запускаемого скрипта.
Расширение build.gradle
Если вам нужно настроить build.gradle, вместо прямого редактирования, вы должны создать файл с именем build-extras.gradle. Этот файл будет подключаться к основному файлу build.gradle при наличии. Этот файл должен быть размещен в каталоге платформы Android (<your-project>/platforms/android), поэтому рекомендуется скопировать его с помощью скрипта, прикрепленного к before_build запускаемому скрипту.
Вот пример:
// Example build-extras.gradle
// This file is included at the beginning of `build.gradle`
ext.cdvDebugSigningPropertiesFile = '../../android-debug-keys.properties'
// When set, this function allows code to run at the end of `build.gradle`
ext.postBuildExtras = {
android.buildTypes.debug.applicationIdSuffix = '.debug'
}
Обратите внимание, что плагины также могут включать файлы build-extras.gradle с помощью:
<framework src="some.gradle" custom="true" type="gradleReference" />
Установка номера версии
Для изменения кода версии создаваемого apk вашего приложения, задайте атрибут android-versionCode в элементе виджета файла конфигурации вашего приложения config.xml. Если атрибут android-versionCode не задан, код версии будет определён с помощью атрибута version. Например, если версия равна MAJOR.MINOR.PATCH:
versionCode = MAJOR * 10000 + MINOR * 100 + PATCH
Если в вашем приложении включена свойство Gradle cdvBuildMultipleApks (см. Настройка свойств Gradle), код версии вашего приложения также будет умножен на 10, чтобы последняя цифра кода могла использоваться для обозначения архитектуры, для которой был собран apk. Это умножение произойдёт независимо от того, взят ли код версии из атрибута android-versionCode или сгенерирован с помощью version. Имейте в виду, что некоторые плагины, добавленные в ваш проект (включая cordova-plugin-crosswalk-webview), могут автоматически устанавливать это свойство Gradle.
Примечание: При обновлении свойства android-versionCode не рекомендуется увеличивать код версии, взятый из собранных apk. Вместо этого вы должны увеличивать код на основе значения в атрибуте config.xml файла android-versionCode. Это связано с тем, что свойство cdvBuildMultipleApks вызывает умножение кода версии на 10 в собранных apk, и поэтому использование этого значения приведёт к тому, что следующий код версии будет в 100 раз больше исходного и т. д.
Подписание приложения
Сначала вы должны ознакомиться с требованиями к подписи приложений Android.
Использование флагов
Для подписи приложения необходимы следующие параметры:
| Параметр | Флаг | Описание |
|---|---|---|
| Хранилище ключей | --keystore | Путь к двоичному файлу, который может хранить набор ключей |
| Пароль хранилища ключей | --storePassword | Пароль к хранилищу ключей |
| Псевдоним | --alias | Идентификатор, определяющий закрытый ключ, используемый для подписи |
| Пароль | --password | Пароль для указанного закрытого ключа |
| Тип хранилища ключей | --keystoreType |
По умолчанию: автоматическое определение на основе расширения файла Либо pkcs12, либо jks |
Эти параметры можно указать с помощью аргументов командной строки выше для команд Cordova CLI build или run.
Примечание: Вы должны использовать двойные --, чтобы указать, что это платформенно-специфические аргументы, например:
cordova run android --release -- --keystore=../my-release-key.keystore --storePassword=password --alias=alias_name --password=password.
Использование build.json
В качестве альтернативы вы можете указать их в файле конфигурации сборки (build.json) с помощью аргумента --buildConfig к тем же командам. Вот пример файла конфигурации сборки:
{
"android": {
"debug": {
"keystore": "../android.keystore",
"storePassword": "android",
"alias": "mykey1",
"password" : "password",
"keystoreType": ""
},
"release": {
"keystore": "../android.keystore",
"storePassword": "",
"alias": "mykey2",
"password" : "password",
"keystoreType": ""
}
}
}
Для подписи релизной версии пароли могут быть исключены, и система сборки запросит пароль.
Также поддерживается смешанное использование аргументов командной строки и параметров в build.json. Значения из аргументов командной строки будут иметь приоритет. Это может быть полезно для указания паролей в командной строке.
Использование Gradle
Вы также можете указать свойства подписи, включив файл .properties и указав на него с помощью свойств Gradle cdvReleaseSigningPropertiesFile и cdvDebugSigningPropertiesFile (см. Настройка свойств Gradle). Файл должен выглядеть следующим образом:
storeFile=relative/path/to/keystore.p12 storePassword=SECRET1 storeType=pkcs12 keyAlias=DebugSigningKey keyPassword=SECRET2
storePassword и keyPassword необязательны и будут запрошены, если опушены.
Отладка
Подробную информацию об инструментах отладки, входящих в состав Android SDK, см. в документации разработчика Android по отладке. Кроме того, в документации разработчика Android по отладке веб-приложений приводится введение по отладке части вашего приложения, выполняемой в Webview.
Открытие проекта в Android Studio
Проекты Cordova для Android можно открыть в Android IDE, Android Studio. Это может быть полезно, если вы хотите использовать встроенные инструменты отладки/профилирования Android Studio или разрабатываете плагины Android. Обратите внимание, что при открытии вашего проекта в Android Studio рекомендуется НЕ редактировать код в IDE. Это изменит код в папке platforms вашего проекта (а не www), и изменения могут быть перезаписаны. Вместо этого редактируйте папку www и скопируйте изменения, выполнив cordova build.
Разработчикам плагинов, желающим редактировать свой нативный код в IDE, следует использовать флаг --link при добавлении своего плагина в проект через cordova plugin add. Это свяжет файлы таким образом, что изменения в файлах плагина в папке platforms будут отражаться в папке исходного кода вашего плагина (и наоборот).
Чтобы открыть проект Cordova для Android в Android Studio:
Запустите Android Studio.
-
Выберите Импортировать проект (Eclipse ADT, Gradle и т. д.).
-
Выберите каталог платформы Android в вашем проекте (
<your-project>/platforms/android). На вопрос
Gradle Syncможно просто ответить Да.
После завершения импорта вы сможете собирать и запускать приложение непосредственно из Android Studio. Подробнее см. Обзор Android Studio и Сборка и запуск из Android Studio.
Построение рабочей среды на основе платформы
cordova-android включает ряд сценариев, которые позволяют использовать платформу без полного Cordova CLI. Этот путь разработки может предложить вам больший выбор вариантов развития в определённых ситуациях, чем кроссплатформенный cordova CLI. Например, вам необходимо использовать инструменты оболочки при развертывании пользовательского Cordova WebView вместе с нативными компонентами. Прежде чем использовать этот путь разработки, вы всё равно должны настроить среду Android SDK, как описано в Требованиях и поддержке выше.
Для каждого из описанных ниже сценариев обратитесь к Справочнику Cordova CLI за дополнительной информацией об их аргументах и использовании. Каждый сценарий имеет имя, соответствующее команде CLI. Например, cordova-android/bin/create эквивалентно команде cordova create.
Чтобы начать работу, загрузите пакет cordova-android из npm или Github.
Чтобы создать проект с помощью этого пакета, выполните сценарий create в папке bin:
$ cordova-android/bin/create
Созданный проект будет иметь папку под названием cordova внутри неё, которая содержит скрипты для команд Cordova, специфичных для проекта (например, run, build и т. д.). Кроме того, проект будет иметь структуру, отличающуюся от структуры обычного проекта Cordova. Отмечается, что /www перемещён в /assets/www.
Чтобы установить плагины в этом проекте, используйте утилиту Cordova Plugman.
Обновление
См. статью здесь для получения инструкций по обновлению вашей версии cordova-android.
Руководство по жизненному циклу
Cordova и Android
Приложения Android, как правило, состоят из серии активностей, с которыми взаимодействует пользователь. Активности можно рассматривать как отдельные экраны, составляющие приложение; различные задачи в приложении часто имеют свою собственную активность. Каждая активность имеет свой собственный жизненный цикл, который поддерживается при переходе активности в фоновый и из фонового режима устройства пользователя.
В отличие от этого, приложения Cordova на платформе Android выполняются внутри Webview, встроенного в единую активность Android. Жизненный цикл этой активности доступен вашему приложению через события документа, которые генерируются. События не гарантируют соответствие жизненному циклу Android, но они могут служить ориентиром для сохранения и восстановления состояния. Эти события приблизительно соответствуют вызовам Android следующим образом:
| Событие Cordova | Приблизительный аналог Android | Значение |
|---|---|---|
deviceready | onCreate() | Приложение запускается (не из фонового режима) |
pause | onPause() | Приложение переходит в фоновый режим |
resume | onResume() | Приложение возвращается в фоновый режим |
Большинство других платформ Cordova имеют аналогичную концепцию жизненных циклов и должны генерировать те же события, когда происходят аналогичные действия на устройстве пользователя. Однако Android представляет некоторые уникальные проблемы, которые иногда проявляются благодаря нативному жизненному циклу активности.
Что отличает Android?
В Android операционная система может выбрать уничтожение активности в фоновом режиме, чтобы освободить ресурсы, если на устройстве мало памяти. К сожалению, когда активность, содержащая ваше приложение, уничтожается, Webview, в котором живёт ваше приложение, также будет уничтожен. Любое состояние, которое ваше приложение поддерживает, будет в этом случае потеряно. Когда пользователь возвращается к вашему приложению, активность и Webview будут пересозданы операционной системой, но состояние не будет автоматически восстановлено для вашего приложения Cordova. По этой причине крайне важно, чтобы ваше приложение было осведомлено о событиях жизненного цикла, которые генерируются, и поддерживало любое необходимое состояние, чтобы убедиться, что контекст пользователя в вашем приложении не потерян, когда он покидает приложение.
Когда это может произойти?
Ваше приложение уязвимо для уничтожения операционной системой всякий раз, когда оно покидает поле зрения пользователя. Есть две основные ситуации, в которых это может произойти. Первый и наиболее очевидный случай — когда пользователь нажимает кнопку «Домой» или переключается на другое приложение.
END_OF_DOCUMENT_MARKERОднако существует второй (и гораздо более тонкий) случай, который могут вводить некоторые плагины. Как отмечалось выше, приложения Cordova обычно ограничены единственной активностью, содержащей Webview. Однако существуют случаи, когда другие активности могут быть запущены плагинами и временно вывести активность Cordova в фоновый режим. Эти другие активности обычно запускаются для выполнения конкретной задачи с помощью нативного приложения, установленного на устройстве. Например, плагин камеры Cordova запускает любую нативно установленную активность камеры на устройстве для того, чтобы сделать снимок. Повторное использование установленного приложения камеры таким образом заставляет ваше приложение чувствовать себя гораздо более похожим на нативное приложение, когда пользователь пытается сделать снимок. К сожалению, когда нативная активность выводит ваше приложение в фоновый режим, существует вероятность того, что ОС его уничтожит.
Для более четкого понимания этого второго случая давайте рассмотрим пример с использованием плагина камеры. Представьте, что у вас есть приложение, которое требует от пользователя сделать фото профиля. Поток событий в приложении, когда все происходит как запланировано, будет выглядеть примерно так:
- Пользователь взаимодействует с вашим приложением и должен сделать снимок
- Плагин камеры запускает нативную активность камеры
- Активность Cordova выводится в фоновый режим (срабатывает событие паузы)
- Пользователь делает снимок
- Активность камеры завершается
- Активность Cordova перемещается на передний план (срабатывает событие возобновления)
- Пользователь возвращается в ваше приложение, откуда он ушел
Однако этот поток событий может быть нарушен, если на устройстве мало памяти. Если ОС уничтожит активность, последовательность событий вместо этого разворачивается следующим образом:
- Пользователь взаимодействует с вашим приложением и должен сделать снимок
- Плагин камеры запускает нативную активность камеры
- ОС уничтожает активность Cordova (срабатывает событие паузы)
- Пользователь делает снимок
- Активность камеры завершается
- ОС повторно создаёт активность Cordova (срабатывают события deviceready и возобновления)
- Пользователь недоумевает, почему он внезапно вернулся на экран входа в ваше приложение
В этом случае ОС уничтожила приложение в фоновом режиме, и приложение не сохранило свое состояние в рамках жизненного цикла. Когда пользователь вернулся в приложение, Webview был пересоздан, и приложение, казалось, перезапустилось с нуля (отсюда и замешательство пользователя). Эта последовательность событий эквивалентна тому, что происходит при нажатии кнопки «Домой» или переключении пользователем приложений. Ключ к предотвращению вышеописанного опыта заключается в подписке на события и надлежащем поддержании состояния в рамках жизненного цикла активности.
Уважение жизненного цикла
В примерах выше отмечены события javascript, которые генерируются. Эти события предоставляют возможность сохранить и восстановить состояние вашего приложения. Вы должны зарегистрировать обработчики в функции bindEvents вашего приложения, которые реагируют на события жизненного цикла, сохраняя состояние. Какая информация сохраняется и как она сохраняется, зависит от вас, но вы должны убедиться, что сохранено достаточно информации, чтобы вы могли вернуть пользователя точно в то место, где он остановился, когда он вернется в ваше приложение.
В приведенном выше примере существует один дополнительный фактор, который применим только ко второму обсуждаемому случаю (то есть, когда плагин запускает внешнюю активность). Состояние приложения было утеряно не только при завершении пользователем съемки, но и само фото, сделанное пользователем. Обычно это фото доставляется вашему приложению через обработчик, зарегистрированный в плагине камеры. Однако при уничтожении Webview этот обработчик был навсегда утерян. К счастью, cordova-android 5.1.0 и выше предоставляют средство получения результата вызова плагина при возобновлении работы вашего приложения.
Получение результатов обратного вызова плагина (cordova-android 5.1.0+)
Когда ОС уничтожает активность Cordova, которая была выведена в фоновый режим плагином, любые ожидающие обратные вызовы также теряются. Это означает, что если вы передали обратный вызов плагину, который запустил новую активность (например, плагину камеры), этот обратный вызов НЕ будет вызван при повторном создании приложения. Однако начиная с cordova-android 5.1.0, полезная нагрузка события resume будет содержать любые ожидающие результаты плагина от запроса плагина, который запустил внешнюю активность, произведенный до уничтожения активности.
Поленая нагрузка события resume имеет следующий формат:
{
action: "resume",
pendingResult: {
pluginServiceName: string,
pluginStatus: string,
result: any
}
}
Поля этой полезной нагрузки определены следующим образом:
-
pluginServiceName: имя плагина, возвращающего результат (например, "Camera"). Это можно найти в теге<name>файла plugin.xml плагина -
pluginStatus: состояние вызова плагина (см. ниже) -
result: результат вызова плагина
Возможные значения для pluginStatus в поле pendingResult включают следующие:
-
"OK"— вызов плагина выполнен успешно -
"No Result"— вызов плагина завершился без результата -
"Error"— вызов плагина завершился с общей ошибкой - Другие различные ошибки
"Class not found""Illegal access""Instantiation error""Malformed url""IO error""Invalid action""JSON error"
Обратите внимание, что решение о том, что содержится в поле result, и смысл возвращаемого pluginStatus зависит от плагина. Обратитесь к API используемого плагина, чтобы узнать, что вы ожидаете найти в этих полях и как использовать их значения.
Пример
Ниже представлен краткий пример приложения, использующего события resume и pause для управления состоянием. В качестве примера используется плагин камеры Apache, демонстрирующий, как извлечь результаты вызова плагина из полезной нагрузки события resume. Часть кода, относящаяся к объекту resume's event.pendingResult, требует cordova-android 5.1.0+
// This state represents the state of our application and will be saved and
// restored by onResume() and onPause()
var appState = {
takingPicture: true,
imageUri: ""
};
var APP_STORAGE_KEY = "exampleAppState";
var app = {
initialize: function() {
this.bindEvents();
},
bindEvents: function() {
// Here we register our callbacks for the lifecycle events we care about
document.addEventListener('deviceready', this.onDeviceReady, false);
document.addEventListener('pause', this.onPause, false);
document.addEventListener('resume', this.onResume, false);
},
onDeviceReady: function() {
document.getElementById("take-picture-button").addEventListener("click", function() {
// Because the camera plugin method launches an external Activity,
// there is a chance that our application will be killed before the
// success or failure callbacks are called. See onPause() and
// onResume() where we save and restore our state to handle this case
appState.takingPicture = true;
navigator.camera.getPicture(cameraSuccessCallback, cameraFailureCallback,
{
sourceType: Camera.PictureSourceType.CAMERA,
destinationType: Camera.DestinationType.FILE_URI,
targetWidth: 250,
targetHeight: 250
}
);
});
},
onPause: function() {
// Here, we check to see if we are in the middle of taking a picture. If
// so, we want to save our state so that we can properly retrieve the
// plugin result in onResume(). We also save if we have already fetched
// an image URI
if(appState.takingPicture || appState.imageUri) {
window.localStorage.setItem(APP_STORAGE_KEY, JSON.stringify(appState));
}
},
onResume: function(event) {
// Here we check for stored state and restore it if necessary. In your
// application, it's up to you to keep track of where any pending plugin
// results are coming from (i.e. what part of your code made the call)
// and what arguments you provided to the plugin if relevant
var storedState = window.localStorage.getItem(APP_STORAGE_KEY);
if(storedState) {
appState = JSON.parse(storedState);
}
// Check to see if we need to restore an image we took
if(!appState.takingPicture && appState.imageUri) {
document.getElementById("get-picture-result").src = appState.imageUri;
}
// Now we can check if there is a plugin result in the event object.
// This requires cordova-android 5.1.0+
else if(appState.takingPicture && event.pendingResult) {
// Figure out whether or not the plugin call was successful and call
// the relevant callback. For the camera plugin, "OK" means a
// successful result and all other statuses mean error
if(event.pendingResult.pluginStatus === "OK") {
// The camera plugin places the same result in the resume object
// as it passes to the success callback passed to getPicture(),
// thus we can pass it to the same callback. Other plugins may
// return something else. Consult the documentation for
// whatever plugin you are using to learn how to interpret the
// result field
cameraSuccessCallback(event.pendingResult.result);
} else {
cameraFailureCallback(event.pendingResult.result);
}
}
}
}
// Here are the callbacks we pass to getPicture()
function cameraSuccessCallback(imageUri) {
appState.takingPicture = false;
appState.imageUri = imageUri;
document.getElementById("get-picture-result").src = imageUri;
}
function cameraFailureCallback(error) {
appState.takingPicture = false;
console.log(error);
}
app.initialize();
Соответствующий html:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">
<meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
<link rel="stylesheet" type="text/css" href="css/index.css">
<title>Cordova Android Lifecycle Example</title>
</head>
<body>
<div class="app">
<div>
<img id="get-picture-result" />
</div>
<Button id="take-picture-button">Take Picture</button>
</div>
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/index.js"></script>
</body>
</html>
Тестирование жизненного цикла активности
Android предоставляет настройку разработчика для тестирования уничтожения активности при низком объеме памяти. Включите настройку «Не сохранять активности» в меню «Параметры разработчика» на вашем устройстве или эмуляторе, чтобы смоделировать ситуации с низким объемом памяти. Вы всегда должны проводить определенное тестирование с этой настройкой, включенной, чтобы убедиться, что ваше приложение должным образом сохраняет состояние.
© 2012, 2013, 2015 The Apache Software Foundation
Licensed under the Apache License 2.0.
https://cordova.apache.org/docs/en/8.x/guide/platforms/android/index.html