ionic插件基础(六)——自定义插件的demo
来源:互联网 发布:海涛旅游 知乎 编辑:程序博客网 时间:2024/05/16 05:39
上篇文章我们介绍了自定义插件的开发流程,这篇文章我们就写一个具体的例子,加深对自定义插件的理解
自定义插件的编写
我们就在上篇文章中建立的插件上做修改:
MyPlugin.js
var exec = require('cordova/exec');var myAPI = {};myAPI.func1 = function(arg0, success, error) { exec(success, error, "MyPlugin", "func1", [arg0]);};myAPI.func2 = function(arg0, arg1, success, error) { exec(success, error, "MyPlugin", "func2", [arg0,arg1]);};myAPI.func3 = function(success, error) { exec(success, error, "MyPlugin", "func3",[]);};module.exports = myAPI;
每个Plugin需要输出(export)的接口都需要使用module.exports的命令来完成。也就是我们定义的东西都要通过module.exports声明。使用exec()中的service参数必需和插件plugin.xml中的featur定义的一致,也就是必须和我们的MyPlugin.java相对应。
这里我定义了三个函数,分别是func1,func2,func3,它们对应的action为”func1”,”func2”,”func3”。
在这些函数中我们都直接执行了exec()函数,这个函数就对应着java类中的execute()方法。
MyPlugin.java
package com.test.helloworld;import org.apache.cordova.CordovaPlugin;import org.apache.cordova.CallbackContext;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import android.widget.Toast;/** * This class echoes a string called from JavaScript. */public class MyPlugin extends CordovaPlugin { @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { if (action.equals("func1")) { String message = args.getString(0); Toast.makeText(cordova.getActivity(), "func1传过来的值是:"+message, Toast.LENGTH_SHORT).show(); callbackContext.success("成功的调用了func1"); return true; } else if (action.equals("func2")) { String message0 = args.getString(0); String message1 = args.getString(1); Toast.makeText(cordova.getActivity(), "func2传过来的值是:"+message0+message1, Toast.LENGTH_SHORT).show(); callbackContext.success("成功的调用了func2"); return true; } else{ callbackContext.error("错误的调用"); return false; } }}
这里我们通过if (action.equals(“func1”)) 来判断action的值,也就可以分辨出是哪个方法调用的这个函数。
对于func1,我们先从JSONArray args
取出传过来的参数数组,然后调用原生Android的Toast将这个参数显示出来,然后执行func1的success函数。func2同理,只不过是我们传过来的参数个数不同,所以有些小区别罢了。
这里我只识别了”func1”,”func2”,而”func3”并没有相应的识别和处理,所以当我们执行func3函数时,我们java就对应的会执行
else{ callbackContext.error("错误的调用"); return false;}
这里就会执行func3传过来的”error”方法的回调。
现在我们的插件部分的编写就已经完成了。
在ionic项目中调用我们的插件
插件编写完成后我们就可以将自定义的插件安装到ionic项目中去。
安装完成后我们就在代码中调用我们的插件。
我们还是直接在ionic新建时的那个demo中继续修改,这里我继续用了之前演示相机插件的那个Project(不知道是不是我的问题,ionic新建项目好久,所以一般不想新建项目)。
这里做个补充:
当我们把自定义插件安装好后,我们可以查看我们项目中的Android平台代码对应的文件:(项目根目录\platforms\android\res\xml\config.xml)
可以发现这个文件中出现了我们在插件文件plugin.xml中编写的代码:
是不是证明了我们上篇文章中分析plugin.xml讲的内容
tab-dash.html
<ion-view view-title="Dashboard"> <ion-content class="padding"> <p id="content">调用原生函数</p> <button ng-click="callFunc1()">调用func1</button> <button ng-click="callFunc2()">调用func2</button> <button ng-click="callFunc3()">调用func3</button> </ion-content></ion-view>
我写了三个按钮,分别触发相应的点击事件,然后进行相应的处理。
controller.js
我们将controller文件中的“DashCtrl”controller进行修改:
.controller('DashCtrl', function($scope) { $scope.callFunc1 = function(){ cordova.plugins.MyPlugin.func1("func1传来的参数", function(msg) { setContent(msg);},//成功的回调 function(msg) { setContent("func1失败了"+msg); });//失败的回调 } $scope.callFunc2 = function(){ cordova.plugins.MyPlugin.func2("func2传来的参数0","func2传来的参数1", function(msg) { setContent(msg);},//成功的回调 function(msg) { setContent("func2失败了"+msg);});//失败的回调 } $scope.callFunc3 = function(){ cordova.plugins.MyPlugin.func3( function(msg) { setContent(msg);},//成功的回调 function(msg) { setContent("func3失败了"+msg); });//失败的回调 } var setContent = function(msg){ document.getElementById("content").innerHTML=msg; } })
我们分别对三个按钮写了相应的事件处理。
其中
cordova.plugins.MyPlugin.func1(...);
就会调用我们在插件js文件中的
myAPI.func1 = function(arg0, success, error){}
当我们函数执行成功时,原生端就会回调我们注册过去的success回调函数,即
function(msg) { setContent(msg);}
这里我们就会修改<p id="content">调用原生函数</p>
中的内容为msg变量的值。
这里的代码都非常简单,自己理解下就行了。
项目的运行效果如下:
注意事项
在工程根目录下修改的插件代码, 安装完成插件后无论修改的是js还是java部分,重新bulid是不会带入平台对应的文件夹下, 及修改不起作用,必须卸载插件后重新安装。
我自己试着直接修改ionic项目中plugin目录中的代码,js和java都改了,发现并没有作用,不知道是不是我姿势不对。也许有直接修改的方法,欢迎指正。
总结
这个例子我是照着plugman命令生成的代码框架上直接修改的,貌似跟cordova和phonegap官网给的例子有所不同,我是直接学ionic插件的,对于phonegap这些是0基础,如果有什么不对的地方,欢迎指出。
phonegap开发插件的相关文档
- ionic插件基础(六)——自定义插件的demo
- ionic插件基础(五)——自定义插件流程详解
- ionic插件基础(三)——插件原理及cordova相机插件的使用
- ionic插件基础(一)——插件的目录结构
- ionic插件基础(二)—— 插件的添加删除
- ionic插件基础(四)——ngCordova配置安装及ngCordova相机插件的使用
- Ionic开发自定义插件
- 自定义ionic插件
- ionic自定义插件
- ionic 自定义native插件
- ionic中自定义插件的问题
- 自定义开发ionic自带的日历插件ionic-datePicker
- Ionic— Cordova 插件开发
- 自定义cordova插件(phonegap、ionic)
- ionic之cordova插件自定义
- IONIC 自定义插件使用aar
- ionic 自定义插件调用aar
- ionic 自定义插件 使用.aar
- OkHttp和Volley对比
- java 正则匹配符号
- linux 多线程详解(互斥、信号、条件cond、锁)
- hdu 1272 并查集的应用
- 大数据_Storm_Storm之--配置项详解
- ionic插件基础(六)——自定义插件的demo
- Spring两大核心概念之IOC
- netty中使用IdleStateHandler来发起心跳
- HDU1031——Design T-Shirt(结构体排序)
- android线程池原理和实现
- UVA 784-Maze Exploration#
- Content-Type:application/x-www-form-urlencoded 和 multipart/form-data
- 使用tableHeaderView的时候动态改变高度
- [BZOJ4521][CQOI2016] 手机号码 - 数位DP