前言

本文适合Android+web的复合型人才,由于cordova本身就是混合开发,所以在Android开发的基础上,还要懂web相关技术(HTML+CSS+JS)。可是也有例外,比方我。仅仅需负责Android方面。web方面的交由其它web组人员开发。尽管。web略懂一点。但我主要还是搞Android开发的。

编写自己定义插件类

本节的内容是。自己定义一个dialog插件。供web调用,显示系统弹窗。

新建一个包名,我这里使用org.apache.cordova.dialog。然后创建个类CustomDialog.java。继承于CordovaPlugin(全部自己定义插件,都要继承CordovaPlugin),最后重写execute方法。

execute有三个重载方法:

public boolean execute(String action, JSONArray args, CallbackContext callbackContext)
public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext)
public boolean execute(String action, String rawArgs, CallbackContext callbackContext)

这三个方法。假设你看了CordovaPlugin源代码的话。会发现,事实上最后都调用了第二个方法,可是CordovaArgs仅仅是对JSONArray的一个封装。方便操作json数据而已,所以要重写哪个。按个人喜好。

这里。我是重写了第二个方法,如今来说明下方法參数:

String action:一个类里面能够提供多个功能,action就是指名了要调用哪个功能。

CordovaArgs args:web以json的数据格式传递给Android native。CordovaArgs 是对JSONArray 的一个封装。

CallbackContext callbackContext:这个是回调给web,有success和error两种回调方法。

详细实现例如以下:

public class CustomDialog extends CordovaPlugin{

    @Override
public boolean execute(String action, CordovaArgs args, final CallbackContext callbackContext) throws JSONException {
if("show".equals(action)){
AlertDialog.Builder builder = new AlertDialog.Builder(cordova.getActivity());
builder.setTitle("提示");
builder.setMessage(args.getString(0));
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
callbackContext.success("点击了确定");
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
callbackContext.error("点击了取消");
}
});
builder.create().show();
return true;
}
return super.execute(action, args, callbackContext);
} }

假设web使用了CustomDialog插件。并调用show方法(action)。这时候,会弹出一个系统窗体。会显示web传过来的消息内容,点击确定,回调web,告诉它调用成功,取消则是失败。最后记得return true(表示调用成功)。

配置config.xml

打开res/xml/config.xml文件,原本内容例如以下:

<?xml version='1.0' encoding='utf-8'?>
<widget id="com.example.helloworld" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<preference name="loglevel" value="DEBUG" />
<feature name="Whitelist">
<param name="android-package" value="org.apache.cordova.whitelist.WhitelistPlugin" />
<param name="onload" value="true" />
</feature>
<allow-intent href="market:*" />
<name>HelloWorld</name>
<description>
A sample Apache Cordova application that responds to the deviceready event.
</description>
<author email="dev@cordova.apache.org" href="http://cordova.io">
Apache Cordova Team
</author>
<content src="index.html" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
</widget>

Whitelist是基础项目自带的一个插件,相同的,我们在widget节点下也加入一个feature。

<?

xml version='1.0' encoding='utf-8'?>
<widget id="com.example.helloworld" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<preference name="loglevel" value="DEBUG" />
<feature name="Whitelist">
<param name="android-package" value="org.apache.cordova.whitelist.WhitelistPlugin" />
<param name="onload" value="true" />
</feature>
<!--弹窗插件-->
<feature name="CustomDialog">
<param name="android-package" value="org.apache.cordova.dialog.CustomDialog" />
</feature>
<allow-intent href="market:*" />
<name>HelloWorld</name>
<description>
A sample Apache Cordova application that responds to the deviceready event.
</description>
<author email="dev@cordova.apache.org" href="http://cordova.io">
Apache Cordova Team
</author>
<content src="index.html" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
</widget>

feature name能够随便取,param value填的是详细类的位置。

web配置并调用

1、配置

打开asserts/www/cordova_plugins.js文件,注冊插件。

