android 通过WebView与javascript实现数据交互

jerry Android 2015年11月23日 收藏

在看懂这篇文章之前首先要有javascript基础。

(1) js调用android的方法:

WebView wView;

wView. addJavascriptInterface (Object obj, String interfaceName);

是实例化一个对象,在html的js中调用,第二个参数是实例化对象的别名,如果要使用这个obj,则在js中使用的名字

就是interfaceName。

  1. public class jsWebDemo extends Activity {
  2. WebView wView
  3.  
  4. /** Called when the activity is first created. */
  5. @Override
  6. public void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.main);
  9. wView = (WebView)findViewById(R.id.wv1);
  10. WebSettings wSet = wView.getSettings();
  11. wSet.setJavaScriptEnabled(true);
  12.  
  13. ProxyBridge pBridge = new ProxyBridge();
  14. wView.addJavascriptInterface(pBridge, "AliansBridge");
  15. wView.loadUrl("file:///android_asset/index.html");
  16. }
  17. private class ProxyBridge {
  18. public int one () {
  19. return 1;
  20. }
  21. }
  22. }

来看一下index.html的内容:

  1. <html>
  2. <mce:script language="javascript"><!--
  3. /* This function is invoked by the activity */
  4. function wave() {
  5. alert("1");
  6. document.getElementById("droid").src="android_waving.png";
  7. alert("2");
  8. }
  9. // --></mce:script>
  10. <body>
  11. <div id="output">Test page.</div>
  12.  
  13. <a onClick="window.demo.clickOnAndroid()">
  14. <div style="width:100px;
  15. margin:0px auto;
  16. padding:10px;
  17. text-align:center;
  18. border:2px solid #202020;" >
  19. <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br>
  20. Click me!
  21. </div>
  22. </a>
  23. <input type="submit" value="change to 1" onclick="document.getElementById('output').innerHTML
  24.  
  25. =AliansBridge.one()" />
  26. </body>
  27. </html>

这里的AliansBridge即是调用的JAVA对象。

要注意的是,如果你只有一个方法需要被js调用只new一个对象就行:

ProxyBridge pBridge = new ProxyBridge();

wView.addJavascriptInterface(pBridge, "AliansBridge");

如果你需要调用好多个方法,就要把整个android程序所在的类本身实例化传递进去:

wView.addJavascriptInterface(this, "AliansBridge");

(2) android调用js的方法:wView.setWebChromeClient (WebChromeClient client)

要用到Handler更新UI,Handler mHandler = new Handler();

  1. mWebView.setWebChromeClient(new MyWebChromeClient());
  2. mWebView.addJavascriptInterface(new Object(){
  3. /**
  4. * This is not called on the UI thread. Post a runnable to invoke
  5. * loadUrl on the UI thread.
  6. */
  7. public void clickOnAndroid() {
  8. mHandler.post(new Runnable() {
  9. public void run() {
  10. mWebView.loadUrl("javascript:wave()");
  11. }
  12. });
  13. }
  14. }, "demo");

同理,在html中必须有一个名为demo的对象调用clickOnAndroid()方法。

  1. /**
  2. * Provides a hook for calling "alert" from javascript. Useful for
  3. * debugging your javascript.
  4. */
  5. final class MyWebChromeClient extends WebChromeClient {
  6. @Override
  7. public boolean onJsAlert(WebView view, String url, String message,
  8. JsResult result) {
  9. result.confirm();
  10. return super.onJsAlert(view, url, message, result);
  11. }
  12. }