寫在最前:
看Android最新技術(shù)總結(jié),關(guān)注公眾號(hào):
? ? ? ? ?最近因?yàn)锳pp與H5交互邏輯太亂胃碾,所以抽空梳理了下筋搏;對(duì)目前App與H5的各種交互通信做個(gè)總結(jié),自取適合自己的交互方式奔脐。
一髓迎、H5調(diào)用原生的native方法
1、攔截shouldOverrideUrlLoading方法
? ? ? ? ?借助WebView在加載一個(gè)url的時(shí)候都會(huì)調(diào)用WebViewClient類的shouldOverrideUrlLoading(WebView view, String url)方法這一特性波势,我們可以針對(duì)參數(shù)的url定義好特殊的schema協(xié)議,來調(diào)用native提供的不同的邏輯拴曲;首先我們需要為WebView設(shè)置WebViewClient對(duì)象凛忿;接著重寫shouldOverrideUrlLoading(WebView view, String url)方法;
? ? ? ? 這里先說明下App的schema,我們需要針對(duì)我們app定義一套自己的schema規(guī)范侄非;schema指就是與H5約束好的字符串逞怨。h5在調(diào)用native方法的時(shí)候福澡,需要以約束好的schema為協(xié)議,調(diào)用native方法革砸。比如 nativeApp://xxxPath?xxxParam=yyy; 其中:nativeApp字符串指schame協(xié)議名稱算利,每個(gè)App自己取就可以,我們只攔截該協(xié)議下的url請(qǐng)求效拭,其他的可以不處理;xxxPath指關(guān)鍵路徑慕的,對(duì)應(yīng)自己的native功能挤渔,比如nativeApp://login?表示調(diào)用本地登錄界面等等;xxxParam=yyy嫉父,表示傳遞的參數(shù)眼刃,比如nativeApp://login?name=wang;
2鸟整、攔截alert、prompt、confirm處理方法
? ? ? ?該方式與上面的攔截處理類似吩抓,只是針對(duì)H5攔截的地方不同赴恨;H5端在調(diào)用window.alert("nativeApp://login?name=wang")時(shí),會(huì)調(diào)用WebChromeClient類的onJsAlert方法雨饺,我們?cè)谠摲椒ㄖ刑幚韘chema惑淳,調(diào)用native方法;
上面的實(shí)現(xiàn)是以alert攔截為實(shí)例移斩,其他的prompt绢馍、confirm完全也可以,一般與H5端約束好就可以
3猖任、addJavascriptInterface注冊(cè)Android對(duì)象供H5調(diào)用
? ? ??通過調(diào)用webView.addJavascriptInterface(對(duì)象實(shí)例, "對(duì)象名稱")方法瓷耙,注冊(cè)一個(gè)Android對(duì)象到H5端;注冊(cè)到H5的對(duì)象的方法需要添加@JavascriptInterface?注解室琢,這樣H5端才能正常調(diào)用落追;
H5端使用方式:window.appObject.alert(“我是H5來的提示”)就可以調(diào)用到native的方法
二轿钠、Android native端調(diào)用H5端方法
? ? ? ?Android?native目前通過WebView.loadUrl("javascript:方法名('參數(shù)')")來調(diào)用H5的方法;如H5有如下方法:
window.showCity = function(city){
???console.log("我是Native傳遞來的城市:"+city)
}
Android調(diào)用:
?mWebView.loadUrl(“javascript:window.showCity('北京')”)症汹;
在Android版本大于4.4(SDK19)時(shí)贷腕,可以使用evaluateJavascript(js,callBack)來調(diào)用H5端方法咬展;如下:onReceiveValue(String value)的參數(shù)value是js方法的返回值瞒斩;