cordova.define('cordova/plugin_list', function(require, exports, module) {
module.exports = [
{
"file": "plugins/cordova-plugin-whitelist/whitelist.js",
"id": "cordova-plugin-whitelist.whitelist",
"runs": true
},
{
"file": "plugins/cordova-plugin-dialog/dialog.js",//js文件路径
"id": "cordova-plugin-dialog.CustomDialog",//js cordova.define的id
"clobbers": [
"alertDialog"//js 调用时的方法名
]
}
];
module.exports.metadata =
// TOP OF METADATA
{
"cordova-plugin-whitelist": "1.2.1"
};
// BOTTOM OF METADATA
});

然后在assets/www下创建dialog.js文件

内容例如以下:

cordova.define("cordova-plugin-dialog.CustomDialog",
function(require, exports, module) {
var exec = require("cordova/exec");
module.exports = {
show: function(content){
exec(
function(message){//成功回调function
console.log(message);
},
function(message){//失败回调function
console.log(message);
},
"CustomDialog",//feature name
"show",//action
[content]//要传递的參数。json格式
);
}
}
});

cordova.define 的第一个參数就是cordova_plugins.js里面定义的id,最基本的是exec方法,參数说明:

參数1:成功回调function

參数2:失败回调function

參数3:feature name,与config.xml中注冊的一致

參数4:调用java类时的action

參数5:要传递的參数,json格式

2、调用

配置完上面的。仅仅剩下在合适的地方调用它了。

打开assets/www/js/index.js

找到onDeviceReady方法,然后调用

alertDialog.show('Hello World!!!!');

这里直接调用alertDialog,就是在cordova_plugins.js下定义的clobbers名称,show是在js申明的function

index.js#onDeviceReady

onDeviceReady: function() {
app.receivedEvent('deviceready');
//调用自己定义插件
alertDialog.show('Hello World!!!!');
}

直接在Android Studio运行,效果图例如以下:

这个对话框就是Android 系统的AlertDialog。

当我们点击确定时。就会回调js success function,打印出日志。

不要运行cordova build命令。!



须要注意的是。假设你上一篇章有细致看过之后,你会有这么个疑问,编译项目不是用

cordova build

命令的吗?非常好,网上非常多说。在项目中。代码都已经写好了。可是一运行该命令,不但没有生效,反而之前写的插件代码都没了。事实上,假设你知道整个项目编译过程。那么问题就迎刃而解了。

这里简单的说下。看下图的目录结构

plugins是存放插件的目录。而www是存放H5项目的。也就是Android项目下的asserts/www下的文件,当运行cordova build时,它会依据config.xml配置来编译项目,然后会将plugins和www下的文件应用到platforms目录下的各个平台,这就是“一次编译,多平台运行”。

可是。至始至终,我们编写的代码都是在Android平台下的。而上面提到的两个目录我们都没有动过。也就是说,全部配置都没有动过。都是初始状态,所以运行build后也就没有效果。

总结

通过上面的实例,已经实现了简单的自己定义插件,可是它仅仅是在Android平台上实现的。那么。我们怎么应用在其它的平台上呢?或者说,我们实现一个插件之后,怎么提供给别人项目使用呢?下一节,将说说插件安装包怎样生成。就是解决这几个问题的。

源代码

