webview

本文深入探讨WebView在Android和iOS平台的使用,包括加载网页、交互实现、性能优化及安全注意事项,帮助开发者更好地集成和利用WebView进行混合开发。
摘要由CSDN通过智能技术生成
public class WebViewActivity extends AppCompatActivity {

    private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view);

        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
            WebView.setWebContentsDebuggingEnabled(true);
        }

        mWebView = findViewById(R.id.webview);

        //WebView.loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding
        // , String historyUrl))的五个参数:baseUrl表示基础的网页,data表示要加载的内容
        // ,mimeType表示加载网页的类型,encoding表示编码格式,historyUrl表示可用历史记录,可以为值。

//        mWebView.loadUrl("http://www.baidu.com/");
//        mWebView.loadUrl("file://" + Environment.getExternalStorageDirectory().getPath() + "/1/index.html");
//        mWebView.loadUrl("file:///android_asset/index.html");
//        mWebView.loadData("<h1>这是我们通过loadData添加进来的内容</h1>","text/html; charset=utf-8", null);
//        https://www.imooc.com/static/img/index/logo.png
//        mWebView.loadDataWithBaseURL("https://www.imooc.com/"
//        , "<img src=\"static/img/index/logo.png\"/><a href=\"http://www.baidu.com\">toBaiDu.com</a>"
//        , "text/html", "utf-8","http://www.sogou.com/");
        mWebView.loadUrl("http://192.168.2.124:3000/");
//        mWebView.loadUrl("http://192.168.2.128:3000/");

        mWebView.addJavascriptInterface(new DemoJsObject(), "android");

        //
        mWebView.setWebViewClient(new WebViewClient() {

            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
                Log.e("WebViewActivity", "webview-》onReceivedError : 加载了url:" + failingUrl + " - 错误描述:" + description + " - 错误代码:" + errorCode);
                view.loadUrl("http://192.168.2.124:3000/");
            }


            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
                Log.e("WebViewActivity", "webview-》onReceivedError (android6.0以上调用) : 加载了url:" + request.getUrl().toString() + " - 错误描述:" + error.getDescription() + " - 错误代码:" + error.getErrorCode());
            }

            //
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Log.e("WebViewActivity", "webview-》shouldOverrideUrlLoading : 加载了url:" + url);
                if ("http://www.baidu.com/".equals(url)) {
//                    view.loadUrl("http://www.sogou.com/");
                    Toast.makeText(WebViewActivity.this, "webview-》shouldOverrideUrlLoading : 加载了url:" + url, Toast.LENGTH_SHORT).show();
                    return true;
                }

                Uri uri = Uri.parse(url);
                if ("android".equals(uri.getScheme())) {
                    String functionName = uri.getAuthority();
                    if ("print".equals(functionName)) {
                        String msg = uri.getQueryParameter("msg");
                        print(msg);
                        return true;
                    }
                }

                return super.shouldOverrideUrlLoading(view, url);
            }

            //
            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                Log.e("WebViewActivity", "webview-》shouldOverrideUrlLoading(Android7.0以上调用) : 加载了url:" + request.getUrl().toString());
                return super.shouldOverrideUrlLoading(view, request);
            }

            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                WebResourceResponse result = super.shouldInterceptRequest(view, url);
                Log.e("WebViewActivity", "webview-》shouldInterceptRequest请求了url:" + url);
                Log.e("WebViewActivity", "result = " + result);
