android 的webView載入h5,和h5的互動(java和JavaScript的互動)
Android提供了一個很強大的WebView控制元件用來處理Web網頁,而在網頁中,JavaScript又是一個很舉足輕重的指令碼。本文將介紹如何實現Java程式碼和Javascript程式碼的相互呼叫。(通俗點說就是,點選那個Web頁面的按鈕啥的,可以傳到原生app;或者原生app呼叫Web頁面的js方法)
如何實現
實現Java和js互動十分便捷。通常只需要以下幾步。
- WebView開啟JavaScript指令碼執行
- WebView設定供JavaScript呼叫的互動介面。
- 客戶端和網頁端編寫呼叫對方的程式碼。
本例程式碼
為了便於講解,先貼出全部程式碼
Java程式碼
package com.example.testjs;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
//參考文件http://www.igooda.cn/jzjl/20141212737.html
public class MainActivity extends Activity {
private static final String LOGTAG = "MainActivity";
@SuppressLint("JavascriptInterface")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final WebView myWebView = (WebView) findViewById(R.id.myWebView);
WebSettings settings = myWebView.getSettings();
settings.setJavaScriptEnabled(true);
//注入介面
//js_java_interaction.html檔案中的toastMessage(),sumToJava()方法中的window後面的欄位
myWebView.addJavascriptInterface(new JsInteration(), "control");
myWebView.setWebChromeClient(new WebChromeClient() {});
myWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
testMethod(myWebView);
}
});
myWebView.loadUrl("file:///android_asset/js_java_interaction.html");
}
private void testMethod(WebView webView) {
// 只能一次
// String call = "javascript:sayHello()";
//
// String call = "javascript:alertMessage(\"" + "content" + "\")";
//
// String call = "javascript:toastMessage(\"" + "content" + "\")";
String call = "javascript:sumToJava(1,2)";
webView.loadUrl(call);
}
//返回結果的處理
public class JsInteration {
@JavascriptInterface
public void toastMessage(String message) {
Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
}
// onSumResult欄位和 window.control.onSumResult(number1 + number2)中的onSumResult一樣
@JavascriptInterface
public void onSumResult(int result) {
Log.i(LOGTAG, "onSumResult result=" + result);
}
}
}
前端網頁程式碼
<html>
<script type="text/javascript">
function sayHello() {
alert("Hello")
}
function alertMessage(message) {
alert(message)
}
function toastMessage(message) {
window.control.toastMessage(message)
}
function sumToJava(number1, number2){
window.control.onSumResult(number1 + number2)
}
</script>
Java-Javascript Interaction In Android
</html>
下面介紹下
如何呼叫
(1)addJavascriptInterface方法
此方法有兩個引數,第一個引數就是我們一般會實現一個自己的類,類裡面提供我們要提供給javascript訪問的方法;第二個引數是訪問我們在obj中宣告的方法時候所用到的js物件,呼叫模式為window.interfaceName.方法名()或者是javascript:
interfaceName.方法名() ;,如myWebView.addJavascriptInterface(new JsInteration(), "control");
(2)js呼叫Java
呼叫格式為window.jsInterfaceName.methodName(parameterValues) 此例中我們使用的是control作為注入介面名稱。
function toastMessage(message) {
window.control.toastMessage(message)
}
function sumToJava(number1, number2){
window.control.onSumResult(number1 + number2)
}
(3)Java呼叫JS
webView呼叫js的基本格式為webView.loadUrl(“javascript:methodName(parameterValues)”)
呼叫js無參無返回值函式
String call = "javascript:sayHello()";
webView.loadUrl(call);
呼叫js有參無返回值函式
注意對於字串作為引數值需要進行轉義雙引號。
String call = "javascript:alertMessage(\"" + "content" + "\")";
webView.loadUrl(call);
呼叫js有引數有返回值的函式
Android在4.4之前並沒有提供直接呼叫js函式並獲取值的方法,所以在此之前,常用的思路是 java呼叫js方法,js方法執行完畢,再次呼叫java程式碼將值返回。
1.Java呼叫js程式碼
String call = "javascript:sumToJava(1,2)";
webView.loadUrl(call);
2.js函式處理,並將結果通過呼叫java方法返回
function sumToJava(number1, number2){
window.control.onSumResult(number1 + number2)
}
3.Java在回撥方法中獲取js函式返回值
@JavascriptInterface
public void onSumResult(int result) {
Log.i(LOGTAG, "onSumResult result=" + result);
}
4.4處理
Android 4.4之後使用evaluateJavascript即可。這裡展示一個簡單的互動示例 具有返回值的js方法
function getGreetings() {
return 1;
}
java程式碼時用evaluateJavascript方法呼叫
private void testEvaluateJavascript(WebView webView) {
webView.evaluateJavascript("getGreetings()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.i(LOGTAG, "onReceiveValue value=" + value);
}});
}
輸出結果
I/MainActivity( 1432): onReceiveValue value=1
注意
- 上面限定了結果返回結果為String,對於簡單的型別會嘗試轉換成字串返回,對於複雜的資料型別,建議以字串形式的json返回。
- evaluateJavascript方法必須在UI執行緒(主執行緒)呼叫,因此onReceiveValue也執行在主執行緒。
還有一些錯誤的話可以參考,程式碼混淆的話參考原文: http://www.igooda.cn/jzjl/20141212737.html
最後貼下文中使用的demo吧:http://www.oschina.net/code/snippet_2702417_58168
當然如果覺得這邊不太好的話還可以看看:http://www.cnblogs.com/lee0oo0/archive/2012/08/01/2617953.html
android 和h5互動基礎篇http://www.jianshu.com/p/a25907862523?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io http://www.jianshu.com/p/a25907862523?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
相關文章
- Android Webview Java和Javascript安全互動AndroidWebViewJavaScript
- Android和H5之間的互動AndroidH5
- Android中Java和JavaScript互動AndroidJavaScript
- Android WebView —— Java 與 JavaScript 互動總結AndroidWebViewJavaScript
- Android 原生 WebView 與 JavaScript 互動AndroidWebViewJavaScript
- h5 和native 互動那些事兒H5
- h5和ios互動要注意什麼?H5iOS
- 【quickhybrid】H5和Native互動原理UIH5
- WKWebView和WebView與JS的互動方式WebViewJS
- iOS與H5互動iOSH5
- H5 與 APP 互動!H5APP
- JavaScript和CSS的互動方法JavaScriptCSS
- Android webview JS 互動AndroidWebViewJS
- webview與JS的互動WebViewJS
- WebView深度學習(一)之WebView的基本使用以及Android和js的互動WebView深度學習AndroidJS
- Android在WebView中載入HTML並實現互動AndroidWebViewHTML
- swift之與h5之間的互動(一)SwiftH5
- WebView和js的互調WebViewJS
- iOS 和 H5 互動那些事 (UIWebView、WKWebView 總結篇)iOSH5UIWebView
- Android混合開發之WebView與Javascript互動AndroidWebViewJavaScript
- 5種JavaScript和CSS互動的方法JavaScriptCSS
- WebView和H5的那點事WebViewH5
- Android webview 與 js(Vue) 互動AndroidWebViewJSVue
- Android與WebView資料互動AndroidWebView
- JavaScript和Objective-C互動的那些事JavaScriptObject
- WebView詳解與簡單實現Android與H5互調WebViewAndroidH5
- iOS高階-WebView & JavaScript互動(附DEMO)iOSWebViewJavaScript
- H5與安卓/IOS進行原生互動H5安卓iOS
- h5與native互動總結1H5
- flutter和Android原生互動FlutterAndroid
- Android 與WebView中的js程式碼的互動記錄AndroidWebViewJS
- android中webView載入H5,JS不能呼叫問題的解決AndroidWebViewH5JS
- 5種你未必知道的JavaScript和CSS互動的方法JavaScriptCSS
- WPF和js互動 WebBrowser資料互動JSWeb
- react native 和原生平臺 android的互動React NativeAndroid
- WebView與JS的互動,以及注意事項WebViewJS
- AS與.net的互動——載入web上的xmlWebXML
- Android中程式與Service互動的方式——互動方式Android