三构蹬、第一枚自主研發(fā)插件發(fā)射

主要的目的就在這了王暗,我要學(xué)習(xí)一下怎么寫cordova插件,如何調(diào)試庄敛,如何寫config plugin.xml文件瘫筐。
基礎(chǔ)知識儲備:寫過java的helloworld,運(yùn)行過eclipse上的android模擬器铐姚,js還行。


  • 創(chuàng)建一個應(yīng)用肛捍,用來調(diào)用寫好的插件
    • 進(jìn)入工程目錄:
      cordova create hello com.example.hello HelloWorld

第一個參數(shù)hello
表示在工程目錄中創(chuàng)建一個 hello 的文件夾
第二個參數(shù)com.example.hello
表示包名(反向域名)隐绵,用于標(biāo)志不同的 app
第三個參數(shù)HelloWorld
表示項(xiàng)目的名稱,可以在 config.xml 文件中修改

  • 添加平臺
    進(jìn)入創(chuàng)建的項(xiàng)目中:
    cd hello
    添加平臺
    cordova platform add android
    查看已經(jīng)安裝的平臺和支持的平臺:
    cordova platforms list
    移除不想要的平臺
    cordova platform remove android

  • 編譯項(xiàng)目
    cordova build android

    cordova prepare android cordova compile android
    編譯完成后可以看到 platforms/android/bin/ 下已經(jīng)生成了 apk 文件

  • 測試拙毫、運(yùn)行項(xiàng)目
    查看adb識別的設(shè)備
    cordova run --list
    指定設(shè)備運(yùn)行當(dāng)前程序( 若不指定默認(rèn)列表第一個設(shè)備)
    cordova run android --target=deviceName

  • 一個簡單的非native插件(只用到j(luò)s)(有個軟件plugman會更方便依许,比如會生成plugin.xml)

    • 創(chuàng)建插件目錄
      仿照官方明確插件結(jié)構(gòu)
      pluginFolder
      |--src
      |.....|--android
      |...............|--xxx.java
      |.....|--otherPlatform
      |--www
      |.......|--xxx.js
      |--plugin.xml
      這里的 src 對應(yīng)不同的平臺,www 放我們的 javascript 文件缀蹄,plugin.xml是插件的配置文件峭跳。
    • plugin.xml – 配置清單
<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
    xmlns:rim="http://www.blackberry.com/ns/widgets"
    xmlns:android="http://schemas.android.com/apk/res/android"
    id="cordova-plugin-test"http://插件的標(biāo)識膘婶,即發(fā)布到 plugins.cordova.io的ID,
                          //(cordova plugin remove id)(在wex5中使用前要把工程文件夾名改為這個id)
    version="1.0.0">
   <engines> 
            <engine name="cordova-android" version="=1.8.0" /> 
             //該插件基于cordova的版本蛀醉,
            //也可模糊匹配<engine name="cordova-android" version=">=1.8.0" /> 
          // <engine name="cordova" version=">=1.7.0" />
          // <engine name="cordova-android" version=">=1.8.0" /> 
          ///<engine name="cordova-ios" version=">=1.7.1" />
             </engines>
   <name>test</name>//插件的名稱
    <description>Cordova Plugin For A Test</description>//描述信息
<author>Foo plugin author</author>
    <license>Apache 2.0</license>
    <keywords>cordova,test</keywords>
    <js-module src="www/test.js" name="test">//對應(yīng)我們的 javascript 文件
        <clobbers target="cordova.plugin.test" />//target:H5通過它作為前綴調(diào)用js中間件方法悬襟。用于指定module.exports被插入在window對象的命名空間。你可以有很多的clobbers只要你喜歡拯刁。創(chuàng)建window上的任何對象不可用
    </js-module>
<dependency id="cordova-plugin-someplugin" url="https://github.com/myuser/someplugin" commit="428931ada3891801" subdir="some/path/here" />
<dependency id="cordova-plugin-someplugin" version="1.0.1">
//在dependency標(biāo)簽允許你指定在其當(dāng)前插件依賴其他插件
    <!-- android -->
    <platform name="android">//支持的平臺脊岳,這里僅僅用到了 android
