PhoneGap之自定义插件

PhoneGap:作为原生App,Java(这里面是指Android的)与JavaScript 的通信桥梁,使得我们的混合开发更加得心应手,我是与Android结合的混合开发。

但在这里不得不吐槽一下PhoneGap这个坑:更新速度很快,但是学习资料的更新却远远跟不上节奏。而且必须按照它的套路走,而且就算按着套路走也可能会出错,

最后还是得靠自己摸索。。。。

好了,不说那么多了,下面介绍PhoneGap自定义插件的使用(也可以说是CordovaPlugin),主要分以下步骤:


1)下载最新版的cordova.jar,我在使用的是cordova3.5.0.jar 版本的, 把下载的 cordova-x.x.x.jar导入到工程的libs目录下来。

说明:这个cordova.jar 是用于Android原生Java语言这边使用的,有了这个架包就可以在Android这边编写自定义的插件。


2)把cordova.js,cordova_plugin.js 这两个JavaScript文件复制到www文件目录下面。

说明:这两个js文件是用于JavaScript调用插件中方法使用。


3)在www文件目录下新建一个 plugins 文件夹目录。

说明: 用于存放自定义插件的JavaScript文件


4)编写自定义插件中的 java 代码部分:FirstPlugin.java

<span style="font-size:14px;">package com.customcordovaplugin.plugin;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;

/**
 * Created by long on 2016/5/10.
 */
public class FirstPlugin extends CordovaPlugin {
    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext)
            throws JSONException {
        //检查方法名,例如我们定义一个名为sayHello的方法
        if("sayHello".equals(action)){
            /**
             * 关于回调函数
             * 成功就执行 callbackContext.success(param),从而触发成功回调函数
             * 失败就执行 callbackContext.error(param),从而触发失败回调函数
             * 如果不需要回调函数,那么就没必要调用这两个方法
             */

            //获取第一个参数,如果有多个参数的话可以使用索引号分别获取
            String message = args.getString(0);
            //检查输入值是否为空,如果为空值就会调用 callbackContext.error()方法
            //这会导致失败回调函数被调用
            if(message!=null && message.length()>0){
                callbackContext.success("Hello: "+message+"!");
            }else{
                callbackContext.error("输入值为空!");
            }
            //最后还需要返回逻辑值 true 来表明方法存在
            return true;
        }
        //否则,如果方法名不符,那么就返回false
        //在网页的 JavaScript 程序中调用时就会导致“MethodNotFound”错误
        return false;
    }
}
</span>


5)编写自定义插件中的 JavaScript 部分:firstplugin.js
<span style="font-size:14px;">cordova.define("firstplugin_id",
    function(require, exports, module) {
    	//引入必要的类
        var exec = require('cordova/exec');

        //创建一个JavaScript类
        function FirstPlugin(){};
        
        //为其添加一个方法,在方法中调用exec()方法
        FirstPlugin.prototype.sayHello = function(name,successCallback,failureCallback){
        	exec(successCallback, failureCallback,
        				'FirstPlugin', 'sayHello', [name]);
        };
        
        //公共的对象是 FirstPlugin 实例
        module.exports = new FirstPlugin();
    }
);</span>


6)编写程序入口html文件:index.html
<span style="font-size:14px;"><!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="format-detection" content="telephone=no" />
        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
		<script type="text/javascript" src="cordova.js"></script>
		<script type="text/javascript" src="plugins/firstplugin.js"></script>
        <title>Simple</title>
    </head>
    <body οnlοad="onLoaded()">
        <label for="inputName">请输入名字: </label>
		<input type="text" id="inputName">
        <input type="button" οnclick="clickHandler()" value="sayHello" />
        <script>
        	//当DOM加载完毕,注册deviceready事件
        	function onLoaded(){
        		//注册deviceready事件监听,指定deviceready事件处理函数
        		document.addEventListener("deviceready",onDeviceReady,false);
        	}
        	//成功回调函数
        	function onSuccess(data){
        		alert(data);
        	}
        	//失败回调函数
        	function onError(err){
        		alert(err);
        	}

        	//deviceready 事件处理函数,PhoneGap 完成加载后调用该函数
        	function onDeviceReady(){
        		//启动所有input元素
        		var nodelist = document.getElementsByTagName('input');
        		var nodeLen = nodelist.length;
        		for(var i=0;i<nodeLen;i++){
        			nodelist[i].disabled = false;
        		}
        	}
        	//按钮单击事件处理函数
        	function clickHandler(){
        		//获取输入文本框中的字符,并将其作为参数传递给sayHello()方法
        		inputName = document.getElementById("inputName");
        		var dialog = com.mine.FirstPlugin;
        		dialog.sayHello(inputName.value, onSuccess, onError);
        	}
        </script>
    </body>
</html></span>
说明:
<span style="font-size:14px;">        		var dialog = com.mine.FirstPlugin;    <span style="font-family: Arial, Helvetica, sans-serif;">是在后面讲到的cordova_plugins.js文件中配置的</span>

        		dialog.sayHello(inputName.value, onSuccess, onError);</span>
<span style="font-size:14px;">调用的这个sayHello方法就是调用了 firstplugin.js 文件中的这个方法:</span>
<span style="font-size:14px;"><pre name="code" class="javascript">        //为其添加一个方法,在方法中调用exec()方法
        FirstPlugin.prototype.sayHello = function(name,successCallback,failureCallback){
        	exec(successCallback, failureCallback,
        				'FirstPlugin', 'sayHello', [name]);
        };</span>

7)接下来就是配置config.xml文件,在res下面新建xml文件夹,并且将config.xml 放到该文件夹下面,config.xml 代码如下:
<span style="font-size:14px;"><widget xmlns     = "http://www.w3.org/ns/widgets"
        id        = "io.cordova.helloCordova"
        version   = "2.0.0">

    <feature name="FirstPlugin">
        <param name="android-package" value="com.customcordovaplugin.plugin.FirstPlugin"/>
    </feature>

</widget></span>
说明:value的值就是 FirstPlugin.java 文件的路径及名称


8)配置cordova_plugin.js 文件 ,cordova_plugins.js代码如下:

<span style="font-size:14px;">cordova.define('cordova/plugin_list',function(require, exports, module){
	module.exports = [{
		"file": "plugins/firstplugin.js",       //表示注册和连接JavaScript文件的位置
		"id": "firstplugin_id",                 //表示唯一的标示
		"clobbers": ["com.mine.FirstPlugin"]    //表示可以引用的接口(用于html中调用JavaScript的方法(自定义))
	}
	
	module.exports.metadata = {
		"firstplugin_id": "1.0",          //插件的版本号
	}
});
</span>

到这里,PhoneGap自定义插件的工作完成了,PhoneGap的学习到处是坑,大家学习的时候细心点。

相关文章分享:

http://blog.csdn.net/yuhailong626/article/details/30059679

http://blog.csdn.net/kong92917/article/details/44086821

http://blog.csdn.net/xiaoluo5238/article/details/38711331

http://blog.csdn.net/Maxbalance/article/details/50483490

http://blog.csdn.net/happyflyingave/article/details/25182369


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值