Android 外掛程式

此部分提供了如何在 Android 平臺上實現本機外掛程式代碼的詳細資訊。 之前讀這篇文章,請參閱應用程式外掛程式外掛程式的結構和其共同的 JavaScript 介面的概述。 這一節繼續表明通信從科爾多瓦 web 視圖的本機平臺和後面的示例回聲外掛程式。 另一個示例,請參閱還在CordovaPlugin.java的評論.

Android 外掛程式基於科爾多瓦-Android,Android 的 web 視圖包括與附加到它上面的鉤子。 外掛程式被表示為類映射的 config.xml 檔。 外掛程式包括至少一個擴展的 JAVA 類的 CordovaPlugin 類,重寫的一個其 execute 方法。 作為最佳實踐,該外掛程式還應處理 [pause](../../../cordova/events/events.pause.html)[resume](../../../cordova/events/events.resume.html) 事件,以及任何外掛程式之間傳遞的消息。 外掛程式需要長時間運行的請求,後臺活動媒體重播、 聽眾或內部狀態等應執行 onReset() ,以及方法。 它執行時 WebView 定位到新的一頁或刷新,重新載入 JavaScript。

外掛程式類映射

外掛程式的 JavaScript 介面使用 cordova.exec 方法,如下所示:

    exec (< successFunction > < failFunction >、 < 服務 >、 < 行動 > [< args >]) ;

這封送請求從 web 視圖到 Android 的本機對岸,有效地調用 action 方法 service 具有額外的參數中傳遞的類 args 陣列。

是否您分發外掛程式作為 JAVA 檔或作為它自己的一個jar檔,必須在科爾多瓦 Android 應用程式中指定外掛程式 res/xml/config.xml 檔。 有關如何使用的詳細資訊,請參閱應用程式外掛程式 plugin.xml 檔,把這個注射 feature 元素:

    <feature name="<service_name>">
        <param name="android-package" value="<full_name_including_namespace>" />
    </feature>

服務名稱匹配在 JavaScript 中使用 exec 調用。 值是 JAVA 類的完全限定命名空間識別碼。 否則為該外掛程式可能會編譯,但仍不能使用到科爾多瓦。

外掛程式初始化和存留期

外掛程式物件的一個實例創建為生活的每個 WebView 。 外掛程式不會具現化之前他們第一次引用通過調用從 JavaScript,除非 <param>onload name 屬性設置為 "true"config.xml 。 例如:

<feature name="Echo">
    <param name="android-package" value="<full_name_including_namespace>" />
    <param name="onload" value="true" />
</feature>

外掛程式應使用 initialize 方法為他們的創業邏輯。

@Override
public void initialize(CordovaInterface cordova, CordovaWebView webView) {
    super.initialize(cordova, webView);
    // your init code here
}

編寫一個 Android JAVA 外掛程式

JavaScript 調用觸發外掛程式請求到本機的一邊,和相應的 JAVA 外掛程式映射正確地在 config.xml 檔中,但最後的 Android JAVA 外掛程式類看起來不會像什麼? 無論派往與 JavaScript 的外掛程式 exec 函數傳遞到外掛程式類的 execute 方法。 大多數 execute 實現看起來像這樣:

    @Override 公共 boolean 類型的值執行 CallbackCoNtext callbackCoNtext JSONArray args 字串操作) 將引發 JSONException {如果 ("beep".equals(action)) {this.beep(args.getLong(0));callbackCoNtext.success() ;則返回 true ;} 返回 false ;/ / 返回 false 結果的"MethodNotFound"錯誤。
    }

JavaScript exec 函數的 action 參數對應于一個類的私有類方法派遣了可選參數。

當捕獲異常,並返回錯誤,重要的是為了明確起見,錯誤返回給 JavaScript 匹配 JAVA 異常名稱盡可能多。

執行緒

外掛程式的 JavaScript 並在主執行緒中運行 WebView 介面 ; 相反,它會運行 WebCore 執行緒,一樣 execute 方法。 如果您需要與使用者介面進行交互,則應使用以下變化:

    @Override
    public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
        if ("beep".equals(action)) {
            final long duration = args.getLong(0);
            cordova.getActivity().runOnUiThread(new Runnable() {
                public void run() {
                    ...
                    callbackContext.success(); // Thread-safe.
                }
            });
            return true;
        }
        return false;
    }

使用以下如果你不需要在主介面上運行的執行緒,但不是想阻止 WebCore 執行緒或者:

    @Override
    public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
        if ("beep".equals(action)) {
            final long duration = args.getLong(0);
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    ...
                    callbackContext.success(); // Thread-safe.
                }
            });
            return true;
        }
        return false;
    }

回聲 Android 外掛程式示例

若要匹配的 JavaScript 介面回波特徵描述的應用程式外掛程式,使用 plugin.xml 來注入 feature 到本地平臺規範 config.xml 檔:

    <platform name="android">
        <config-file target="config.xml" parent="/*">
            <feature name="Echo">
                <param name="android-package" value="org.apache.cordova.plugin.Echo"/>
            </feature>
        </config-file>
    </platform>

然後添加以下到 src/org/apache/cordova/plugin/Echo.java 檔:

    package org.apache.cordova.plugin;

    import org.apache.cordova.CordovaPlugin;
    import org.apache.cordova.CallbackContext;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    /**
     * This class echoes a string called from JavaScript.
     */
    public class Echo extends CordovaPlugin {

        @Override
        public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
            if (action.equals("echo")) {
                String message = args.getString(0);
                this.echo(message, callbackContext);
                return true;
            }
            return false;
        }

        private void echo(String message, CallbackContext callbackContext) {
            if (message != null && message.length() > 0) {
                callbackContext.success(message);
            } else {
                callbackContext.error("Expected one non-empty string argument.");
            }
        }
    }

必要的進口商品在檔的頂部延伸中的類 CordovaPlugin ,其 execute() 方法,它將覆蓋從其接收郵件 exec()execute()方法第一次測試的值 action ,在這種情況下有有效期的只有一個 echo 的值。 任何其他行動返回 false ,並導致 INVALID_ACTION 錯誤,會轉換為調用的 JavaScript 一邊錯誤回檔。

下一步,該方法檢索 echo 字串使用 args 物件的 getString 方法,指定的第一個參數傳遞給該方法。 值傳遞給一個私人後 echo 的方法,它是參數檢查,以確保它不是 null 或空字串,這種情況下的 callbackContext.error() 調用 JavaScript 的錯誤回檔。 如果通過各種檢查, callbackContext.success() 將傳遞原始 message 回 JavaScript 的成功回檔作為參數的字串。

Android 系統集成

Android 功能 Intent 允許進程互相溝通的系統。 外掛程式可以訪問 CordovaInterface 物件,可以訪問 Android Activity ,運行應用程式。 這是 Context 啟動新的 android 系統所需 IntentCordovaInterface允許外掛程式啟動 Activity 一個結果,並設置回檔外掛程式時 Intent 返回到應用程式。

到科爾多瓦 2.0 外掛程式可以不再直接存取 Context ,和遺產 ctx 成員已被否決。 所有 ctx 的方法上存在 Context ,所以這兩個 getContext()getActivity() 可以返回所需的物件。

調試 Android 外掛程式

Eclipse 允許您調試外掛程式作為 JAVA 原始程式碼包含在專案中。 只有最新版本的 Android 開發者工具允許您將原始程式碼附加到JAR的依賴關係,所以此功能尚不完全支援。