Android Cordova 插件开发之编写自己定义插件的更多相关文章

  1. android studio 插件开发(自动生成框架代码插件)

    android studio 插件开发 起因 去年公司开始上新项目,正好android在架构这方面的讨论也开始多了起来,于是mvp架构模型就进入我们技术选择方案里面,mvp有很多好处,但是有一个非常麻 ...

  2. phonegap(cordova) 自己定义插件代码篇(五)----android ,iOS 集成微信登陆

    统一登陆还是非常有必要的,安全,放心.代码 /*cordov 微信自己定义插件*/ (function (cordova) { var define = cordova.define; define( ...

  3. ionic2 自定义cordova插件开发以及使用 (Android)

    如何写一个cordova 用于ionic2项目中呢,在搜索了一番之后,千篇一律,我都怀疑那些文章是不是全部都是复制来复制去的,而且都不是很详细.我自己也捣鼓了一下午,踩了很多坑.所以特此写这下这篇,记 ...

  4. cordova开发自己定义插件

    以下是自己定义cordova插件的基本入门.做插件的小白可以參考一下哈,兴许会更新插件的进阶博客,希望大家可以共同学习共同进步 1.环境搭建 cordova插件开发前须要安装一些软件和配置环境 1.1 ...

  5. Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例

    引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...

  6. Android Studio 插件开发详解三:翻译插件实战

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78113868 本文出自[赵彦军的博客] 一:概述 如果不了解插件开发基础的同学可以 ...

  7. Android中插件开发篇之----动态加载Activity(免安装运行程序)

    一.前言 又到周末了,时间过的很快,今天我们来看一下Android中插件开发篇的最后一篇文章的内容:动态加载Activity(免安装运行程序),在上一篇文章中说道了,如何动态加载资源(应用换肤原理解析 ...

  8. Android Studio 插件开发详解一:入门练手

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112003 本文出自[赵彦军的博客] 一:概述 相信大家在使用Android S ...

  9. jQuery上定义插件并重设插件构造函数

    插件alert的全部代码,每个插件都定义在如下类似的作用域中: +function ($) { 'use strict'; // ALERT CLASS DEFINITION // ========= ...

随机推荐

  1. TIME定时器

    一.定时器分类 STM32F1 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器.基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定 ...

  2. 三种记录 MySQL 所执行过的 SQL 语句的方法

    程式 Debug 有時後從前面第一行追起來很辛苦(程式碼太多或 compile 過), 另一種做法就是從後面追起來, 反正最後寫入的是 DB, 那就從 DB 開始往前推, 所以就是要抓程式是執行哪些 ...

  3. Codeforces 558C Amr and Chemistry 全都变相等

     题意:给定一个数列,每次操作仅仅能将某个数乘以2或者除以2(向下取整). 求最小的操作次数使得全部的数都变为同样值. 比赛的时候最后没实现.唉.之后才A掉.開始一直在想二分次数,可是半天想不出怎 ...

  4. uva 104 Arbitrage (DP + floyd)

    uva 104 Arbitrage Description Download as PDF Background The use of computers in the finance industr ...

  5. caioj1442:第k小的数Ⅱ

    [传送门:caioj1442] 简要题意: 给出n个点,每个点都有一个权值,m个操作,操作有两种:第一种是询问l到r的第k小的值,然后输出这个值,第二种是将第x个点的值改为k 题解: 又是一道主席树的 ...

  6. 存储过程和transaction

    https://stackoverflow.com/questions/11531352/how-to-rollback-a-transaction-in-a-stored-procedure BEG ...

  7. 关于checkbox的一些jquery操作

    表单在前端开发中是经常会遇到的,其中自然也少不了checkbox复选框,对于复选框的操作无外乎有以下三种:全选,全不选,反选.下面零度逍遥就给大家分析分析. 一.checkbox全选 大家都知道选择c ...

  8. 【实用篇】Android之应用程序实现自动更新功能

    我个人用的是友盟提供的自动更新组件,因此在这里只描述如何实用友盟提供的组件来完成程序的自动更新,步骤如下: 1.登录友盟官网,点击注册一个友盟账号. 2.注册成功后将会自动进入到添加新应用界面,选择添 ...

  9. 用json2.js 代替 json.js防止与jQuery的js冲突

    用json2.js 代替 json.js防止与jQuery的js冲突 1 s.toJSONString json.js:259 2 Object.toJSONString json.js:158 3 ...

  10. C#一些延时函数

    sleep延时方法: System.Threading.Thread.Sleep(); //毫秒 在C#窗口程序中,如果在主线程里调用Sleep,在Sleep完成之前, 界面呈现出假死状态,不能响应任 ...