0

我为 Android 编写了一个 Cordova 插件来构建一个带有 HTML5 GUI 的 phonegap 应用程序。

我现在也想拥有一个原生界面,并且想知道将我的插件重用于原生 UI 的最佳选择是什么。基本上我想要两个应用程序,一个带有 phonegap (HTML5) 界面,一个带有原生 Android 界面,它们都使用 Cordova 插件。

该插件扩展了CordovaPlugin该类,因此我不知道如何在不从 javascript 中调用以下方法的情况下使用它WebView,如此处所述http://docs.phonegap.com/en/2.3.0/guide_plugin -development_android_index.md.html

exec(<successFunction>, <failFunction>, <service>, <action>, [<args>]);

我只想调用插件的本机端而不通过WebView

@Override
public boolean execute(String action, JSONArray args,
        CallbackContext callbackContext) throws JSONException { ... }

假设我可以相当轻松地调整插件中的代码,我想找到一种方法使插件保持完全相同,以便更好地解耦前端/后端(我可以在一个应用程序中更改代码而无需复制它在另一个应用程序中)。

这可能吗?我知道这不是拥有 Cordova 插件的重点,但我想找到一种解决方法。

谢谢。

4

1 回答 1

1

在我看来,您需要申请Facade pattern

http://en.wikipedia.org/wiki/Facade_pattern

只需将您的业务逻辑从 Cordova 插件提取到名为的专用类MyFacade并将所有业务逻辑隐藏在后面。

另一种方法是做这样的事情:

MyCordovaPlugin myPlugin = new MyCordovaPlugin();
myPlugin.execute("foo", new JSONArray(), new MyCallbackContext() {
    @override
    public void handlePluginResult(PluginResult pluginResult) {
        //your code for handling plugin result for Android UI
    }
}

实施在哪里MyCallbackContext

public abstract class MyCallbackContext extends CallbackContext {

    public MyCallbackContext() {
        super(null, null);
    }

    public void sendPluginResult(PluginResult pluginResult) {
        synchronized (this) {
            if (finished) {
                Log.w(LOG_TAG, "Attempted to send a second callback for ID: " + callbackId + "\nResult was: " + pluginResult.getMessage());
                return;
            } else {
                finished = !pluginResult.getKeepCallback();
            }
        }

        handlePluginResult(pluginResult);
    }

    public abstract void handlePluginResult(PluginResult pluginResult);

}

第二种方式仅适用于当前版本的 Cordova,并且基于以下源代码:

https://github.com/apache/cordova-android/blob/master/framework/src/org/apache/cordova/api/CordovaPlugin.java

https://github.com/apache/cordova-android/blob/master/framework/src/org/apache/cordova/api/CallbackContext.java

于 2013-03-08T13:30:39.623 回答