Android之Webview使用Java代码和JS相互调用

本文主要记录一些零碎的东西

最近由于项目的需要,需要使用Java代码和JS相互调用,特此记录一点入门的东西,仅仅是入门而已

github: https://github.com/CL-window/java_webview_js.git

Android之Webview使用Java代码和JS相互调用_第1张图片

话不多说,肯定是分为两块的

1.java 调用 js:

/**
         * method here will not load html ,only load js ,just js
         * will call back in {@link android.webkit.WebChromeClient#onJsAlert(
         * android.webkit.WebView, java.lang.String, java.lang.String, android.webkit.JsResult)}
         * 在log 里可以查看  test is ok
         */
        mWebView.loadUrl("javascript:" + JS_FUNCTION);//注入js函数
//        mWebView.loadUrl("javascript:" + initAssertJSToString("testJs.js"));// read from file is also ok
        mWebView.loadUrl("javascript:jsFun("+"I am param"+")");//调用js函数
//        mWebView.loadUrl("javascript:justTest("+TOP_SID+","+SUB_SID+")");// double param is also ok
这里使用webview , 其实没有必要加载一个html 文件,然后在html 文件里运行js,可以直接注入一段 js 代码,然后调用

本案例使用的就是这样的方式,webveiw其实没有显示任何东西

final static String JS_FUNCTION =
            "function jsFun(msg) {\n" +
            "          alert(\"jsFun...\" + msg); " +
            "           }";

2.js 调用 java:

/**
         * js ---调用---> java  test is ok
         */
        mWebView.addJavascriptInterface(new JSBridge(),"slack");
        mWebView.loadUrl("file:///android_asset/index.html");// loadUrl ok

需要用到一个注解@JavascriptInterface

本地接口类

public class JSBridge {
        @JavascriptInterface
        public void jsMessage(String message) {
            Log.i(TAG, "jsMessage" + message);
            Toast.makeText(MainActivity.this,message,Toast.LENGTH_SHORT).show();
        }
    }

本地 assert 下 的 index.html




    
    
    webview index
    
    

    
    

    





    

html代码里有我测试的 页面一加载就调用j s的测试代码

webview 加载网络地址记得权限


    

看看全部的 mainActivity,需要注意webView的回收,

import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.ConsoleMessage;
import android.webkit.JavascriptInterface;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "WebView";
    private WebView mWebView;
    private FrameLayout mRootView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);
        mRootView = (FrameLayout) findViewById(R.id.activity_main);
        initWebView();
    }

    private String initAssertJSToString(String assetName) {
        InputStream is = null;
        BufferedReader br = null;
        try {
            is = getAssets().open(assetName);
            StringBuilder sb = new StringBuilder();
            String line;
            br = new BufferedReader(new InputStreamReader(is));
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
            return sb.toString();
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    //
                }
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    //
                }
            }
        }
    }

    @SuppressLint("SetJavaScriptEnabled")
    private void initWebView() {

        /**
         * 不在xml中定义 Webview ,而是在需要的时候在Activity中创建,
         * 并且Context使用 getApplicationgContext()
         */
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
                FrameLayout.LayoutParams.MATCH_PARENT,FrameLayout.LayoutParams.MATCH_PARENT);

        mWebView = new WebView(getApplicationContext());
        mWebView.setLayoutParams(params);
        mRootView.addView(mWebView,0);

        WebSettings setting = mWebView.getSettings();
        /**
         * 支持javascript脚本  会 产生 跨站脚本攻击
         */
        setting.setJavaScriptEnabled(true);

        /**
         * 设置编码
         */
        setting.setDefaultTextEncodingName("utf-8");

        /**
         * 设置自适应屏幕,两者合用
         */
        setting.setUseWideViewPort(true); //将图片调整到适合webview的大小
        setting.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

        setting.setSupportZoom(true); // 支持缩放
        setting.setBuiltInZoomControls(true); // 支持手势缩放
        setting.setDisplayZoomControls(false); //隐藏原生的缩放控件

        /**
         * 缓存模式如下:
         * LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
         * LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
         * LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
         * LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
         */
        setting.setCacheMode(WebSettings.LOAD_NO_CACHE); //关闭webview中缓存
        setting.setAllowFileAccess(true); //设置可以访问文件
        setting.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
        setting.setLoadsImagesAutomatically(true); //支持自动加载图片
        setting.setDefaultTextEncodingName("utf-8");//设置编码格式


        setting.setPluginState(WebSettings.PluginState.ON);

        mWebView.setWebViewClient(new WebViewClient() {

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                Log.i(TAG, "onPageStarted..." + url);
            }

            @Override
            public void onLoadResource(WebView view, String url) {
                super.onLoadResource(view, url);
//                Log.i(TAG, "onLoadResource..." + url);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
//                Log.i(TAG, "onPageFinished..." + url);
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
                Log.i(TAG, "onReceivedError..." + error);
            }
        });


        mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