//config-file標(biāo)識一個基于XML的配置文件進(jìn)行修改,其中在該文件中所述修改應(yīng)該發(fā)生垛玻,什么應(yīng)該進(jìn)行修改割捅。
        <config-file target="res/xml/config.xml" parent="/*">//插件的配置信息,最后會添加到 res/xml/config.xml文件
            <feature name="test" >//這個name設(shè)置必須要和下面這個插件類名相同帚桩,哎亿驾,這個導(dǎo)致的class not found把工程刪了建建了刪的搞了好幾次才發(fā)現(xiàn)
                <param name="android-package" value="cordova.plugin.test.test"/>//package.繼承cordovaplugin的類名
            </feature>
        </config-file>
<config-file target="AndroidManifest.xml" parent="/manifest/application"> 
        <activity android:name="com.foo.Foo" android:label="@string/app_name"> 
          <intent-filter> 
          </intent-filter> 
        </activity> 
</config-file>
<edit-config file="AndroidManifest.xml" target="/manifest/application" mode="merge">
//config-file 是插入,edit-config在mode="merge"狀態(tài)下是合并
            <application android:theme="@android:style/Theme.NoTitleBar.Fullscreen"></application>
</edit-config>
<hook type="after_plugin_install" src="scripts/afterPluginInstall.js" />
//hook表示將由cordova當(dāng)某些行為發(fā)生時被調(diào)用自定義腳本(例如账嚎,插件添加或平臺準(zhǔn)備邏輯后調(diào)用)莫瞬。當(dāng)你需要擴(kuò)展默認(rèn)cordvoa的功能,這非常有用醉锄。
        <source-file src="src/android/test.java" target-dir="src/cordova/plugin/test/dtest" />
//并且將我們的 src/android/test.java乏悄,復(fù)制到 android 的 package 包中。對應(yīng)定義的包名恳不,也可用拷貝其他文件
///相對于plugin.xml到文件的位置
    </platform>
</plugin>
  • xxx.js – 中間件
exports.forTest = function(success,error){//exports用來暴露接口
    var a=123;
    success(a);
};

到這里檩小,一個簡單的測試插件就完成了。
若是使用plugman這些步驟就是一句話:

plugman create --name test --plugin_id cordova.plugin.test --plugin_vers ion 1.0.0 --path D:/cordova/
--name 插件名烟勋,也是--path下的插件所在文件夾名
--plugin_id 插件id
--plugin_version 版本號
--path 相對路徑或絕對路徑
  • 一個簡單的測試
    • 添加插件到應(yīng)用
      切到應(yīng)用目錄
      cordova plugin add path/PluginName
      查看應(yīng)用的plugins目錄规求,添加成功就會有PluginID對應(yīng)的文件夾。
    • 在應(yīng)用的js中調(diào)用插件
var suc=function(result){alert(result);};
        cordova.plugin.test.forTest(suc);//對應(yīng)js-module 中的clobbers.暴露接口
  • 運(yùn)行一下
    cordova run android --target=deviceName
  • 添加native部分
    • xxx.js卵惦,中間件部分
var exec = require('cordova/exec');//法克阻肿,昨天寫的代碼那這句搞沒了,找了一天才發(fā)現(xiàn)沮尿。
//所以還是建議這么用  var cordova=require('cordova');
//下面調(diào)用時用cordova.exec(success,error,"test","testFun",[]);
var myFunc = function(){};
// arg1:成功回調(diào)
// arg2:失敗回調(diào)
// arg3:將要調(diào)用的java類
// arg4:調(diào)用的原生方法名
// arg5:參數(shù)丛塌,json格式
myFunc.prototype.javaShow=function() { 
      exec(success, error, "test", "testFun", [test]);
      //根據(jù)plugin.xml的配置,傳給 java 類的 action 參數(shù)來調(diào)用 java 方法
      //exec就是js與java交互的傳送門
};
var forOut = new myFunc();
module.exports = forOut;
  • xxx.java,nativa部分
