Android JsBridge實戰 打造專屬你的Hybrid APP

更多文章請關注:開發者技術前線

Android開發目前現狀來說,開發者大部分時間花在UI的屏幕適配上,使用原生控件開發成本已不是那么的理想,鑒于很多項目保持和iOS一致的UI界面風格,至使移動UI開發成本花費更大的代價,因此目前結合H5和原生控件混合開發是解決UI適配的一種很好的選擇, 因此基于網頁形式的插件更新業務功能出現了,處于APP性能的考慮,Android也會使用java和native層(C,C++)進行結合。無論是哪種結合,其實原理都差不多,只要按照它的協議來是很容易的,今天我們僅對于H5和Java層結合的混合開發,了解WebViewJavascriptBridge的使用。


** 什么是JsBridge**

WebViewJavascriptBridge是移動UIView和Html交互通信的橋梁,用作者的話來說就是實現java(ios為oc)和js的互相調用的橋梁。替代了WebView的自帶的JavascriptInterface的接口,使得開發者更方便的讓js和native靈活交互,使我們的開發更加靈活和安全。

JSBridge的優點

Android API 4.4以前,谷歌的webview存在安全漏洞,網站可以通過js注入就可以隨便拿到客戶端的重要信息,甚至輕而易舉的調用本地代碼進行流氓行為,谷歌后來發現有此漏洞后,在API 4.4以后增加了防御措施,如果用js調用本地代碼,開發者必須在代碼申明JavascriptInterface, 列如在4.0之前我們要使得webView加載js只需如下代碼:

mWebView.addJavascriptInterface(new JsToJava(), "myjsfunction");

4.4之后使用時需要在調用Java方法加入@JavascriptInterface注解,如果代碼無此申明,那么也就無法使得js生效,也就是說這樣就可以避免惡意網頁利用js對客戶端的進行竊取和攻擊。 但是即使這樣,我們很多時候需要在js調用本地java代碼的時候,要做一些判斷和限制,或者有的場景也會做些過濾或者對用戶友好提示,甚至更復雜的Hybrid模式下,需要js和native之間進行交互通訊,拍照上傳,因此原生的JavascriptInterface 就比較維護了,特此有了基于JavascriptInterface 封裝的WebViewJavascriptBridge框架。

使用JsBridge正確姿勢

1 添加依賴
Eclipse:
導入jar包
直接copy jar的源碼到工程
JsBridge. jar可以到gitHub上直接下載。
Android Studio:

配置gradle

dmo.jpg

2 WebView需使用jsBridge的webView

code2.jpg

JS和Native交互
JS是基于訂閱和回調來實現Js和native交互的,我們需要在java中訂閱,然后Js中回調,反之也可以。
3.1 Java
registerHandler()用來注冊一個java函數,來實現js回調的handler,

第一個:訂閱的方法名
第二個: 回調Handler , 參數返回js請求的resqustData,function.onCallBack()回調到js,調用function(responseData)

//必須和js同名函數,注冊具體執行函數,類似java實現類

webView.registerHandler("submitFromWeb", new BridgeHandler() {
@Override
public void handler(String data, CallBackFunction function) {
function.onCallBack( data + “java”);
}
});

3.2 JS
Js代碼需要用window.WebViewJavascriptBridge.callHandler同步回調java層注冊的同名函數,這和java和c庫的jni調用如出一轍,方法名必須和Java層保持一致

第一參數:方法名
第二個:js調用native的請求參數
第三個:js在被回調后具體執行方法,responseData為java層回傳jsonStr.

window.WebViewJavascriptBridge.callHandler(
'submitFromWeb',
{'param': requsetData }, function(responseData) {
// do somrthing
});

案列實踐

** 1.Activity**
初始化WebView,設置必要的參數。

code5.jpg

需要自定義HandlerCallBack和WebViewClent;


code6.jpg

加載網頁 支持本地和遠程


23.jpg

1 java調用js函數

QQ截圖20160602195209.jpg

js同樣需要java注冊訂閱的同名函數

24.jpg

2 JS調用Java代碼
反之js調用java代碼
Js 訂閱一個叫functionInJs的方法

27.jpg

3 注意事項
無論怎樣形式的交互,Js 必須要初始化jsBridge

28.jpg

效果圖:

main.png

代碼展示
1 Acitivty

30.jpg

34.jpg

通過實例化webView,用法和安卓原生的view沒多大區別,設置WebChromClient, 設置加載的html(同樣支持網絡和本地文件),接著我們需要給web注冊和html端約定好的js方法名。代碼列舉的submitFromweb和js的執行的方法名一致,玩過NDK的JNI調用的朋友也知道必須和c代碼之間有個約定,其實js橋和jni有點類似
2 js代碼

![Uploading 95852_743830.jpg . . .]
56565.jpg

這段代碼不難理解,我們對上面的id為enter的Button注冊了一個點擊事件,點擊后執行以下testClick()方法,依次類推,其他Button注冊事件相同,當點擊“發消息給Native”的按鈕時,Js通過webWiew的jsBridage.send()發送一條數據給java層(密碼和用戶名),同時執行function()來執行應java層回調函數的。此demo中是把java返回的數據插入到ID為”show”的div里面去。
testClick1():此方法中調用callHandler來調用Java代碼的submitFromweb同名函數,可以結合上面的Activty的代碼理解下,此函數調用我們已在java已注冊訂閱
//必須和js同名函數,注冊具體執行函數,類似java實現類。

5454.jpg

3. H5

h5.jpg

這里so ez ! 你不必care
h5實現文件上傳
打開相冊.png


四 總結

通過以上的API介紹,代碼示例,不難發現此框架的優雅和簡便,對js和java雙方來說,如果Html中的js需要調用java代碼,而java代碼沒做任何實現,那么js中方法也是無效的,反之java代碼注冊的函數,沒在js里去回調實現,那么Java層也是無法獲取js中數據的,由此可見,此通信是雙方支持的,必須由雙方來約定,這樣就避免了Android之前存在的js注入漏洞,也很大的提高了安全性,也可以保證我們的網頁數據不被第三方的APP獲取,具體來講,列如我們的項目某一個web的h5界面,被系統瀏覽器或者其他第三方App的惡意加載,那么它的java代碼想調用你的js函數,實現需要你的H5的Js先注冊,不然跟本無法調用你的h5信息。這樣保證了這個html數據的安全性,,第三方的瀏覽器可以加載預覽你的網頁,但是第三方java無法和你的的h5中的js交互通信的。同樣加載我們自己的APP加載第三方的網頁時候,我們可以對第三方網頁進行一些行為的過濾,方便保護我們手機的安全,列如第三方可以獲取本機地址時我們可以提示用戶授權。
雖然H5并不屬于插件的一種,但是借助h5我可以方便的去更新一些運營活動,和某些需要經常需要更換UI的業務功能的地方,由于本文是從CSDN遷移過來的,原文實在一年前寫的,所以帶來的墳貼感覺請見諒。
原文csdn請戳:這里

以上只JSBridge的使用姿勢,以后再給大家解剖下JsBridge的內部實現。


項目地址
項目實例:https://github.com/NeglectedByBoss/JsBridge_Android
英文介紹:https://github.com/lzyzsd/JsBridge

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容