1. 程式人生 > >Android和js程式碼互相呼叫

Android和js程式碼互相呼叫

在js中,有如下程式碼:

<script>
    //js呼叫安卓
  function sendDataToAndroid(){
    //呼叫android程式中的方法,並傳遞引數。
    var name = document.getElementById("name_input").value;
    //注意這裡的AndroidWebView和方法名chen
    window.AndroidWebView.chen(name);
  }

  //在android程式碼中呼叫js程式碼
  function dataFromAndroid(msg){
    alert("來自安卓的資訊:"
+msg); }
</script>

1、在js中呼叫安卓的話,安卓中寫法:

webView.addJavascriptInterface(new JsInterface_2(context), "AndroidWebView");
private class JsInterface_2 {
        private Context mContext;

        public JsInterface_2(Context context) {
            this.mContext = context;
        }

        //在js中呼叫window.AndroidWebView.chen(name),便會觸發此方法。
@JavascriptInterface public void chen(String name) { Log.e("name==" ,name); } }

2、安卓呼叫js中方法,給js傳值
注:這個方法要等網頁載入完,才有效。所以,要麼在網頁載入完的監聽裡呼叫,要麼,寫一個點選事件,等載入完了點選呼叫

傳單個值及多個值,見註釋

 //網頁返回鍵的處理
        webView.setOnKeyListener(new View.OnKeyListener() {

            @Override
            public
boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { if (keyCode == KeyEvent.KEYCODE_BACK) { //表示按返回鍵時的操作 if (webView.canGoBack()) { webView.goBack(); //後退 } else { //所在activity銷燬 finish(); } return true; //已處理 } } return false; } }); webView.setWebViewClient(new MyWebViewClient()); webView.setWebChromeClient(new MyChromeClient());
private class MyChromeClient extends WebChromeClient {
        @Override
        public void onProgressChanged(WebView view, int newProgress) {

            super.onProgressChanged(view, newProgress);
        }

        @Override
        public void onReceivedTitle(WebView view, String title) {
            // TODO Auto-generated method stub
            super.onReceivedTitle(view, title);

            LogU.i("網頁title-----" , title);

        }
    }
// webview設定的代理類
    private class MyWebViewClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            return super.shouldOverrideUrlLoading(view, url);

        }

        @Override
        public void onPageFinished(WebView view, String url) {
            view.getSettings().setJavaScriptEnabled(true);
            super.onPageFinished(view, url);
            Log.i("詳情頁載入完成-----" , url);

            //呼叫js中的程式碼,給網頁傳使用者id
            //傳多個值的方法。注意單引號的配對
            //webView.loadUrl("javascript:dataFromAndroid('" + userInfo.getUserId()+"','"+userInfo.getUserId() + "')");
            //傳單個值
            webView.loadUrl("javascript:dataFromAndroid('" + userInfo.getUserId() + "')");

        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Log.i("詳情頁開始載入-----" ,url);
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Log.i("詳情頁載入異常-----" , failingUrl);

            super.onReceivedError(view, errorCode, description, failingUrl);

        }
    }