Cordovaプラグイン開発(1)-Alndroidプラグイン開発詳細


この記事では、Android Cordovaプラグインの実践プロセスについて説明します.具体的な実装には、次の5つの側面があります.
1、オリジナルカスタムプラグインクラスを実現する;
2,Cordovaプラグインを配置する;
3、Cordovaプラグインを登録する.
4 Cordovaプラグインの呼び出し方法を定義する.
5,Cordovaプラグインを呼び出す;
この記事では、Android Toastプラグインの実装プロセスを例に挙げます.本題に入る.
一、準備
Androidプラットフォームを追加したCordovaプロジェクトを準備する必要があります.プラグインはこれに基づいています.ここではCordovaプロジェクトの作成方法やAndoidプラットフォームの追加方法は書かれていません.これらは最も基本的なことです.
二、具体的な実現
実践プロセスには、カスタムプラグインクラスの実装、Cordovaプラグインの構成、Cordovaプラグインの登録、Cordovaプラグインの呼び出し方法の定義、およびCordovaプラグインの呼び出しが含まれます.以下、それぞれ説明します.
1,カスタムプラグインクラスToastDemoを実現する.java
プロジェクト名/platforms/android/srcディレクトリの下にパッケージを新規作成し、そのパッケージの下にカスタムプラグインクラスを新規作成し、CordovaPlugin(カスタムプラグインはこのクラスを継承する必要がある)に継承し、executeメソッドを書き換え、executeメソッドで自分の望む機能ロジックを実現すればよい.このdemoを例にとると、私は工事名/platforms/android/srcディレクトリの下で建てたfxpです.cordova.pluginsパッケージを新規作成します.JAvaクラスですので、このdemoのプラグインクラスパスは、エンジニアリング名/platforms/android/src/fxp/cordova/plugins/toastDemoです.java.あまり説明しないで、直接コードを貼って、コードの中に注釈があります:
package fxp.cordova.plugins;

import android.widget.Toast;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaArgs;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONException;

import java.util.Random;

/**
 * Created by fxp on 2017/4/14.
 */

public class ToastDemo extends CordovaPlugin {

    /**
     * @param action          The action to execute.
     * @param args            The exec() arguments, wrapped with some Cordova helpers.
     * @param callbackContext The callback context used when calling back into JavaScript.
     * @return
     * @throws JSONException
     */
    @Override
    public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext) throws JSONException {

        if ("toast".equals(action)) {
            String str = args.getString(0);
            Toast.makeText(cordova.getActivity(), str, Toast.LENGTH_LONG).show();
            return true;
        } else if ("toastWithCallback".equals(action)) {
            String str = args.getString(0);
            Toast.makeText(cordova.getActivity(), str, Toast.LENGTH_LONG).show();
            //     /      ,    Random     ,    true     function, false     function,
            Random random = new Random();
            if (random.nextBoolean()) {
                callbackContext.success("execute_callack_success");
            } else {
                callbackContext.error("execute_callack_error");
            }
            return true;
        }
        return super.execute(action, args, callbackContext);
    }

}

