Cordova自定義插件實戰(zhàn)#
使用前提
這篇文章是之前發(fā)表在CSDN上的,拿過來充數(shù)用的,其實那個時候也寫了不少,不過也就這篇能看的過去,其他一些都是知識總結(jié)性的。沒什么意思。
- 已經(jīng)能夠?qū)崿F(xiàn)原有插件的使用。
- 稍微熟悉JS語言(其實我也不會)
- 創(chuàng)建一個Cordova的Demo。
自定義插件實戰(zhàn)
準(zhǔn)備工具
- 用Cordova在Dos中創(chuàng)建一個Demo,之后將此Demo在Eclipse中引入,會發(fā)現(xiàn)多了兩個文件CordovaLib和MainActivity。
- 新建一個text的Android工程,將MainActivity中src目錄下的org.apache.cordova包,assets目錄下的www文件,和res目錄下的XML文件夾拷到新建text工程的相應(yīng)位置。
- 將Cordova作為text外部依賴庫。

Toast
先寫一個比較簡單的插件,方便大家了解這個插件化的編寫流程,只要把套路記住了,其他的都好弄。
先說一下在寫插件的過程中我們需要經(jīng)常接觸的四個文件。
- 插件的JAVA文件---位于src目錄下--自己寫
- 插件的JS文件---位于assets/www/plugins目錄下--自己寫
- Cordova_plugins.js---位于assets目錄下--插件的配置文件
- 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文件的必備要素。
- 第一行," cordova.define("cordova-plugin-toast.toast", function(require, exports, module) { " 這就是套路,不用想為什么這么寫,因為我也不知道,值得注意的就是在cordova.define()括號中添加的是插件js文件的文件夾名和js文件名。
- 第二行,第三行,抄過去進(jìn)行,必須寫。
- 第四行,其中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)在就把套路告訴大家,只要掌握這個基本的套路寫一個簡單的插件完全沒有問題。
- JAVA文件:"方法名".equals(action),做判斷。args中存放html給你的參數(shù)。
- JS文件:define("JS文件夾名.文件名"),方法名 :function(參數(shù)){exec(成功,失敗,"feature name","方法名",[參數(shù)])}
- cordova_plugins.js:file:"js文件的路徑",id:"JS文件夾名.文件名",clobbers:"方法調(diào)用頭",metadata中添加"JS文件夾名":"版本號"。
- 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)于拓展我想寫的有兩點:
- 關(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ù)的位置順序。這個就自己嘗試吧,不上代碼了。
- 關(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)步!