Android与JS互相调用以及注意

Posted lxjshuju

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android与JS互相调用以及注意相关的知识,希望对你有一定的参考价值。

近期项目中常常使用html5而android与JS调用常常会用到,这里记录一下,測试系统5.0以上。

这里先贴一下源代码

Activity:

package jwzhangjie.com.webviewandjs;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.javascriptInterface;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = (WebView)findViewById(R.id.webView);
        initWebView();
    }

    private void initWebView(){
        //设置编码
        webView.getSettings().setDefaultTextEncodingName("utf-8");
        //支持js
        webView.getSettings().setJavaScriptEnabled(true);
        //设置监听事件
        webView.setWebViewClient(new JieWewViewClient());
        //设置本地调用对象及其接口
        webView.addJavascriptInterface(new JavaScriptObject(getApplicationContext()), "toAndroid");
        //载入js
        webView.loadUrl("file:///android_asset/index.html");
    }

    public void javaCallJsNoParams(View view){
        webView.loadUrl("javascript:javaCallJsNoParamsMethod()");
    }

    public void javaCallJsHasParams(View view){
        webView.loadUrl("javascript:javaCallJsHasParamsMethod(‘" + 123 + "‘)");
    }

    public class JavaScriptObject {

        Context mContxt;

        public JavaScriptObject(Context mContxt) {
            this.mContxt = mContxt;
        }

        @JavascriptInterface //sdk17版本号以上加上注解
        public void jsCallJavaNoParams() {
            Toast.makeText(mContxt, "Js调用Java方法(无參)", Toast.LENGTH_LONG).show();
        }

        @JavascriptInterface //sdk17版本号以上加上注解
        public void jsCallJavaHasParams(String params) {
            Toast.makeText(mContxt, "Js调用Java方法(有參):" + params, Toast.LENGTH_SHORT).show();
        }
    }

    class JieWewViewClient extends WebViewClient{
        /**
         *  假设紧跟着
         *  webView.loadUrl("file:///android_asset/index.html");
         *  调用Js中的方法是不起作用的,必须页面载入完毕才干够
         */

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            webView.loadUrl("javascript:javaCallJsHasParamsMethod(‘" + 123 + "‘)");
        }
    }

}

html:

<!DOCTYPE HTML>
<HTML>
    <HEAD>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    </HEAD>
    <BODY>
        <div>
            <input type="text" id="showText" style="width:100%;height:100px;margin-bottom:10px" readonly>
            <input type="button" onclick="jsCallJavaNoParamsMethod()" value="Js调用Java方法(无參)">
            <input type="button" onclick="jsCallJavaHasParamsMethod(‘成功了‘)" value="Js调用Java方法(有參)">
        </div>
    </BODY>
    <script type="text/javascript" src="jquery.min.js"></script>
    <script type="text/javascript">
        function javaCallJsNoParamsMethod(){
               $(‘#showText‘).val("Java调用js方法,无參数");
        }

        function javaCallJsHasParamsMethod(params){
               $(‘#showText‘).val("Java调用Js方法。有參数:"+params);
        }

        function jsCallJavaNoParamsMethod(){
               toAndroid.jsCallJavaNoParams();
        }

        function jsCallJavaHasParamsMethod(params){
               toAndroid.jsCallJavaHasParams(params);
        }
    </script>
</HTML>
界面:

技术分享

注意点:

1、Android系统17以及以上,js调用java须要在方法上面增加@JavascriptInterface

2、不能在载入html页面的以下直接调用js方法,应该在WebViewClient的onPageFinished里面载入,原则就是必须html载入完毕后。才干调用js中的方法。


源代码:http://download.csdn.net/download/jwzhangjie/9020941 






以上是关于Android与JS互相调用以及注意的主要内容,如果未能解决你的问题,请参考以下文章

js与原生的交互

Unity与Android Studio互相调用

转载 -- 基于原生JS与OC方法互相调用并传值(附HTML代码)

Android(H5)互相调用方法

Android混合开发之WebViewJavascriptBridge实现JS与java安全交互

C#与JavaScript互相调用