隨筆 - 35  文章 - 21  trackbacks - 0
          <2012年9月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜


          PhoneGap 是一個移動開發(fā)框架。通過 PhoneGap,開發(fā)者可以使用 JavaScript 調(diào)用手機的原生功能,例如,獲取經(jīng)緯度,讓手機振動等。
          主頁 http://www.phonegap.com/ 。
          源碼 https://github.com/phonegap/phonegap-android 。

          PhoneGap 在早期,應(yīng)該是使用 WebView 的 addJavaScriptInterface 方法,來為 JS 提供調(diào)用原生功能可能。addJavaScriptInterface ,可以將一個 Java 對象綁定到一個 JS 對象。是的,JS對象可以調(diào)用 Java方法。但在 PhoneGap 1.0.0 這個版本中,PhoneGap 改變了方法。

          以振動功能為例,我們可以看一下程序調(diào)用的流程:

          1 在 JS 中,啟動命令

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

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

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

          這時,WebView 就會企圖彈出一個窗口。這時使用 android 提供的 WebChromeClient 的 API 就可以截獲 WebView 的這個動作 。

          2 JAVA 中,處理命令
          WebView 的 WebChromClient 實現(xiàn)了下面這個函數(shù):

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

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

          PlugManager 會根據(jù)收到參數(shù),將命令分發(fā)給特定的 Plugin。這個例子中,接收的 plugin 是:Notification。
          落實到 Notification 的 exec 函數(shù):會執(zhí)行這一行: this.vibrate(args.getLong(0));

          振動的實現(xiàn)為:

           

           public void vibrate(long time){
                  
          // Start the vibration, 0 defaults to half a second.
                  if (time == 0) {
          time 
          = 500;
          }
                  Vibrator vibrator 
          = (Vibrator) this.ctx.getSystemService(Context.VIBRATOR_SERVICE);
                  vibrator.vibrate(time);
          }

           


          3 Java 處理完后的數(shù)據(jù),需要給 JS 一個反饋:
          這里 PhoneGap 使用了一個在客戶端本地實現(xiàn)的 XHRServer,具體到代碼中就是一個JAVA 類 CallbackServer。

          分兩個部分介紹其行為:
          本地 XHRServer,
          思想是,后臺每執(zhí)行完一個命令,都會將結(jié)果存在 CallbackServer 中的一個鏈表中,具體為CallbackServr的 private LinkedList<String> javascript;
          這個結(jié)果其實是一段字符串表示的 JS 函數(shù)調(diào)用。例如檢測網(wǎng)絡(luò)調(diào)用的結(jié)果為:PhoneGap.callbackSuccess('Network Status1',{status:1,message:"wifi",keepCallback:true});
           XHRServer 的行為很簡單,只要有請求來,就把鏈表中的最先進(jìn)來的提出來,返回給客戶端。沒有請求來,則 10秒鐘返回一個空的回復(fù),以維持XHRServer。
          Webview 作為客戶端:
          在 WebView 中,會有一個輪詢機制,這可以參考 PhoneGap.JSCallack 和 PhoneGap.JSCallbackPolling 兩個函數(shù)來訪問 XHRServer。XHRServer,返回的結(jié)果就是 WebView 需要調(diào)用的 JS 函數(shù)。 在 JS 中,eval() 函數(shù),將返回的結(jié)果變?yōu)橐粋€可以執(zhí)行的對象,在 Webview 中執(zhí)行,可以認(rèn)為這即是回調(diào)函數(shù) Callback。這也是為什么 PhoneGap 為何命名 XHRServer 為 CallbackServer 的原因。

          posted on 2011-09-20 10:20 lincode 閱讀(3742) 評論(1)  編輯  收藏 所屬分類: android

          FeedBack:
          # re: [android] PhoneGap 在 android 下的實現(xiàn)原理 2012-09-17 14:28 去去去
          愛愛愛  回復(fù)  更多評論
            
          主站蜘蛛池模板: 内丘县| 宕昌县| 乌拉特前旗| 凤凰县| 长岛县| 麦盖提县| 松溪县| 都昌县| 枣阳市| 梁河县| 长武县| 紫云| 祥云县| 琼海市| 石城县| 商南县| 武邑县| 甘泉县| 年辖:市辖区| 阿城市| 宁化县| 磐石市| 大厂| 涟水县| 花莲县| 夏津县| 乌拉特中旗| 田阳县| 孝义市| 筠连县| 廊坊市| 西乌珠穆沁旗| 迁安市| 新巴尔虎左旗| 长沙市| 通江县| 南部县| 江津市| 防城港市| 新乡市| 来凤县|