package cordova.plugin.test;
//
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaWebView;
import android.content.Context;
import org.json.JSONArray;
import org.json.JSONException;
//繼承 CordovaPlugin 接口
//class name要對應(yīng)上js
public class test extends CordovaPlugin {
//按需復(fù)寫 execute 方法
//action:js傳來的 action 參數(shù)畜疾,通過匹配執(zhí)行相應(yīng)方法
//args:js傳來的參數(shù)赴邻,以 JSONArray 格式,通過 get 方法獲取值
//callbackContext:對應(yīng)js的succee啡捶、error姥敛,給其返回結(jié)果
    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        try {
            if (action.equals("testFun")) {//執(zhí)行對應(yīng)action方法
                callbackContext.success("testFun_OK");//返回成功回調(diào)參數(shù)
                return true;
            } 
            callbackContext.error("Invalid Action");
            return false;
        } catch (Exception e) {
            System.err.println("Exception: " + e.getMessage());
            callbackContext.error(e.getMessage());
            return false;
        }
    }
} 
  • all done
    暫時還不知道怎么調(diào)試,只能改源碼一下下再編譯了瞎暑。
    每改一次都要
    cordova plugin rm pluginName --save
    一下彤敛,然后再添加回來
    ////////////////////////
    今天看了下好像可以用cordova server portNum這樣調(diào)試与帆,還沒嘗試。

如果擴(kuò)展了插件墨榄,在用命令行工具編譯時要使用 cordova compile 而不要用 cordova build 命令玄糟,因?yàn)?cordova build 命令其實(shí)是 cordova prepare + cordova compile,而 cordova prepare 命令做的就是根據(jù)插件中的 config.xml 將插件文件復(fù)制到項(xiàng)目中渠概,這樣就會把你修改了的插件文件替換掉茶凳,所以如果只是想編譯項(xiàng)目,就只使用 cordova compile 命令吧播揪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贮喧,一起剝皮案震驚了整個濱河市巍膘,隨后出現(xiàn)的幾起案子溜徙,更是在濱河造成了極大的恐慌综芥,老刑警劉巖宾娜,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烁试,死亡現(xiàn)場離奇詭異掖鱼,居然都是意外死亡拟烫,警方通過查閱死者的電腦和手機(jī)弥鹦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門疆前,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寒跳,“玉大人,你說我怎么就攤上這事竹椒⊥” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵胸完,是天一觀的道長书释。 經(jīng)常有香客問我,道長赊窥,這世上最難降的妖魔是什么爆惧? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮锨能,結(jié)果婚禮上扯再,老公的妹妹穿的比我還像新娘。我一直安慰自己址遇,他們只是感情好熄阻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著傲隶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪窃页。 梳的紋絲不亂的頭發(fā)上跺株,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天复濒,我揣著相機(jī)與錄音,去河邊找鬼乒省。 笑死巧颈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袖扛。 我是一名探鬼主播砸泛,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛆封!你這毒婦竟也來了唇礁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤惨篱,失蹤者是張志新(化名)和其女友劉穎盏筐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砸讳,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡琢融,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了簿寂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漾抬。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖常遂,靈堂內(nèi)的尸體忽然破棺而出纳令,到底是詐尸還是另有隱情,我是刑警寧澤烈钞,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布泊碑,位于F島的核電站,受9級特大地震影響毯欣,放射性物質(zhì)發(fā)生泄漏馒过。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一酗钞、第九天 我趴在偏房一處隱蔽的房頂上張望腹忽。 院中可真熱鬧,春花似錦砚作、人聲如沸窘奏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽着裹。三九已至,卻和暖如春米同,著一層夾襖步出監(jiān)牢的瞬間骇扇,已是汗流浹背摔竿。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留少孝,地道東北人继低。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像稍走,于是被迫代替她去往敵國和親袁翁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,754評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理婿脸,服務(wù)發(fā)現(xiàn)粱胜,斷路器,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • afinalAfinal是一個android的ioc盖淡,orm框架 https://github.com/yangf...
    passiontim閱讀 15,409評論 2 45
  • 第三章 我與中考 (這是我對于中考的回憶……) “兒砸年柠,這可是中考呀!你可千萬不要緊張褪迟!老爸是你...
    Memory汪爾摩斯閱讀 184評論 0 3
  • 女票心情好的時候冗恨,你叫她發(fā)語音,她:))) 女票心情不好的時候味赃,你叫她發(fā)語音掀抹,她:語音 語音 語音
    慕星讀者OR獨(dú)者閱讀 167評論 0 0