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

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

使用前提

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

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

自定義插件實(shí)戰(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(){}大括號中隨便寫,我只不過是為了方便就寫的與方法名相同扇苞,其實(shí)不用欺殿。關(guān)于返回值true的時候表示此插件可用,false為不可用鳖敷,個人目前沒有感覺在實(shí)際中有什么應(yīng)用〔彼眨現(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) { " 這就是套路荠呐,不用想為什么這么寫赛蔫,因?yàn)槲乙膊恢溃档米⒁獾木褪窃?strong>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)用頭部(先這么叫著吧听系,因?yàn)槲乙矝]學(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)記了一下歌粥,不過這么看起來好像有點(diǎn)亂,而且也沒有體現(xiàn)出來套路是什么∨牟海現(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)證

這運(yùn)行之前還有兩點(diǎn)需要做逞姿,首先在新建的Android的項(xiàng)目中把MainActivity中的內(nèi)容進(jìn)行一點(diǎ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)編寫完成了,并且對于整個套路有了一定的熟悉吞杭,肯定想驗(yàn)證一下自己學(xué)到的東西到底有沒有真正的掌握盏浇,那么來做個測試吧,嘗試編寫插件來實(shí)現(xiàn)html調(diào)用本地的電話和短信芽狗,套路都是一樣的主要差別就在JAVA代碼中绢掰,這也是編寫插件的最主要的地方,先看一下效果。


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

拓展

關(guān)于拓展我想寫的有兩點(diǎ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來實(shí)現(xiàn)很多的html交互纤垂,只能去學(xué)一些這方面的知識矾策。新工作目前感覺還可以,接下來的半年應(yīng)該都是自己充實(shí)的過程吧峭沦,感覺最近自己有點(diǎn)浮躁了贾虽,或者說安逸的生活不能激勵我,鞭策我前進(jìn)吼鱼,找到工作就沒有之前那么努力學(xué)習(xí)了榄鉴,這是病得治,準(zhǔn)備合理安排自己的工作時間和休息時間蛉抓,堅(jiān)持半年庆尘,保持良好的學(xué)習(xí)態(tài)度和高昂的學(xué)習(xí)熱情,未來會更好的巷送。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伸眶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子刽宪,更是在濱河造成了極大的恐慌厘贼,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圣拄,死亡現(xiàn)場離奇詭異嘴秸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)庇谆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門岳掐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饭耳,你說我怎么就攤上這事岩四。” “怎么了哥攘?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵剖煌,是天一觀的道長。 經(jīng)常有香客問我逝淹,道長耕姊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任栅葡,我火速辦了婚禮茉兰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘欣簇。我一直安慰自己规脸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布熊咽。 她就那樣靜靜地躺著莫鸭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪横殴。 梳的紋絲不亂的頭發(fā)上被因,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼梨与。 笑死堕花,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粥鞋。 我是一名探鬼主播缘挽,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呻粹!你這毒婦竟也來了壕曼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤尚猿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后楣富,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凿掂,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年纹蝴,在試婚紗的時候發(fā)現(xiàn)自己被綠了庄萎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡塘安,死狀恐怖糠涛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兼犯,我是刑警寧澤忍捡,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站切黔,受9級特大地震影響砸脊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纬霞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一凌埂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诗芜,春花似錦瞳抓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翠桦,卻和暖如春臭笆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工愁铺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹰霍,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓茵乱,卻偏偏與公主長得像茂洒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瓶竭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容