前几天写了一个PhoneGap插件,这个插件的功能很简单,就是开启viewport设置。不过与其它插件相比,有好几个有意思的地方,仔细读了PhoneGap的源码才搞定。这里记录一下PhoneGap插件开发的流程,以及开发这个插件遇到的问题。

0.先安装android sdk, node.js,phonegap和plugman。请参考用PhoneGap编译CanTK

1.用plugman创建一个插件:

plugman create --name ViewPort --plugin_id com.tangide.viewport --plugin_version 1.0.0

2.编写JAVA代码: src/android/ViewPort.java

package com.tangide.viewport;

import android.util.Log;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONException;
import android.webkit.WebSettings;
import org.apache.cordova.CordovaWebView;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext; public class ViewPort extends CordovaPlugin {
private static final String LOG_TAG = "ViewPort"; @Override
public void initialize(CordovaInterface cordova, CordovaWebView webView) {
final CordovaWebView wv = webView;
super.initialize(cordova, webView);
webView.post(new Runnable() {
@Override
public void run() {
WebSettings ws = wv.getSettings();
ws.setUseWideViewPort(true);
ws.setLoadWithOverviewMode(true);
wv.reload();
Log.d(LOG_TAG, "ViewPort Enabled");
}
});
} @Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
Log.d(LOG_TAG, "No Method In This Plugin");
return false;
}
}

这里比较有意思的是,我们的插件并不提供接口,而是在初始化是做些设置。所以initialize函数才是重点,但是遇到两个问题:

一是APP启动时并没有调用插件的initialize函数,仔细研究PhoneGap插件加载流程后才知道需要在plugin.xml里加一项设置。

二是在initialize函数里调用WebSettings出错,原因是初始化线程不是WebView的UI线程。这个问题通过webView.post来解决。

3.修改JS包装插件函数。本插件的JS是www/ViewPort.js,我们不需要提供接口。

4.修改 plugin.xml


<plugin id="com.tangide.viewport" version="1.0.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
<name>ViewPort</name>
<description>This plugin enable the meta viewport in html</description> <author>Li XianJing</author>
<license>MIT</license>
<keywords>Meta, Android, ViewPort, DPI, Width</keywords>
<repo>https://github.com/drawapp8/ViewPort.git</repo>
<issue>https://github.com/drawapp8/ViewPort/issues</issue> <engines>
<engine name="cordova" version=">=3.0.0"/>
</engines> <js-module name="ViewPort" src="www/ViewPort.js">
<clobbers target="cordova.plugins.ViewPort" />
</js-module> <!-- Android -->
<platform name="android">
<config-file target="res/xml/config.xml" parent="/*">
<feature name="ViewPort">
<param name="android-package" value="com.tangide.viewport.ViewPort" />
<param name="onload" value="true" />
</feature>
</config-file>
<config-file target="AndroidManifest.xml" parent="/*"></config-file>
<source-file src="src/android/ViewPort.java" target-dir="src/com/tangide/viewport/" />
</platform>
</plugin>

这里值得关注的是下面这行代码,它让APP在启动时就执行插件initialize函数:

<param name="onload" value="true" />

5.把它放到github上。

6.发布插件到http://plugins.cordova.io 上。

plugman adduser lixianjing
plugman publish

