很好的两篇文章,转过来希望更多的人看到
第一篇:
- 建立通讯机制,提供接口给浏览器端,方便 JavaScript 进行调用。
- 数据队列的维护,以保证浏览器端的调用后产生的数据可以回送。
- 插件体系的建立,提供整个框架的可扩展性。
- DroidGap、App
- CallbackServer
- Plugin、PluginManager
&& defaultValue.substring(0, 4).equals( "gap:")) {
JSONArray array;
try {
array = new JSONArray(defaultValue.substring(4));
String service = array.getString(0);
String action = array.getString(1);
String callbackId = array.getString(2);
boolean async = array.getBoolean(3);
String r = pluginManager.exec(service, action, callbackId, message, async);
result.confirm(r);
} catch (JSONException e) {
e.printStackTrace();
}
}
// Polling for JavaScript messages
else if ......
- 利用查询之前提到的 HashMap<String, String> 将 service 和 className 对应起来,这样我们就获得了提供功能的插件类的位置。
- 通过 getClassByName 来获得插件类。
- 完成类型检测,确定对应的类是一个插件类。
- 执行 addPlugin 方法,其中则将第 2 步中获得插件类的 className 和具体的 Plugin 接口的实现绑定,具体的实现就是上文中提到的 HashMap<Strig,IPlugin>。
- 判断 Plugin 是否需要异步执行,再根据情况,选择直接执行或者是建立新的线程来执行。
- 完成执行后,得到的数据会根据情况交给 CallbackServer 来处理,PluginManager 会调用 DroidGap 中的 sendJavaScript 来将数据交给 CallbackServer,事实上,DroidGap 中的 sendJavaScript 不过是对 CallbackServer 中的 sendJavaScript 包装,实际调用的是 CallbackServer 中的 sendJavaScript 方法,这涉及到了 CallbackServer 类,随后就会说明。
- 首先利用 ServerSocket 监听端口,具体端口则自由分配。
- 在 accept 后则是对 HTTP 协议的解析,和对应的返回 status code。
- 在验证正确后,利用 getJavascript 方法得到维护的 LinkedList<String>() 中的保存的 js 代码,如果为空则返回 null。
- 这些具体的 string 类型的 js 代码则利用 socket 作为 response 返回给前端。
if (success || fail) {
PhoneGap.callbacks[callbackId] = {success:success, fail:fail};
}
var r = prompt(PhoneGap.stringify(args), "gap:"+
PhoneGap.stringify([service, action, callbackId, true]));
// If a result was returned
if (r.length > 0) {
eval( "var v="+r+ ";");
// If status is OK, then return value back to caller
if (v.status === PhoneGap.callbackStatus.OK) {
......
} else if ......
}
public PluginResult execute(String action, JSONArray args, String callbackId) {
PluginResult.Status status = PluginResult.Status.OK;
PluginResult r= null;
if (action.equals( "sayHello")){
r = new PluginResult(status, "Hello");
} else if (action.equals( "saySth")){
r = new PluginResult(status,args);
}
return r;
}
- 如果 action 的参数是 sayHello,则返回字符串“Hello”。
- 如果是 saySth,则返回 args 中的内容。
}
Hello.prototype.saySth = function(msg, callback, fail) {
return PhoneGap.exec(function(args) {
callback(args);
}, function(args) {
if(typeof fail == 'function') {
fail(args);
}
}, 'Hello', 'saySth', [msg]);
}
Hello.prototype.sayHello = function(callback, fail) {
return PhoneGap.exec(function(args) {
callback(args);
}, function(args) {
if(typeof fail == 'function') {
fail(args);
}
}, 'Hello', 'sayHello',['sayHello']);
}
PhoneGap.addConstructor(function() {
PhoneGap.addPlugin('hello', new Hello());
//PluginManager.addService("Hello","qj.Hello");
})
this.pluginManager.addService(
"Hello",
"qj.Hello");
|
function(arg){alert(arg);});
window.plugins.hello.saySth( "Bingo",function(arg){alert(arg);},
function(arg){alert(arg);});
- 访问 官方网站在线文档,了解更多的 PhoneGap 使用细节。
- 访问 Phonegap 在 hithub 上的代码,了解更多的 PhoneGap 代码细节。
- 访问 Android 的开发者网站,了解更多的 Android 的开发细节。
- 随时关注 developerWorks 技术活动和 网络广播。
- 访问 developerWorks Open source 专区获得丰富的 how-to 信息、工具和项目更新以及 最受欢迎的文章和教程,帮助您用开放源码技术进行开发,并将它们与 IBM 产品结合使用。
this.pluginManager.addService(
"Hello",
"qj.Hello");
|
第二篇
转自:http://blog.csdn.net/iefreer/article/details/7054241
PhoneGap(1.1.0)是如何工作的
利用PhoneGap可以快速开发覆盖所有主流智能手机的应用程序。写一次,多个平台运行。
其基本策略是使用WEB编程技术(HTML5/CSS/JS),把应用程序构建在html控件中,
利用额外的javascript封装包屏蔽底层平台的接口差别,对开发者提供统一的JS接口,从而实现跨平台的特性。
当然要实现跨平台,也会牺牲一些本地应用的功能以及性能。
技术取舍最终取决于手机平台和浏览器技术的发展和具体的业务应用场景。
本文以Android平台为例,简单介绍这个平台是如何工作的。
1、代码结构
- src
- assets
- www
- index.html
- main.js
- pg*.css
- phonegap-*.js
- bin
- libs
a)src目录包含了工程的java源代码,用户自定义的程序YourAppActivity主活动派生自DroidGap,其代表了PhoneGap Android应用程序。
DroidGap最重要的成员变量是WebView控件,可以理解为PhoneGap的应用程序的宿主。HTML代码就依赖于WebView来解析和呈现。
b)www目录包含了程序的主页面index.html,该页面在程序启动时被加载。phonegap*.js就是PhoneGap的JS对设备本地功能如Contacts、Campass、Camera等的封装包。main.js是处理主页面用户请求的js脚本。*.css用来控制样式。
c)bin目录包含了应用程序经PhoneGap编译后的输出
d)libs包含了PhoneGap java实现库。
2、处理流程
程序开始的时候触发loadUrl服务,加载应用程序主页面index.html;
当用户在页面中操作时,比如下面的代码片断是想获取本地通讯录:
<div data-role="button" οnclick="get_contacts();">Get Phone's Contacts</div>
将触发main.js中的get_contacts函数,该函数将执行PhoneGap.exec(...)命令主入口,该命令以gap:的格式开头:
PhoneGap.exec(successCB, errorCB, "Contacts", "search", [fields, options]);
其中Contacts是Plugin,search是作用于该Plugin上面的动作。
exec函数将调用javascript的prompt函数,最终触发DroidGap包中(WebView)的onJsPrompt侦听器,
在侦听函数中派发给Contacts插件处理该动作。
最终返回处理结果,并呈现。