Смешивание кордовой и родной деятельности в Android

Я хочу, чтобы большинство моих приложений (элементы списка, хранилище, подпись, экраны и т.д.) обрабатывались в кордове, потому что это просто больно делать это в собственном рабочем процессе.

Но у меня есть конкретная деятельность (которую я уже создал), которая не может быть выполнена с кордорой (по крайней мере, не очень хорошо и достаточно быстро). Как мне создать это приложение?

  • AM Я должен создать плагин cordova, который будет загружать только эти два деятельность?
  • Должен ли я генерировать приложение cordova через cli или я должен вставить кордову в одну активность?

Если на этом материале больше материала, я бы с удовольствием услышал об этом.

Спасибо заранее.

Ответ 1

Это зависит от созданной вами активности.

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

Если вы хотите смешать представление Cordova с естественным видом, где ни один из них не является полноэкранным, тогда вы должны пойти для встраивания Кордовы в собственный проект.

Если ваша деятельность будет вашей основной деятельностью, тогда вложение Кордовы - ваш единственный вариант.

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

Плагину нужен файл plugin.xml, который выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
        id="your-plugin-id" version="1.0.0">
    <name>pluginName</name>
    <description>description of the plugin</description>
    <license>License of the plugin</license>
    <js-module src="www/pluginName.js" name="pluginName">
        <clobbers target="pluginName" />
    </js-module>
    <platform name="android">
        <config-file target="res/xml/config.xml" parent="/*">
            <feature name="PluginName" >
                <param name="android-package" value="your.plugin.package.pluginName"/>
            </feature>
        </config-file>

        <source-file src="src/android/PluginName.java" target-dir="your/plugin/package/PluginName" />
    </platform>
</plugin>

Посмотрев на него, вы также увидите, что вам нужна папка www с файлом pluginName.js и папка src/android с файлом pluginName.java на нем.

ПлагинName.js должен выглядеть примерно так:

function showNativeView() {
    cordova.exec(successCallback, errorCallback, "PluginName", "showNativeView", [arguments]);
}

Первый параметр - это функция successCallback для вызова, когда выполняется завершение плагина. Второй параметр - это функция errorCallback для вызова, если у плагина возникли проблемы Третий параметр - это имя класса java, который вы вызываете, он должен соответствовать таковому в файле plugin.xml Четвертый параметр - это действие для вызова класса java И пятый - это массив или аргументы, если вы хотите отправить их. Для его выполнения вызовите showNativeView() с помощью нажатия кнопки или, если хотите. Напоминание, это слишком упрощено, правильный способ сделать это должен создать пространство имен для плагина и добавить к нему различные функции, но я хочу, чтобы это было просто.

Наконец, PluginName.java должен выглядеть примерно так:

    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        if ("showNativeView".equals(action)) {
            Intent yourIntent = new Intent(this.cordova.getActivity().getBaseContext(), YourActivityToLaunch.class);
cordova.getActivity().startActivity(yourIntent);
            callbackContext.success();
            return true;
        }
        return false;  // Returning false results in a "MethodNotFound" error.
    }

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

this.cordova.startActivityForResult(this, yourIntent, REQUEST_CODE);

И добавьте

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    String result = intent.getStringExtra("WHATEVER_THE_INTENT_RETURNS"),
    this.callbackContext.success(result);
}

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