代码改变世界

给Phonegap开发Android插件

2012-08-02 15:00  onm  阅读(325)  评论(0编辑  收藏  举报

这一段时间给Phonegap开发了一些插件,Phonegap源码也是看了一些,这次说说Phonegap插件开发的一些事情。首先可以看一下https://github.com/phonegap/phonegap-plugins这里,这里有大量的Phonegap插件,可以作为参考,Phonegap官方也终于在发布2.0版本的时候加上了一个开发插件的文档,这里,但是简单的很。

Phonegap的所有组件其实都是基于插件模式的,通过PluginsManager进行管理,首先Phonegap启动后会读取plugins.xml配置文件中的插件配置信息,然后实例化相应的插件,插件开发的关键是是首先插件继承自org.apache.cordova.api.Plugin或者com.phonegap.api.Plugin,历史原因,Phonegap改成叫做cordova后,为了与原来的插件兼容,保留了com.phonegap.api.*下面的内容。

Plugin有个重要的方法是execute,大部分插件所做的工作就是重写这个方法,这个方法签名具体是PluginResult execute(String action, JSONArray arg, String callbackId),phonegap.js里面有个方法是exec,调用exec后会调用这个java里的execute方法,action是一个标识,arg是传递的参数,然后phonegap实现了函数调用的异步方式,使用callbackId来做标识。关于phonegap.js和java部分通信,以及异步函数调用的内容可以参看我以前写的《phoengap源码解析——插件机制,java和js代码互调用详解》,然后在这个里面就可以用java代码随便折腾了,随便调用Android的API了,一个小例子可以看Phonegap最新发布的插件开发文档。

这里说点文档里面没有的东西。

1. java里面的异步调用,可以使用callbackId来实现js的回调,具体写法就是PluginResult的实例pr调用pr.setKeepCallback(true);然后回调的时候调用Plugin实例的success方法,参数中传回这个callbackId,就可以了。

2. execute里面都是在非主线程里面执行的,所以要修改UI的时候,要回到主线程,this.cordova.getActivity().runOnUiThread(runnable)的方法回到主线程中运行。这个很重要。

3. 所有方法默认都是异步的,基于回调方式的。如果非要采用同步方法,可以复写Plugin的isSynch(action)方法,针对特定的action返回true就变成同步方法了。

4. 原来获取phonegap activity context是由ctx这个属性得到的,现在是通过cordova这个接口得到。

5. Plugin有个onMessage方法,可以监听别的地方发送的消息。

6. Plugin默认Phongap加载的时候没有实例化,可以通过配置plugins.xml文件的插件节点的属性onload为true,这样就会在Phonegap加载后,立即实例化Plugin。

。。。

暂时只能想到这些了,其实开发过程还有一些东西,一时想不起来了。