カスタムプラグインクラスでは、次の2点を追加します.
  • args値取用方式
  • について
    a)jsがオブジェクト配列である場合、すなわち[{"key":"value","key":"value"}]は、以下のように用いられる.
    JSONArray jsonarr = new JSONArray(args.getString(0)); 
    JSONObject json = jsonarr.getJSONObject(0);
    String str = json.get("key");
    b)jsが通常の配列である場合、すなわち["a",10,true,...]は、以下のように用いられる.
    args.getString(0) 
    args.getInt(1) 
    args.getBoolean(2)
  • スレッド
  • について
    a)以上のexecuteメソッドは、WebViewインタフェースのメインスレッドではなく、WebCoreスレッドで実行される.
    b)ActivityでのUIスレッドを実行したい場合は、上記のexecuteメソッドは以下の表記を参照してください.
        @Override
        public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
            if ("toast".equals(action)) {
                final String str = args.getString(0);
                cordova.getActivity().runOnUiThread(new Runnable() {
                    public void run() {
                        //TODO
    
                        callbackContext.success(); // Thread-safe.                }
                });
                return true;
            }
            return super.execute(action, args, callbackContext);
        }

    c)UIスレッドで実行したくないし、WebCoreスレッドをブロックしたくない場合は、上記のexecuteメソッドは以下の書き方を参照してください.
        @Override
        public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
            if ("toast".equals(action)) {
                final String str = args.getString(0);
                cordova.getThreadPool().execute(new Runnable() {
                    public void run() {
                        //TODO
                        
                        callbackContext.success(); // Thread-safe.
                    }
                });
                return true;
            }
            return false;
        }

    2,config.xmlでのCordovaプラグインの構成
    プロジェクト名/platforms/android/res/xml/configを開く.xmlファイル、widgetノードの下に次のfeatureを追加します.
        
        
            
        

    その中で、featureのname値は比較的重要で、勝手に取ることができるが、後続は統一しなければならない.paramのname値は任意に記入でき、value値はプラグイン実装クラスの経路、すなわち「パッケージ名」である.【類名】.
    3 cordovaでplugins.jsにCordovaプラグインを登録する
    プロジェクト名/platforms/android/assets/www/cordovaを開くplugins.jsファイル、module.exports配列にカスタムプラグイン情報を追加します.このdemoではmoduleです.exports配列には、次の要素が追加されます.
    {
            "file": "plugins/fxp-cordova-plugins/www/ToastDemo.js",//js    
            "id": "fxp-cordova-plugins.ToastDemo",//  moduleid。  cordova.define      
            "clobbers": [
                "fxp"//js          
            ]
        }

    1つのpluginは、Android Studioにおけるprojectとmoduleの概念に類似する複数のmoduleを有することができ、ここでidはプラグインの現在のmoduleのidであり、命名規則は「プラグインid」である.【featureのname値】.プラグインidはkey値として「pluginId」を使用します.この例では、「pluginId」:「fxp-cordova-plugins」です.
    4,Cordovaプラグイン呼び出し方式の定義
    エンジニアリング名/platforms/android/assets/www/pluginsパスの下に自分のフォルダを作成し、自分のフォルダの下にwwwディレクトリを作成し、このwwwディレクトリの下にプラグインの使用方法を定義するjsファイルを作成します(プラグインの使用方法を定義するjsファイルをすべてこのwwwフォルダの下に置くことができます).これを例にとると、私が作成したTestDemoです.jsファイルのパスは、工事名/platforms/android/assets/www/plugins/fxp-cordova-plugins/www/TestDemo.js.プラグインには、通常、コールバックメソッドとコールバックなしメソッドの2つの使用形態があります.TestDemo.jsファイルの内容は以下の通りです.
    /**
    * cordova.define         cordova_plugins.js     id
    * exec      :
    *   1:    function
    *   2:    function
    *   3:feature name, config.xml      
    *   4:  java   action
    *   5:      ,json    
    *           ,         
    */
    cordova.define("fxp-cordova-plugins.ToastDemo",
        function(require, exports, module) {
    
            /*
             *      
            */
            var exec = require("cordova/exec");
            module.exports = {
                toast: function(content){
                    exec(null,null,"ToastDemo","toast",[content]);
                },
                toastWithCallback: function (content, successCallback, errorCallback) {
                    cordova.exec(successCallback, errorCallback, "ToastDemo", "toastWithCallback", [content]);
                }
            }
    
            /*
             *      
            */
    /*        var exec = require('cordova/exec');
            var FXP = function(){};
            FXP.prototype.toast=function(content) {
                exec(null, null, "ToastDemo", "toast", [content]);
            };
            FXP.prototype.toastWithCallback=function(content,success, error) {
                exec(success, error, "ToastDemo", "toastWithCallback", [content]);
            };
            var fxp = new FXP();
            module.exports = fxp;*/
    
            /*
             *      
            */
    /*        var exec = require('cordova/exec');
            exports.toast = function(content) {
                exec(null, null, "ToastDemo", "toast", [content]);
            };
            exports.toastWithCallback=function(content, successCallback, errorCallback){
                exec(successCallback,errorCallback,"ToastDemo","toastWithCallback",[content]);
            };*/
    });
    

    5,Cordovaプラグインを呼び出す
    以上の4ステップが完了すると、すべてが準備され、直接呼び出すことができます.呼び出し方法:
    [clobbers].[action]
    このdemoを例に挙げると、
            fxp.toast("toast");
    
            fxp.toastWithCallback("toastWithCallback",function(success){
                alert(success);
            },function(error){
                alert(error);
            });

    これで、games over!
    三、後ろに書く
    1,本文は簡単なtoastプラグインを実現し、プラグインの実践過程を述べることを意図している.
    2、したがってdemoの実践はすべて工事名/platforms/androidディレクトリの下にあるので、デバッグ時にcordova buildまたはcordova runコマンドを実行しないでください(このコマンドを実行すると、工事名/platforms/android/assets/wwwが置き換えられ、前に追加したコードが失われます).
    3、後で暇があれば、カスタムプラグインのインストール方法を説明するブログを書きます.
    4、足りないところは、批判と指摘を歓迎します.
    //**********************2018.6.28補足start*************************************/
    1、一年半ぶりにこのブログを振り返ると、正確に説明されていないものがあることに気づき、修正されました.お許しください.
    2,以上のカスタムプラグイン実装方式はCordova公式ドキュメント標準プロセスに従う.しかしcordovaソースコードをよく見ると、実際にはより簡単な実現方法があることがわかります.
    以上の手順の3、4は省略できますが、cordovaでは使用しません.plugins.jsに登録してもTestDemoと書く必要はありません.jsは呼び出し方法を提供し、直接次のように呼び出すことができます.
    Cordova.exec(successCallback,errorCallback,"ToastDemo","toast",[content]);
    

    /**********************2018.6.28 end*********************************************/