前言

本文适合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. python-排序算法 冒泡和快速排序

    交换排序 交换排序有冒泡排序和快速排序 冒泡排序 冒泡排序就是每次找出最大(最小)元素,放在集合最前或最后,这是最简单的排序算法 print("未排序之前:",collection ...

  2. gcc/g++命令参数笔记

    1. gcc -E source_file.c -E,只执行到预编译.直接输出预编译结果. 2. gcc -S source_file.c -S,只执行到源代码到汇编代码的转换,输出汇编代码. 3. ...

  3. 【Henu ACM Round#20 F】 Arthur and Brackets

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 所给的li,ri是左括号从左到右的顺序给的. (且注意长度是2*n 现在我们先把第一个左括号放在第1个位置. 然后考虑第二个位置. ...

  4. C# 从需要登录的网站上抓取数据

    [转] C# 从需要登录的网站上抓取数据 背景:昨天一个学金融的同学让我帮她从一个网站上抓取数据,然后导出到excel,粗略看了下有1000+条记录,人工统计的话确实不可能.虽说不会,但作为一个学计算 ...

  5. 洛谷 P1071 潜伏者

    P1071 潜伏者 题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S ...

  6. 洛谷 P1056 排座椅

    P1056 排座椅 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上 ...

  7. poj 2533 Longest Ordered Subsequence 最长递增子序列(LIS)

    两种算法 1.  O(n^2) #include<iostream> #include<cstdio> #include<cstring> using namesp ...

  8. Beta分布从入门到精通

    近期一直有点小忙,可是不知道在瞎忙什么,最终有时间把Beta分布的整理弄完. 以下的内容.夹杂着英文和中文,呵呵- Beta Distribution Beta Distribution Defini ...

  9. 智课雅思词汇---四、clos和cap和ced是什么意思

    智课雅思词汇---四.clos和cap和ced是什么意思 一.总结 一句话总结: cap/capt/cip/cep/ceiv:to take,seize(拿,抓住) cede:to go,yield( ...

  10. @Transactional 事务注解

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE, rollbackFor = ...