在安卓系统中混合使用Cordova和本地活动

16

我希望我的应用程序的大部分内容(如列表项、存储、登录、关于屏幕等)都由cordova处理,因为使用原生工作流程会非常痛苦。

但是我有一个特定的活动(我已经创建了),无法使用cordova完成(至少不能很好地而且快速地完成)。

  • 我是否应该创建一个只加载这两个活动的cordova插件?
  • 我应该通过cli生成cordova应用程序还是将cordova嵌入一个活动中?

如果有更多相关材料,我很想了解。

提前感谢。

1个回答

13

这取决于您创建的活动类型。

如果您的主要活动是 Cordova 屏幕,并且将成为全屏状态,且 Cordova 部分的某些操作将启动您的本地活动以完成某项任务,则应使用插件来启动该活动,并在完成任务后关闭它并返回值,然后回到 Cordova 活动。

如果您想将 Cordova 视图与原生视图混合,而且它们都不是全屏状态,则应选择将 Cordova 嵌入到原生项目中。

如果您的活动将成为主要活动,则嵌入 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的文件。

pluginName.js应该是这样的:

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

第一个参数是成功回调函数,当插件执行完成后调用。 第二个参数是错误回调函数,如果插件出现任何问题将会调用该函数。 第三个参数是要调用的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 是否与启动意图时使用的代码匹配,以及活动结果等。


1
相机插件启动一个意图 https://github.com/apache/cordova-plugin-camera,inAppBrowser插件也是如此 https://github.com/apache/cordova-plugin-inappbrowser,条形码扫描器插件也是如此 https://github.com/phonegap/phonegap-plugin-barcodescanner。关于嵌入Cordova webview,我没有示例,而且Cordova网站上的指南已经过时了。 - jcesarmobile
1
我的意思是添加类似于:[cordova按钮打开本地意图] -> [本地代码]+文件的应用程序结构。而且链接可能有一天会404错误。 - funerr
其中两个链接是官方插件,如果它们消失了,那是因为Cordova已经过时了,这些问题也就没有意义了。不过我还是会添加一些简单的示例。 - jcesarmobile
不要忘记将活动添加到AndroidManifest.xml文件中:https://github.com/phonegap/phonegap-plugin-barcodescanner/blob/c5dbca2770d7c0f22ccb23473cd38c5fad8f8fa9/plugin.xml#L36 - Der_Meister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接