阅读博客前,希望大家对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>
没有积分可添加我的微信