PhoneGap插件开发流程的更多相关文章

  1. wordpress插件开发流程梳理

    1.声明一个插件 首先我们必须明白,wordpress的插件可以是单文件,也可以是多文件,css/html都不是必须的,以下举例暂且在单文件模式下 比如我们要创建一个名为 hellophp的插件,那我 ...

  2. jira的插件开发流程实践

    怎么开头呢,由于自己比较懒,博客一直不怎么弄,以后克己一点,多传点自己遇到的问题和经历上来,供自己以后记忆,也供需要的小伙伴少走点弯路吧 最近公司项目需要竞标一个运维项目,甲方给予了既定的几种比较常用 ...

  3. 老司机带你解读jQuery插件开发流程

    jquery插件开发模式 jquery插件一般有三种开发方式: 通过$.extend()来扩展jQuery 通过$.fn 向jQuery添加新的方法 通过$.widget()应用jQuery UI的部 ...

  4. wordpress插件开发流程梳理-二

    开发插件的最佳实践 避免命名冲突 当您的插件对变量,函数或类使用相同的名称作为另一个插件时,会发生命名冲突. 幸运的是,您可以使用以下方法避免命名冲突. 程序性 默认情况下,所有变量,函数和类都在全局 ...

  5. cordova自定义插件开发流程

    cordova自定义插件开发:1.cordova安装:npm install -g cordova2.plugman安装:npm install -g plugman3.cordova创建工程:cor ...

  6. npapi插件开发流程与实例

    近期做NPAPI插件,网上的介绍还是比较多,但就是没有一个完整的例子,FQ也没找到,难得NPAPI要走向陌路了?就不去深究额,先解决目前遇到的问题. 现状:已有Activex(仅兼容IE32/64位浏 ...

  7. CKeditor插件开发流程(二)SyntaxHighlighter

    CKEditor整合SyntaxHighlighter实现代码高亮显示 1,版本说明 CKEditor:ckeditor_4.0.1_standard.zipSyntaxHighlighter:syn ...

  8. CKeditor插件开发流程(一)

    1.放在多文件中 第一步:config.js中 config.extraPlugins = '插件名称';//注册插件,extraPlugins只允许出现一次,你如果之前有新增别的插件,那么用逗号分隔 ...

  9. gitbook 入门教程之小白都能看懂的 Gitbook 插件开发全流程

    什么是插件 Gitbook 插件是扩展 GitBook 功能(电子书和网站)的最佳方式. 只要是 Gitbook 默认没有提供的功能,基于插件机制都可以自行扩展,是插件让 Gitbook 变得更加强大 ...

随机推荐

  1. Tomcate配置单向双向SSL

    1.单向SSL 一.在Tomcate的service.xml文件中放开SSL配置 <!-- <Connector port="8443" protocol=" ...

  2. shell脚本之间互相调用

    在Shell中要如何调用别的shell脚本,或别的脚本中的变量,函数呢? 方法一: . ./subscript.sh 方法二: source ./subscript.sh 注意: .两个点之间,有空格 ...

  3. IOS文字属性备注

    // Predefined character attributes for text. If the key is not in the dictionary, then use the defau ...

  4. android 入门 005(登录记住)

    android 入门 005(登录记住) <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android ...

  5. javascript实现非递归--归并排序

    另一道面试题是实现归并排序,当然,本人很不喜欢递归法,因为递归一般都是没有迭代法好.所以首选都是用迭代法,但是迭代法确实是难做啊,至底而上的思想不好把握. 这是我的实现代码 /* * * 非递归版归并 ...

  6. django学习の模型

    orm:对象数据库和模型的映射.如果想以简单的方式去操作数据库,例如用类的方式去操作,就像 p = Person.get(id = 1),那么就必须使得代码和数据库的结构具有映射关系,实现这种关系,你 ...

  7. django学习日志之自定义用户扩展

    django 为我们提供了强大的用户认证系统,并且提供了基于该系统的User模型,所以,很多时候,我们有必要对自己的user进行业务扩展,得到满足我们自己业务需求的user.借此,写下自己的感悟. u ...

  8. svn转移版本库

    1.导出 svnadmin dump命令语法svnadmin dump REPOS_PATH [-r LOWER[:UPPER]] [--incremental] 示例:svnadmin dump E ...

  9. C语言实现数组快速排序(含对算法的详细解释)

    /* 说明: 代码参考过网上代码,但分析为个人原创,本贴重在说明快速排序算法的思想和运行过程. */ 代码部分: #include<stdio.h> #include<stdlib. ...

  10. 多线程&NSObject&NSThread&NSOperation&GCD

    1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 2.NSOperation/NS ...