Cordova中JavaScript/TypeScript调用原生代码
来源:互联网 发布:sql server 字符串主键 编辑:程序博客网 时间:2024/05/22 13:02
Cordova官网上没有说怎么使用JS调用本地代码,但是告诉了我们如何写一个插件。
Cordova插件的根本原理就是JS和原生代码的交互。
所以抠出Cordova插件中调用本地代码的部分就可以了。
Ionic2创建插件简易教程:
http://www.cnblogs.com/eccainiao/p/6398072.html
适用于:
Cordova中JavaScript调用Android原生代码
Ionic中 TypeScript调用Android原生代码
IOS已经验证,同样原理,可以使用。
开发环境版本号:
cordova 6.5.0
Ionic 2.2.1
node 6.10.1
npm 3.10.10
一、写原生代码类
cordova项目或者Ionic项目编译后,会产生对应平台下的源码。
使用cordova/Ionic命令编译为android平台下的项目,使用AndroidStudio打开android源码(platforms\android目录下),创建一个类,类的要求:
1. 继承CordovaPlugin类
2. 重写execute(String action, JSONArray args, CallbackContext callbackContext)方法:
在execute方法中根据传来的action参数进行匹配,做对应的业务处理,有对应的action返回true,找不到对应的action返回false。
业务处理成功调用callbackContext.success(此方法会调用JavaScript/TypeScript中cordova.exec中传入的'成功回调方法'),
业务处理失败调用callbackContext.error(此方法会调用JavaScript/TypeScript中cordova.exec中传入的'失败回调方法')
示例:
package com.test.hello.myplugin;
import android.content.Context;
import android.content.SharedPreferences;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
public class Test extends CordovaPlugin {
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if (action.equals("testAction")) {
String message = args.getString(0);
this.myMethod(message, callbackContext);
return true;
}
return false;
}
private void myMethod(String message, CallbackContext callbackContext) {
if (message != null && message.length() > 0) {
SharedPreferences sp = cordova.getActivity().getSharedPreferences("config", Context.MODE_PRIVATE);
String ss = sp.getString("test","SharedPreferences的数据");
callbackContext.success(ss);
} else {
callbackContext.error("Expected one non-empty string argument.");
}
}
}
二、配置config.xml文件
config.xml文件在res/xml目录下
<feature name="Test">
<param name="android-package" value="com.test.hello.myplugin.Test" />
</feature>
name="Test" 为JS或TS代码中cordova.exec传入的'服务参数'
value="com.test.hello.myplugin.Test" 为第一步中创建的类的完整类名
三、调用原生代码
cordova.exec(<successFunction>, <failFunction>, <service>, <action>, [<args>]);
参数说明:
successFunction 成功回调
failFunction 失败回调
service 服务名字
action action
args 要传给原生代码的所有参数(以数组形式传递)
在JavaScript中调用本地代码示例:
cordova.exec(function(msg){
alert('test成功了' + msg)
}, function(msg){
alert('test失败了')
}, "Test", "testAction", ['传递的参数']);
}
在TypeScript中直接调用cordova.exec会报错,需要声明cordova为any类型,在import语句后添加
declare let cordova: any;
四、编译运行---------重点
此时如果使用cordova/Ionic命令运行项目的话,无法正常调用原生代码。
因为使用cordova/Ionic编译命令,会重新生成config.xml文件,之前的配置过的config.xml的feature 会丢失。
此时需要再次使用AndroidStudio打开android源码再配置一遍config.xml文件:
<feature name="Test">
<param name="android-package" value="com.test.hello.myplugin.Test" />
</feature>
配置完后,使用AndroidStudio编译运行app(不能使用cordova/Ionic命令编译运行)
五、重点----为了解决config.xml文件被覆盖问题,在第二步中不再编辑config.xml文件,
而是编辑\platforms\android目录下的android.json文件,
在config_munge节点下添加如下片段:
{ "xml": "<feature name=\"Test\"><param name=\"android-package\" value=\"com.test.hello.myplugin.Test\" /></feature>", "count": 1}
这样配置后,就不必使用AndroidStudio编译运行了,直接使用cordova/Ionic命令编译运行即可。
示例:
"config_munge": { "files": { "res/xml/config.xml": { "parents": { "/*": [ { "xml": "<feature name=\"SplashScreen\"><param name=\"android-package\" value=\"org.apache.cordova.splashscreen.SplashScreen\" /><param name=\"onload\" value=\"true\" /></feature>", "count": 1 }, { "xml": "<feature name=\"StatusBar\"><param name=\"android-package\" value=\"org.apache.cordova.statusbar.StatusBar\" /><param name=\"onload\" value=\"true\" /></feature>", "count": 1 }, { "xml": "<feature name=\"Whitelist\"><param name=\"android-package\" value=\"org.apache.cordova.whitelist.WhitelistPlugin\" /><param name=\"onload\" value=\"true\" /></feature>", "count": 1 }, { "xml": "<feature name=\"Test\"><param name=\"android-package\" value=\"com.test.hello.myplugin.Test\" /></feature>", "count": 1 } ] } } }}
Ionic2简易创建插件教程:
http://www.cnblogs.com/eccainiao/p/6398072.html
1 0
- Cordova中JavaScript/TypeScript调用原生代码
- android 中ionic JavaScript调用原生代码
- cordova 插件中原生调用js
- PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码
- PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码
- Cordova/Phonegap Android中Java调用JavaScript
- ionic中typescript javascript调用高德地图
- 如何使用JavaScript调用android原生代码,android原生代码调用JavaScript
- Cordova插件调用Android原生Activity
- WebView原生方法---使用javascript调用android代码
- Cordova 中建立与WebView原生对象通信的核心代码
- IOS 与 Android WebView 中 JS 调用原生代码
- js 调用 Android 原生代码
- js通过cordova调用本地代码
- 原生javascript 添加事件 代码
- 在Ionic 2中使用TypeScript使用第三方cordova插件(Using a third-party cordova plugin in Ionic 2 with TypeScript)
- 如何在原生工程中引入Cordova工程
- VC中调用JavaScript的代码片段
- 手把手教你编写游戏模拟器
- userAgent判断客户端,以及各个浏览器的ua
- 【JAVA】JVM介绍。绝对干货!
- Ubuntu 16.04安装VNC
- EventBus源码解析
- Cordova中JavaScript/TypeScript调用原生代码
- 易控INSPEC软件与三菱FX系列PLC以太网通讯
- 专利法
- 304. Range Sum Query 2D
- 【JavaEE】Servlet的doGet()和doPost()方法
- 关于IE9下用按钮触发file上传控件,请求无法触发的问题
- 面向对象设计原则之依赖倒转原则
- Unity3D研究院之手游开发中所有特殊的文件夹
- Spark机器学习之协同过滤