Cordova自定義插件實戰(zhàn)

Cordova自定義插件實戰(zhàn)#

使用前提

這篇文章是之前發(fā)表在CSDN上的,拿過來充數(shù)用的,其實那個時候也寫了不少,不過也就這篇能看的過去,其他一些都是知識總結(jié)性的。沒什么意思。

  1. 已經(jīng)能夠?qū)崿F(xiàn)原有插件的使用。
  2. 稍微熟悉JS語言(其實我也不會)
  3. 創(chuàng)建一個Cordova的Demo。

自定義插件實戰(zhàn)

準(zhǔn)備工具

  1. 用Cordova在Dos中創(chuàng)建一個Demo,之后將此Demo在Eclipse中引入,會發(fā)現(xiàn)多了兩個文件CordovaLib和MainActivity。
  2. 新建一個text的Android工程,將MainActivity中src目錄下的org.apache.cordova包,assets目錄下的www文件,和res目錄下的XML文件夾拷到新建text工程的相應(yīng)位置。
  3. 將Cordova作為text外部依賴庫。

Toast

先寫一個比較簡單的插件,方便大家了解這個插件化的編寫流程,只要把套路記住了,其他的都好弄。
先說一下在寫插件的過程中我們需要經(jīng)常接觸的四個文件。

  1. 插件的JAVA文件---位于src目錄下--自己寫
  2. 插件的JS文件---位于assets/www/plugins目錄下--自己寫
  3. Cordova_plugins.js---位于assets目錄下--插件的配置文件
  4. Config.xml---位于res/xml目錄下--添加配置

在自定義插件的過程中我們會經(jīng)常接觸的就是這四個文件,接下來就是套路了。

編寫Java文件:在src目錄下新建一個包,包名隨便起,我的是com.pactera.plugin,之后在里面新建一個Toast類。


    public class Toast extends CordovaPlugin{
    CallbackContext mCallbackContext;
    @Override
    public boolean execute(String action, JSONArray args,
            CallbackContext callbackContext) throws JSONException {
        // TODO Auto-generated method stub
        if("showToast".equals(action)){
        showToast(args.getString(0),args.getInt(1));
        }
        return true;
    }

    private void showToast(String text, int type) {
        android.widget.Toast.makeText(cordova.getActivity(), text, type).show();
    }
    }

首先繼承CordovaPlugin這個類之后重寫execute方法,三個參數(shù),action為html中調(diào)用的方法名,args為方法參數(shù),callbackContext為回調(diào),先不用管那個多,首先對action進(jìn)行判斷,如果action所對應(yīng)的方法名與我們定義的方法名相同的話就,就執(zhí)行彈出一個Toast的動作,在if(){}大括號中隨便寫,我只不過是為了方便就寫的與方法名相同,其實不用。關(guān)于返回值true的時候表示此插件可用,false為不可用,個人目前沒有感覺在實際中有什么應(yīng)用?,F(xiàn)在一個Toast插件的Java代碼就寫好了,唯一值得注意的就是if()括號中的方法名。

編寫JS文件
在assets/www/plugins目錄下新建一個文件夾,名字隨意起,我的是cordova-plugin-toast,之后在文件夾內(nèi)新建一個toast.js文件,代碼。

cordova.define("cordova-plugin-toast.toast", function(require, exports, module) {
var exec = require('cordova/exec');
module.exports ={
showToast:function (content,type) {
     exec(null, null, "Toasts", "showToast", [content,type]);
}
};
});

這是一個最精簡的一個JS文件,不過也囊括了一個插件的JS文件的必備要素。

  1. 第一行," cordova.define("cordova-plugin-toast.toast", function(require, exports, module) { " 這就是套路,不用想為什么這么寫,因為我也不知道,值得注意的就是在cordova.define()括號中添加的是插件js文件的文件夾名和js文件名。
  2. 第二行,第三行,抄過去進(jìn)行,必須寫。
  3. 第四行,其中showToast為我們自己定義的在html調(diào)用的方法名。冒號后面的function的括號中定義在html中調(diào)用本地Toast中需要的參數(shù),大括號中也是固定寫法 exec括號中有五個參數(shù),分別是:成功回調(diào),失敗回調(diào),feature name,方法名,參數(shù)。,其中feature name可能不知道是什么無所謂,先放著,方法名就是showToast,參數(shù)就是function中的參數(shù),同時也對應(yīng)著java代碼中JSONArray args。

配置cordova_plugins.js

在module.exports中添加

{
    "file": "plugins/cordova-plugin-toast/toast.js",
    "id": "cordova-plugin-toast.toast",
    "clobbers": [
          "navigator.webtoast"
    ]
}

把上面的復(fù)制粘貼一下,將file中的改為插件的JS文件路徑,id改為插件的文件夾名和文件名,對應(yīng)著JS文件中的Cordova.define括號中內(nèi)容,clobbers中內(nèi)容隨便寫,這個是html中調(diào)用方法時的調(diào)用頭部(先這么叫著吧,因為我也沒學(xué)過JS,不知道專業(yè)怎么叫),注意上下文的逗號。

在module.exports.metadata中添加

"cordova-plugin-toast":"1.0.0"

"文件夾名" :"版本號",版本號隨便寫,目前不知道在未來有什么作用,文件夾名就是JS文件的文件夾名,這個cordova_plugins也配合完成。

