閱讀博客前,希望大家對webview有一定了解,此博客只解決JavaScript和Java之間的相互調用。
意義:JavaScript和java語言彼此可以利用對方的方法,彼此可以互傳數據
test.html代碼:
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <script type="text/javascript"> function writeHello(){ document.write("<h1>Hello World!</h1>"); } </script> <h1>頭部</h1> </head> <body > <h2 id="h2">體部</h2> </body> </html>
1、webview調用html中的JavaScript代碼
(1) 首先保證webview支持JavaScript
webView.getSettings().setJavaScriptEnabled(true);
(2)加載靜態本地頁面地址或網頁地址
webView.loadUrl("file:///android_asset/test.html");
(3)調用test.html中writeHello方法 webView對象直接調用loadUrl("javascript:js方法名");
webView.loadUrl("javascript: writeHello()");
2、html調用java中的方法
(1) 首先創建一個類JsToJava.java,並實現JS需要的邏輯test(),test()作爲js要調用的方法需用@JavascriptInterface標註
(2)通過webView.addJavascriptInterface(new JsToJava(), "jsToJava")方法向html映射JsToJava類的對象jsToJava,使js 的window內置對象中產生對象jsToJava對象
(3)在html的script中通過window.jsToJava.test()完成調用,
<head> <meta charset="utf-8"> <script type="text/javascript"> function writeHello(){ window.jsToJava.test();<--調用jsToJava對象的test()方法!--> document.write("<h1>Hello World!</h1>"); } </script> <h1>頭部</h1> </head>
3、通過傳參完成數據傳遞Message next() { final long ptr = mPtr; if (ptr == 0) { return null; } int pendingIdleHandlerCount = -1; // -1 only during first iteration int nextPollTimeoutMillis = 0; for (;;) { if (nextPollTimeoutMillis != 0) { Binder.flushPendingCommands(); } nativePollOnce(ptr, nextPollTimeoutMillis); synchronized (this) { // Try to retrieve the next message. Return if found. final long now = SystemClock.uptimeMillis(); Message prevMsg = null; Message msg = mMessages; if (msg != null && msg.target == null) { do { prevMsg = msg; msg = msg.next; } while (msg != null && !msg.isAsynchronous()); } if (msg != null) { if (now < msg.when) { nextPollTimeoutMillis = (int) Math.min(msg.when - now, Integer.MAX_VALUE); } else { // Got a message. mBlocked = false; if (prevMsg != null) { prevMsg.next = msg.next; } else { mMessages = msg.next; } msg.next = null; if (DEBUG) Log.v(TAG, "Returning message: " + msg); msg.markInUse(); return msg; } } else { // No more messages. nextPollTimeoutMillis = -1; } if (mQuitting) { dispose(); return null; } if (pendingIdleHandlerCount < 0 && (mMessages == null || now < mMessages.when)) { pendingIdleHandlerCount = mIdleHandlers.size(); } if (pendingIdleHandlerCount <= 0) { // No idle handlers to run. Loop and wait some more. mBlocked = true; continue; } if (mPendingIdleHandlers == null) { mPendingIdleHandlers = new IdleHandler[Math.max(pendingIdleHandlerCount, 4)]; } mPendingIdleHandlers = mIdleHandlers.toArray(mPendingIdleHandlers); } for (int i = 0; i < pendingIdleHandlerCount; i++) { final IdleHandler idler = mPendingIdleHandlers[i]; mPendingIdleHandlers[i] = null; // release the reference to the handler boolean keep = false; try { keep = idler.queueIdle(); } catch (Throwable t) { Log.wtf(TAG, "IdleHandler threw exception", t); } if (!keep) { synchronized (this) { mIdleHandlers.remove(idler); } } } pendingIdleHandlerCount = 0; nextPollTimeoutMillis = 0; } }
(1)webview給js傳參:webView.loadUrl("javascript: writeHello('111')";
(2)js調用java方法並傳參:window.jsToJava.test("abc");
在java調用的js方法中再調用java對象的方法可完成數據的java運算處理-->js運算處理-->java的運算過程
案例Demo下載地址:http://download.csdn.net/detail/nmyangmo/9868276<html> <head> <meta charset="utf-8"> <script type="text/javascript"> function writeHello(ms){ window.jsToJava.test("abc"+ms);//調用java的方法 “window + java對象 + java對象方法” document.write("<h1>Hello World!</h1>"); } </script> <h1>頭部</h1> </head> <body > <h2 id="h2">體部</h2> </body> </html>