Android下WebView中Java与JavaScript通信

背景介绍


Android下面WebView开发,有时候需要调用底层的一部分接口,而这部分接口只有Android的SDK才提供相关的功能,这个时候就需要进行Java与JavaScript通信。

例子


  1. 生成JavaScript调用Java函数的接口类
    public class AndroidJavaScript {
    	@JavascriptInterface
    	public String getJavaString() {
    		return new String("JavaString");
    	}
    }
  2. 开启 JavaScript支持,并向WebView注册接口
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.addJavascriptInterface(new AndroidJavaScript(), "Android");
  3. Html中调用接口例子
    <html>
        <head>
            <script type="text/javascript">
                var JavaString = window.Android.getJavaString()
                document.write(JavaString);
            </script>
        </head>
    </html>
  4. 销毁的时候,反注册接口,避免内存泄漏
    mWebView.removeJavascriptInterface("Android");
  5. 销毁的时候,WebView从父容器中移除,避免内存泄漏
    ViewParent viewParent = mWebView.getParent();
    if(viewParent instanceof ViewGroup) {
        ViewGroup viewGroup = (ViewGroup)viewParent;
        viewGroup.removeView(mWebView);
    }
    mWebView.destroy();

完整的例子代码如下(包含WebView的XML布局文件,请自行生成):

import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;

public class MainActivity extends Activity {

    WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mWebView = (WebView)findViewById(R.id.jsBridgeWebView);
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        mWebView.addJavascriptInterface(new AndroidJavaScript(), mJsInterfaceName);
        mWebView.loadDataWithBaseURL("blarg://ignored", mJsHtml, "text/html", "UTF-8", "");
    }

    @Override
    protected void onDestroy() {
        mWebView.removeJavascriptInterface(mJsInterfaceName);
        ViewParent viewParent = mWebView.getParent();
        if(viewParent instanceof ViewGroup) {
            ViewGroup viewGroup = (ViewGroup)viewParent;
            viewGroup.removeView(mWebView);
        }
        mWebView.destroy();
        super.onDestroy();
    }

    private static class AndroidJavaScript {
        @JavascriptInterface
        public String getString() {
            return new String("JavaString");
        }
    }

    private final String mJsInterfaceName = "Android";
    private final String mJsHtml = "<html>\n" +
            "\t<head>\n" +
            "\t\t<script type=\"text/javascript\">\n" +
            "\t\t\tvar str = window.Android.getString()\r\n" +
            "\t\t\tdocument.write(str)\n" +
            "\t\t</script>\n" +
            "\t</head>\n" +
            "</html>";
}

发布者

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注