> 文档中心 > Android webview中JavaScript与Java方法的相互调用Demo

Android webview中JavaScript与Java方法的相互调用Demo

 

 

阅读博客前,希望大家对webview有一定了解,此博客只解决JavaScript和Java之间的相互调用。

 

意义:JavaScript和java语言彼此可以利用对方的方法,彼此可以互传数据

test.html代码:

         function writeHello(){     document.write("

Hello World!

"); }

头部

体部

 

 

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()完成调用,

        function writeHello(){      window.jsToJava.test();      document.write("

Hello World!

"); }

头部

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的运算过程

         function writeHello(ms){    window.jsToJava.test("abc"+ms);//调用java的方法 “window + java对象 + java对象方法”    document.write("

Hello World!

"); }

头部

体部

案例Demo下载地址: http://download.csdn.net/detail/nmyangmo/9868276