配置config.xml
在文件中適當(dāng)?shù)奈恢锰砑?/p>

   <feature name="Toasts">
 <param name="android-package" value="com.pactera.plugin.Toast" />
    </feature>

直接把其中的一個復(fù)制粘貼,feature name隨便寫,不過要與JS文件中的第三個參數(shù)保持一致,param name統(tǒng)一寫 android-package,value中則對應(yīng)的是JAVA文件的包名和類名。

套路

整體的編寫流程已經(jīng)介紹一遍了,其中比較重要的地方都加粗標(biāo)記了一下,不過這么看起來好像有點亂,而且也沒有體現(xiàn)出來套路是什么?,F(xiàn)在就把套路告訴大家,只要掌握這個基本的套路寫一個簡單的插件完全沒有問題。

  1. JAVA文件:"方法名".equals(action),做判斷。args中存放html給你的參數(shù)。
  2. JS文件:define("JS文件夾名.文件名"),方法名 :function(參數(shù)){exec(成功,失敗,"feature name","方法名",[參數(shù)])}
  3. cordova_plugins.js:file:"js文件的路徑",id:"JS文件夾名.文件名",clobbers:"方法調(diào)用頭",metadata中添加"JS文件夾名":"版本號"。
  4. config.xml:feature name="隨便寫",與JS文件中保持一致,value為"JAVA包名.類名"

在編寫的過程中一共就這四條,只要這四條中所對應(yīng)的內(nèi)容都匹配的上,那么這個插件就沒有問題。

驗證

這運(yùn)行之前還有兩點需要做,首先在新建的Android的項目中把MainActivity中的內(nèi)容進(jìn)行一點的更改,將MainActivity繼承自CordovaActivity,將onCreate修飾符改為public,去掉setContentview改為loadUrl("file:///android_asset/www/index.html");就是加載assets下index.xml文件,其次在index.xml文件中寫一個button,onclick方法名隨便寫,之后寫一個function方法。

function showToast(){
           navigator.webtoast.showToast("測試Toast成功",0);
        }

第一個showToast為button的onclick所對應(yīng)的方法名。大括號中的就是在cordova_plugins中定義的方法調(diào)用頭和在JS中定義的方法名,參數(shù)也隨便寫,不過要注意就是也JAVA中的參數(shù)相對應(yīng)。
看下效果。


可以看到這就是一個簡單的Toast插件效果,個人覺得按照套路把房子搭好,之后你愿意放什么就放什么。如果有不明白或者有有問題的可以留言。

Call&SmS

接下來如果你的Toast插件已經(jīng)編寫完成了,并且對于整個套路有了一定的熟悉,肯定想驗證一下自己學(xué)到的東西到底有沒有真正的掌握,那么來做個測試吧,嘗試編寫插件來實現(xiàn)html調(diào)用本地的電話和短信,套路都是一樣的主要差別就在JAVA代碼中,這也是編寫插件的最主要的地方,先看一下效果。


可以看出來效果還是可以的就是實現(xiàn)簡單的調(diào)用而已。大家可以自行嘗試一下,并不難。

拓展

關(guān)于拓展我想寫的有兩點:

  1. 關(guān)于html中接受回調(diào),這個需要做的就是在Java代碼中CallbackContext的兩個方法,succsee和error,其中可以傳遞多種參數(shù)類型,之后要做的就是在JS代碼中function方法的參數(shù)內(nèi)添加兩個參數(shù),分別是成功和失敗回掉調(diào), exec中也要在相應(yīng)的位置上寫上相同名稱的回調(diào)。最后在html中的方法內(nèi)同樣要寫上成功和失敗回調(diào)的function方法,注意參數(shù)的位置順序。這個就自己嘗試吧,不上代碼了。
  2. 關(guān)于onActivityResult的執(zhí)行:通常會出現(xiàn)這樣的情況,html中一個動作,通過插件開啟另一個Activity之后需要回傳數(shù)據(jù),如果按照之前的startActivityForResult方法的話在插件的JAVA類中重寫onActivityResult中是無法接受回調(diào)的,正確啟動另一個Activity的姿勢是
    cordova.startActivityForResult(command, intent, requestCode);
    第一個參數(shù)是關(guān)鍵就是當(dāng)前的Plugin對象,這樣onActivityResult才會收到回調(diào)。

總結(jié)

之前一直在找工作,很久沒有更新博客了,這篇博客算是新工作的第一個任務(wù)的階段性總結(jié)吧,公司要求使用Cordova來實現(xiàn)很多的html交互,只能去學(xué)一些這方面的知識。新工作目前感覺還可以,接下來的半年應(yīng)該都是自己充實的過程吧,感覺最近自己有點浮躁了,或者說安逸的生活不能激勵我,鞭策我前進(jìn),找到工作就沒有之前那么努力學(xué)習(xí)了,這是病得治,準(zhǔn)備合理安排自己的工作時間和休息時間,堅持半年,保持良好的學(xué)習(xí)態(tài)度和高昂的學(xué)習(xí)熱情,未來會更好的。

本人水平有限,對于JS,html之類的東西不是很了解,這篇博客內(nèi)容主要就是那四個套路方式,用好就可以其他的問我我也不會,如果按照我的套路在寫插件的過程中出現(xiàn)什么問題可以留言,或者你有一個想要實現(xiàn)的插件效果,也可以留言,正好我也需要鍛煉,共同進(jìn)步!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容