Cordova自定义插件实战

Cordova自定义插件实战#

使用前提

这篇文章是之前发表在CSDN上的,拿过来充数用的,其实那个时候也写了不少,不过也就这篇能看的过去,其他一些都是知识总结性的。没什么意思。

  1. 已经能够实现原有插件的使用。
  2. 稍微熟悉JS语言(其实我也不会)
  3. 创建一个Cordova的Demo。

自定义插件实战

准备工具

  1. 用Cordova在Dos中创建一个Demo,之后将此Demo在Eclipse中引入,会发现多了两个文件CordovaLib和MainActivity。
  2. 新建一个text的Android工程,将MainActivity中src目录下的org.apache.cordova包,assets目录下的www文件,和res目录下的XML文件夹拷到新建text工程的相应位置。
  3. 将Cordova作为text外部依赖库。

Toast

先写一个比较简单的插件,方便大家了解这个插件化的编写流程,只要把套路记住了,其他的都好弄。
先说一下在写插件的过程中我们需要经常接触的四个文件。

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

在自定义插件的过程中我们会经常接触的就是这四个文件,接下来就是套路了。

编写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方法,三个参数,action为html中调用的方法名,args为方法参数,callbackContext为回调,先不用管那个多,首先对action进行判断,如果action所对应的方法名与我们定义的方法名相同的话就,就执行弹出一个Toast的动作,在if(){}大括号中随便写,我只不过是为了方便就写的与方法名相同,其实不用。关于返回值true的时候表示此插件可用,false为不可用,个人目前没有感觉在实际中有什么应用。现在一个Toast插件的Java代码就写好了,唯一值得注意的就是if()括号中的方法名

编写JS文件
在assets/www/plugins目录下新建一个文件夹,名字随意起,我的是cordova-plugin-toast,之后在文件夹内新建一个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. 第二行,第三行,抄过去进行,必须写。
  3. 第四行,其中showToast为我们自己定义的在html调用的方法名。冒号后面的function的括号中定义在html中调用本地Toast中需要的参数,大括号中也是固定写法 exec括号中有五个参数,分别是:成功回调,失败回调,feature name,方法名,参数。,其中feature name可能不知道是什么无所谓,先放着,方法名就是showToast,参数就是function中的参数,同时也对应着java代码中JSONArray args。

配置cordova_plugins.js

在module.exports中添加

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

把上面的复制粘贴一下,将file中的改为插件的JS文件路径,id改为插件的文件夹名和文件名,对应着JS文件中的Cordova.define括号中内容,clobbers中内容随便写,这个是html中调用方法时的调用头部(先这么叫着吧,因为我也没学过JS,不知道专业怎么叫),注意上下文的逗号。

在module.exports.metadata中添加

"cordova-plugin-toast":"1.0.0"

"文件夹名" :"版本号",版本号随便写,目前不知道在未来有什么作用,文件夹名就是JS文件的文件夹名,这个cordova_plugins也配合完成。

配置config.xml
在文件中适当的位置添加

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

直接把其中的一个复制粘贴,feature name随便写,不过要与JS文件中的第三个参数保持一致,param name统一写 android-package,value中则对应的是JAVA文件的包名和类名。

套路

整体的编写流程已经介绍一遍了,其中比较重要的地方都加粗标记了一下,不过这么看起来好像有点乱,而且也没有体现出来套路是什么。现在就把套路告诉大家,只要掌握这个基本的套路写一个简单的插件完全没有问题。

  1. JAVA文件:"方法名".equals(action),做判断。args中存放html给你的参数。
  2. JS文件:define("JS文件夹名.文件名"),方法名 :function(参数){exec(成功,失败,"feature name","方法名",[参数])}
  3. cordova_plugins.js:file:"js文件的路径",id:"JS文件夹名.文件名",clobbers:"方法调用头",metadata中添加"JS文件夹名":"版本号"。
  4. config.xml:feature name="随便写",与JS文件中保持一致,value为"JAVA包名.类名"

在编写的过程中一共就这四条,只要这四条中所对应的内容都匹配的上,那么这个插件就没有问题。

验证

这运行之前还有两点需要做,首先在新建的Android的项目中把MainActivity中的内容进行一点的更改,将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所对应的方法名。大括号中的就是在cordova_plugins中定义的方法调用头和在JS中定义的方法名,参数也随便写,不过要注意就是也JAVA中的参数相对应。
看下效果。


可以看到这就是一个简单的Toast插件效果,个人觉得按照套路把房子搭好,之后你愿意放什么就放什么。如果有不明白或者有有问题的可以留言。

Call&SmS

接下来如果你的Toast插件已经编写完成了,并且对于整个套路有了一定的熟悉,肯定想验证一下自己学到的东西到底有没有真正的掌握,那么来做个测试吧,尝试编写插件来实现html调用本地的电话和短信,套路都是一样的主要差别就在JAVA代码中,这也是编写插件的最主要的地方,先看一下效果。


可以看出来效果还是可以的就是实现简单的调用而已。大家可以自行尝试一下,并不难。

拓展

关于拓展我想写的有两点:

  1. 关于html中接受回调,这个需要做的就是在Java代码中CallbackContext的两个方法,succsee和error,其中可以传递多种参数类型,之后要做的就是在JS代码中function方法的参数内添加两个参数,分别是成功和失败回掉调, exec中也要在相应的位置上写上相同名称的回调。最后在html中的方法内同样要写上成功和失败回调的function方法,注意参数的位置顺序。这个就自己尝试吧,不上代码了。
  2. 关于onActivityResult的执行:通常会出现这样的情况,html中一个动作,通过插件开启另一个Activity之后需要回传数据,如果按照之前的startActivityForResult方法的话在插件的JAVA类中重写onActivityResult中是无法接受回调的,正确启动另一个Activity的姿势是
    cordova.startActivityForResult(command, intent, requestCode);
    第一个参数是关键就是当前的Plugin对象,这样onActivityResult才会收到回调。

总结

之前一直在找工作,很久没有更新博客了,这篇博客算是新工作的第一个任务的阶段性总结吧,公司要求使用Cordova来实现很多的html交互,只能去学一些这方面的知识。新工作目前感觉还可以,接下来的半年应该都是自己充实的过程吧,感觉最近自己有点浮躁了,或者说安逸的生活不能激励我,鞭策我前进,找到工作就没有之前那么努力学习了,这是病得治,准备合理安排自己的工作时间和休息时间,坚持半年,保持良好的学习态度和高昂的学习热情,未来会更好的。

本人水平有限,对于JS,html之类的东西不是很了解,这篇博客内容主要就是那四个套路方式,用好就可以其他的问我我也不会,如果按照我的套路在写插件的过程中出现什么问题可以留言,或者你有一个想要实现的插件效果,也可以留言,正好我也需要锻炼,共同进步!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容