[android] PhoneGap 在 android 下的实现原理
PhoneGap 是一个移动开发框架。通过 PhoneGap,开发者可以使用 JavaScript 调用手机的原生功能,例如,获取经纬度,让手机振动等。
主页http://www.phonegap.com/ 。
源码 https://github.com/phonegap/phonegap-android 。

PhoneGap 在早期,应该是使用 WebView 的 addJavaScriptInterface 方法,来为 JS 提供调用原生功能可能。addJavaScriptInterface ,可以将一个 Java 对象绑定到一个 JS 对象。是的,JS对象可以调用 Java方法。但在 PhoneGap 1.0.0 这个版本中,PhoneGap 改变了方法。

以振动功能为例,我们可以看一下程序调用的流程:

1 在 JS 中,启动命令

main.js / navigator.notification.vibrate(0);

notification.js / Notification.vibrate.vibrate 中执行了 PhoneGap.exec(null, null, "Notification", "vibrate", [mills]);

phonegap.js / PhoneGap.exc 中执行了var r = prompt(PhoneGap.stringify(args), "gap:"+PhoneGap.stringify([service, action, callbackId, true]));

这时,WebView 就会企图弹出一个窗口。这时使用 android 提供的WebChromeClient 的API 就可以截获 WebView 的这个动作 。

2 JAVA 中,处理命令
WebView 的 WebChromClient 实现了下面这个函数:

public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result)

在 onJsPrompt 中执行了String r = pluginManager.exec(service, action, callbackId, message, async);

PlugManager 会根据收到参数,将命令分发给特定的 Plugin。这个例子中,接收的 plugin 是:Notification。
落实到 Notification 的 exec 函数:会执行这一行:this.vibrate(args.getLong(0));

振动的实现为:

public void vibrate( long time){
// Startthevibration,0defaultstohalfasecond.
if (time == 0 ){
time
= 500 ;
}
Vibratorvibrator
= (Vibrator) this .ctx.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(time);
}


3 Java 处理完后的数据,需要给 JS 一个反馈:
这里 PhoneGap 使用了一个在客户端本地实现的 XHRServer,具体到代码中就是一个JAVA 类 CallbackServer。

分两个部分介绍其行为:
本地 XHRServer,
思想是,后台每执行完一个命令,都会将结果存在 CallbackServer 中的一个链表中,具体为CallbackServr的 private LinkedList<String> javascript;
这个结果其实是一段字符串表示的 JS 函数调用。例如检测网络调用的结果为:PhoneGap.callbackSuccess('Network Status1',{status:1,message:"wifi",keepCallback:true});
XHRServer 的行为很简单,只要有请求来,就把链表中的最先进来的提出来,返回给客户端。没有请求来,则 10秒钟返回一个空的回复,以维持XHRServer。 Webview 作为客户端:
在 WebView 中,会有一个轮询机制,这可以参考 PhoneGap.JSCallack 和PhoneGap.JSCallbackPolling 两个函数来访问 XHRServer。XHRServer,返回的结果就是 WebView 需要调用的 JS 函数。 在 JS 中,eval() 函数,将返回的结果变为一个可以执行的对象,在 Webview 中执行,可以认为这即是回调函数 Callback。这也是为什么 PhoneGap 为何命名 XHRServer 为 CallbackServer 的原因。

更多相关文章

  1. android progressDialog的使用
  2. 基本Dalvik VM调用
  3. 进程博客纳入
  4. ISurfaceComposer接口有13个成员函数
  5. Android签名验证简介
  6. 如何去写 Android(安卓)init.rc (Android(安卓)init language)
  7. 【Android】Android(安卓)Parcelable 源码解析
  8. Android的一些小问题处理
  9. Android(安卓)对话框(Dialog)大全 建立你自己的对话框

随机推荐

  1. 完成一个用户注册页面,对表单字段进行验证
  2. 类与对象----那些事儿
  3. 【PHP】通过PHPoffice实现简单的导入
  4. 类的属性、封装、构造函数
  5. 面向对象编程(oop)初体验
  6. vue完整版和运行版版的区别
  7. 08-04作业 : 函数的参数,闭包 ,全局作用域
  8. 【前端 · 面试 】JavaScript 之你不一定
  9. 手把手教你用javascript实现简易的计算器
  10. 1. 请实例演绎你对面向对象类与对象关系