Spec-Zone.ru › Cordova 9

Руководство по платформе 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 28. Поддерживаемые уровни API Android и версии Android для последних нескольких выпусков cordova-android можно найти в этой таблице:

Версия cordova-android Поддерживаемые уровни API Android Эквивалентная версия Android
8.X.X 19 - 28 4.4 - 9.0.0
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 по адресу, больше не поддерживаются 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 Developer, чтобы начать работу. При первом запуске Android Studio вы будете проинструктированы по установке Android SDK.

Добавление пакетов SDK

После установки Android SDK вам также необходимо установить пакеты для того уровня API, на который вы хотите ориентироваться. Рекомендуется установить самую последнюю версию SDK, которую поддерживает ваша версия cordova-android (см. Требования и поддержка).

Откройте Android SDK Manager (Tools > SDK Manager в Android Studio или sdkmanager в командной строке) и убедитесь, что установлены следующие пункты:

  1. Android Platform SDK для вашей целевой версии Android
  2. Android SDK build-tools версии 19.1.0 или выше
  3. Android Support Repository (находится на вкладке "SDK Tools")

См. документацию Android по установке пакетов SDK для получения дополнительной информации.

Настройка переменных среды

Инструменты Cordova CLI требуют настройки некоторых переменных среды для правильной работы. CLI попытается установить эти переменные за вас, но в некоторых случаях вам может потребоваться установить их вручную. Следующие переменные должны быть обновлены:

  1. Установите переменную среды JAVA_HOME на расположение вашей установки JDK
  2. Установите переменную среды ANDROID_HOME на расположение вашей установки Android SDK
  3. Также рекомендуется добавить каталоги tools, tools/bin, и platform-tools Android SDK в ваш PATH

OS X и Linux

В macOS или 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. Закройте и снова откройте любые окна командной строки после внесения изменений, чтобы увидеть их отражение.

  1. Нажмите на меню Пуск в левом нижнем углу рабочего стола

  2. В строке поиска найдите Переменные среды и выберите Изменить переменные среды системы из появившихся опций

  3. В появившемся окне нажмите кнопку Переменные среды

Для создания новой переменной среды:
  1. Нажмите Создать... и введите имя и значение переменной
Для настройки PATH:
  1. Выберите переменную PATH и нажмите Изменить.

  2. Добавьте записи для соответствующих расположений в 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

Вы можете установить эти свойства четырьмя способами:

  1. Установив переменные среды, как показано ниже:

    $ export ORG_GRADLE_PROJECT_cdvMinSdkVersion=20
    $ cordova build android
    
  2. Используя флаг --gradleArg в ваших командах Cordova build или run:

    $ cordova run android -- --gradleArg=-PcdvMinSdkVersion=20
    
  3. Поместив файл под названием gradle.properties в папку вашей платформы Android (<your-project>/platforms/android) и установив в нём свойства, как показано ниже:

    # In <your-project>/platforms/android/app/gradle.properties
    cdvMinSdkVersion=20
    
  4. Расширив build.gradle через файл build-extras.gradle и установив свойство, как показано ниже:

    // In <your-project>/platforms/android/app/build-extras.gradle
    ext.cdvMinSdkVersion = 20
    

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

Расширение build.gradle

Если вам нужно настроить build.gradle, вместо непосредственного редактирования, вы должны создать файл с именем build-extras.gradle. Этот файл будет включён основным файлом build.gradle при наличии. Этот файл должен быть помещён в папку app каталога платформы Android (<your-project>/platforms/android/app), поэтому рекомендуется копировать его через скрипт, прикреплённый к before_build гачку.

Вот пример:

// Example build-extras.gradle
// This file is included at the beginning of `build.gradle`

// special properties (see `build.gradle`) can be set and overwrite the defaults
ext.cdvDebugSigningPropertiesFile = '../../android-debug-keys.properties'

// normal `build.gradle` configuration can happen
android {
  defaultConfig {
    testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
  }
}
dependencies {
  androidTestImplementation 'com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
  }
}

// When set, this function `ext.postBuildExtras` 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-приложений Android app signing requirements.

Использование флагов

Для подписи приложения необходимы следующие параметры:

Параметр Флаг Описание
Хранилище ключей --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:

  1. Запустите Android Studio.

  2. Выберите Импорт проекта (Eclipse ADT, Gradle и т. д.).

  3. Выберите каталог платформы Android в вашем проекте (<your-project>/platforms/android).

  4. На вопрос Gradle Sync вы можете просто ответить Да.

После завершения импорта вы сможете скомпилировать и запустить приложение непосредственно из Android Studio. Дополнительные сведения см. в разделах Обзор Android Studio и Компиляция и запуск из Android Studio.

Центрированный на платформе рабочий процесс

cordova-android включает ряд скриптов, которые позволяют использовать платформу без полного Cordova CLI. Этот путь развития может предложить вам больший набор вариантов разработки в определенных ситуациях, чем кроссплатформенный cordova CLI. Например, вам необходимо использовать утилиты оболочки при развертывании пользовательского WebView Cordova вместе с нативными компонентами. Прежде чем использовать этот путь развития, вы должны настроить среду 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.

Обновление

Обратитесь к статье this для получения инструкций по обновлению вашей версии 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 camera plugin запускает любую нативно установленную на устройстве активность камеры для того, чтобы сделать фотографию. Использование установленного приложения камеры таким образом делает ваше приложение гораздо более похожим на нативное приложение, когда пользователь пытается сделать фотографию. К сожалению, когда нативная активность переводит ваше приложение в фоновый режим, существует вероятность, что ОС его уничтожит.

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

  1. Пользователь взаимодействует с вашим приложением и нуждается в том, чтобы сделать фотографию
  2. Плагин камеры запускает нативную активность камеры
    • Активность Cordova переходит в фоновый режим (срабатывает событие паузы)
  3. Пользователь делает фотографию
  4. Активность камеры завершается
    • Активность Cordova переходит на передний план (срабатывает событие возобновления)
  5. Пользователь возвращается в ваше приложение, с которого он начал

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

  1. Пользователь взаимодействует с вашим приложением и нуждается в том, чтобы сделать фотографию
  2. Плагин камеры запускает нативную активность камеры
    • ОС уничтожает активность Cordova (срабатывает событие паузы)
  3. Пользователь делает фотографию
  4. Активность камеры завершается
    • ОС воссоздаёт активность Cordova (срабатывают события deviceready и возобновления)
  5. Пользователь сбит с толку, почему он внезапно вернулся на экран входа в ваше приложение

В этом случае ОС уничтожила приложение в фоновом режиме, и приложение не сохранило свое состояние в рамках жизненного цикла. Когда пользователь вернулся в приложение, 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: имя плагина, возвращающего результат (например, «Камера»). Это можно найти в теге <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 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/9.x/guide/platforms/android/index.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API