//                Log.i(TAG, "onProgressChanged..." + newProgress);
            }

            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
//                Log.i(TAG, "onReceivedTitle..." + title);
            }

            /**
             * 设置响应js 的Alert()函数
             * W/WebViewCallback: Unable to create JsDialog without an Activity
             * new  AlertDialog.Builder ...
             */
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                Log.i(TAG, "onJsAlert..." + message);
                return super.onJsAlert(view, url, message, result);
            }

            /**
             * 设置响应js 的Confirm()函数
             * new  AlertDialog.Builder ...
             */
            @Override
            public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
                return super.onJsConfirm(view, url, message, result);
            }

            /**
             * 设置响应js 的Confirm()函数
             * 需要自定一个提示的布局文件
             */
            @Override
            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
                return super.onJsPrompt(view, url, message, defaultValue, result);
            }

            @Override
            public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
//                Log.i(TAG,"onConsoleMessage : " + consoleMessage.message());
                return super.onConsoleMessage(consoleMessage);
            }

        });

    }


    public void startConnectWeb(View view) {
//        mWebView.loadUrl("http://www.baidu.com/"); // ok
//        mWebView.loadData(HTML_CODE,"text/html","uft-8"); // ok

        /**
         * js ---调用---> java  test is ok
         */
        mWebView.addJavascriptInterface(new JSBridge(),"slack");
        mWebView.loadUrl("file:///android_asset/index.html");// loadUrl ok
    }


    /**
     * java ---调用---> js   need startConnectWeb first ,test is ok
     */
    public void javaCallJs(View view) {
//        mWebView.loadUrl("javascript:javaCallJs('java call js')");

        /**
         * method here will not load html ,only load js ,just js
         * will call back in {@link android.webkit.WebChromeClient#onJsAlert(
         * android.webkit.WebView, java.lang.String, java.lang.String, android.webkit.JsResult)}
         * 在log 里可以查看  test is ok
         */
        mWebView.loadUrl("javascript:" + JS_FUNCTION);//注入js函数
//        mWebView.loadUrl("javascript:" + initAssertJSToString("testJs.js"));// read from file is also ok
        mWebView.loadUrl("javascript:jsFun("+"I am param"+")");//调用js函数
//        mWebView.loadUrl("javascript:justTest("+TOP_SID+","+SUB_SID+")");// double param is also ok
    }

    public class JSBridge {
        @JavascriptInterface
        public void jsMessage(String message) {
            Log.i(TAG, "jsMessage" + message);
            Toast.makeText(MainActivity.this,message,Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        /**
         * 激活WebView为活跃状态,能正常执行网页的响应
         */
        mWebView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        /**
         * onPause动作通知内核暂停所有的动作,比如DOM的解析、plugin的执行、JavaScript执行
         */
        mWebView.onPause();
    }

    @Override
    protected void onDestroy() {

        /**
         * 先让 WebView 加载null内容,然后移除 WebView,再销毁 WebView,最后置空
         */
        if (mWebView != null) {
            mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
            /**
             * 清理cache 和历史记录
             */
            mWebView.clearCache(true);
            mWebView.clearHistory();
            /**
             * 销毁 Webview
             * Webview调用destory时
             * Webview仍绑定在Activity
             */
            mRootView.removeView(mWebView);
            mWebView.destroy();
            mWebView = null;
        }

        super.onDestroy();
    }

    @Override
    public void onBackPressed() {
        System.exit(0);
    }

    final static String JS_FUNCTION =
            "function jsFun(msg) {\n" +
            "          alert(\"jsFun...\" + msg); " +
            "           }";

    final static String HTML_CODE =
        "   \n" +
        "         " +
        "           \n" +
        "           " +
        "           webview index" +
        "           " +
        "       \n" +
        "       " +
        "           "+
        "       \n" +
        "   ";
}


你可能感兴趣的:(Android之Webview使用Java代码和JS相互调用)