//                if ("http://www.baidu.com/".equals(url)) {
//                    return new WebResourceResponse("text/html", "utf-8", null);
//                }
                return result;
            }

            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                Log.e("WebViewActivity", "webview-》shouldInterceptRequest请求了(android5.0之上调用)url:" + request.getUrl().toString());
                return super.shouldInterceptRequest(view, request);
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                Log.e("WebViewActivity", "webview-》onPageStarted 网页开始进行加载url:" + url);
            }

            @Override
            public void onLoadResource(WebView view, String url) {
                super.onLoadResource(view, url);
                Log.e("WebViewActivity", "webview-》onLoadResource 网页开始加载资源url:" + url);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                Log.e("WebViewActivity", "webview-》onPageFinished 网页已经加载完成url:" + url);
            }
        });

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

            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
                Log.e("webViewActivity", "title:" + title);
            }

            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                boolean res = super.onJsAlert(view, url, message, result);
                res = true;
                Log.e("webViewActivity", "onJsAlert - url : " + url + " - message : " + message + "  - res : " + res);
                Toast.makeText(WebViewActivity.this, message, Toast.LENGTH_SHORT).show();
                result.confirm();
                return res;
            }

            @Override
            public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
                boolean res = super.onJsConfirm(view, url, message, result);
                res = true;
                Log.e("webViewActivity", "onJsConfirm - url : " + url + " - message : " + message + "  - res : " + res);
                AlertDialog.Builder builder = new AlertDialog.Builder(WebViewActivity.this);
                builder.setMessage(message);
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        result.confirm();
                    }
                });

                builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        result.cancel();
                    }
                });
                builder.create().show();
                return res;
            }

            @Override
            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) {
                boolean res = super.onJsPrompt(view, url, message, defaultValue, result);
                res = true;
                Log.e("webViewActivity", "onJsConfirm - url : " + url + " - message : " + message + " - defaultValue : " + defaultValue + "  - res : " + res);
                AlertDialog.Builder builder = new AlertDialog.Builder(WebViewActivity.this);
                builder.setMessage(message);
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        result.confirm("这是点击了确定按钮之后的输入框内容");
                    }
                });

                builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        result.cancel();
                    }
                });
                builder.create().show();
                return res;
            }
        });

        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);//支持Js
        webSettings.setSupportZoom(true);
        webSettings.setBuiltInZoomControls(true);
        webSettings.setDisplayZoomControls(true);
        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        mWebView.clearCache(true);
    }

//    public void onCanGoBack (View v) {
//        Toast.makeText(this, String.valueOf(mWebView.canGoBack()), Toast.LENGTH_SHORT).show();
//    }
//
//    public void onGoBack (View v) {
//        mWebView.goBack();
//    }
//
//    public void onCanGoForward (View v) {
//        Toast.makeText(this, String.valueOf(mWebView.canGoForward()), Toast.LENGTH_SHORT).show();
//    }
//
//    public void onGoForward (View v) {
//        mWebView.goForward();
//    }
//
//    public void onCanGoBackOrForward (View v) {
//        int steps = Integer.valueOf(((EditText)findViewById(R.id.steps)).getText().toString());
//        Toast.makeText(this, String.valueOf(mWebView.canGoBackOrForward(steps)), Toast.LENGTH_SHORT).show();
//    }
//
//    public void onGoBackOrForward (View v) {
//        int steps = Integer.valueOf(((EditText)findViewById(R.id.steps)).getText().toString());
//        mWebView.goBackOrForward(steps);
//    }
//
//    public void onClearHistory (View v) {
//        mWebView.clearHistory();
//    }

    public void onShowAlertFromloadUrl(View v) {
        mWebView.loadUrl("javascript:showAlert()");
    }

    public void onSumFromloadUrl(View v) {
        mWebView.loadUrl("javascript:alert(sum(2, 3))");
    }

    public void onSumFromEVJS(View v) {
        mWebView.evaluateJavascript("javascript:sum(2, 3)", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String s) {
                Toast.makeText(WebViewActivity.this, "evaluateJavascript - " + s, Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void print(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        String result = "这是android的返回值";
        mWebView.loadUrl("javascript:showAlert('" + result + "')");
    }

    @Override
    protected void onPause() {
        super.onPause();

        mWebView.onPause();
//        mWebView.pauseTimers();不靠谱
    }

    @Override
    protected void onResume() {
        super.onResume();

        mWebView.onResume();
//        mWebView.resumeTimers();不靠谱
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        mWebView.destroy();
    }
}
import android.util.Log;
import android.webkit.JavascriptInterface;

/*

 */

public class DemoJsObject {

    @JavascriptInterface
    public String print(String msg) {
        Log.e("DemoJsObject", "msg :" + msg);
        return "这是android的返回值";
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Android-WebView</title>
</head>
<body>
<h1>这是我们在资源目录下中加载的网页</h1>

</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值