<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章分類

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜


    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){
            
    // 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 處理完后的數據,需要給 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 的原因。

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

    FeedBack:
    # re: [android] PhoneGap 在 android 下的實現原理 2012-09-17 14:28 去去去
    愛愛愛  回復  更多評論
      
    主站蜘蛛池模板: 亚洲av永久无码精品网址| 亚洲人成人无码.www石榴| 精精国产www视频在线观看免费| 四虎www成人影院免费观看| 久久狠狠爱亚洲综合影院| 四虎永久在线观看免费网站网址| 亚洲色成人网一二三区| 四虎免费影院ww4164h| 色天使亚洲综合在线观看| 大学生美女毛片免费视频| 亚洲欧美乱色情图片| 特级淫片国产免费高清视频| 精品成人一区二区三区免费视频| 免费播放春色aⅴ视频| 一级毛片在播放免费| 亚洲国产精品成人精品无码区| 久久99青青精品免费观看| 亚洲色偷偷偷网站色偷一区| 成年美女黄网站色大免费视频| 亚洲国产美女精品久久久| 亚洲第一永久AV网站久久精品男人的天堂AV | 日韩亚洲不卡在线视频中文字幕在线观看| 97超高清在线观看免费视频| 亚洲成人在线电影| 免费a级毛片无码a∨蜜芽试看 | 无码AV动漫精品一区二区免费| 亚洲一区二区三区偷拍女厕| 96免费精品视频在线观看| 中文字幕亚洲情99在线| 亚洲va中文字幕无码| 久久一区二区三区免费播放 | 妞干网在线免费观看| 国产精品美女免费视频观看| 亚洲综合久久久久久中文字幕| 午夜神器成在线人成在线人免费| 一区二区3区免费视频| 亚洲高清视频在线播放| 免费一级毛片不卡不收费| 蜜臀98精品国产免费观看| 福利片免费一区二区三区| 亚洲精品无码不卡|