随着H5性能的不断提升,虽然离原生APP还有一段不小的距离,但是WebAPP的体验比之当时,无疑是提升了不少。

今天介绍一个组件,可以实现将一个WebAPP->APP(俗称套壳APP? 大雾)

或者简单的理解——就是一个在AndroidAPP内浏览网页组件(小型的浏览器?)


WebView

概述

WebView组件是Android提供用于显示网页信息,它内置了WebKit引擎,所以我们可以把WebView当作一个轻量级的浏览器使用。

  • Webkit是一个开源的浏览器引擎,Chrome浏览器也是基于它

使用前也需要添加权限

<uses-permission android:name="android.permission.INTERNET"/>

使用WebView加载网页

基本使用介绍

  • 加载网页
webView.loadUrl("http://uuw.baidu.com");


 效果如?,效果将会是跳转到百度(一般会以浏览器打开,如果设置了默认的)

加载本地网页

webVieuloadUrl(file:///android-asset/XXX.html); //这里的格式是固定的,文件位置assets目录下
  • post方式传送参数
String postData = "clientID = cid & username = name";
webview.postUrl(url, EncodingUtils.getBytes(postData, "base64"));
webview.postUr(String url, byte[] postData) //加载页面使用Post方式, postData为参数
  • 使用loadData方法来加载html数据
//loadData()需要三个参数: HTML TAG ,MIME类型(text/html),网页编码方式(utf-8)
wv.loadData(content, "text/html","UTF-8");

Android 浏览器预览word 安卓web浏览器_Android 浏览器预览word

效果如? ,显示编写的html数据内容

简单测试

  • 布局文件 添加一个WebView
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <WebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/webView">
    </WebView>

</android.support.constraint.ConstraintLayout>
  • 完整代码 
package com.example.a4_17webview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;

public class MainActivity extends AppCompatActivity {
    private WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = findViewById(R.id.webView);
        //加载网页
        //webView.loadUrl("http://www.baidu.com");

        //loadData
        webView.loadData("<html><body>LOADDATA</body></html>","text/html","utf-8");
    }
}

参数设置

基本设置

WebSettings webSettings = webView.getSettings(); //获取设置
WebSettings.setSavePassword(false);//保存密码 
webSettings.setSaveFormData(false); //保存表单数据 
webSettings.setJavaScriptEnabled(true); //WebView默认是不支持
JavaScriptwebSettings.setSupportZoom(false); //缩放
webview.setScrollBarStyle(View.SCROLLBARS INSIDE OVERLAY); //在内容显示内部显webView.goBack(); //返回
webView.goForward(); //前进
webView.stoploadingl(); //停止加载
webView.requestFocusl();//如果不设置的话,会出现不能弹出软键盘等问题
//希望点击链接继续在当前browser中响应,必须覆盖WebViewClient对象
webView.setWebViewClient(new WebViewClient(){
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
       }
    });
//处理标题,图标
webView.setWebChromeClient(new WebChromeClient(){
    @Override
        public void onReceivedTitle(WebView view, String title) {
            super.onReceivedTitle(view, title);
        }
    });

简单测试

  • 完整代码:
package com.example.a4_17webview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {
    private WebView webView;

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

        //loadData
        //webView.loadData("<html><body>LOADDATA</body></html>","text/html","utf-8");

        /**参数设置**/
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setSupportZoom(true);
        settings.setBuiltInZoomControls(true);
        webView.requestFocus();
        webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);

        //希望点击链接继续在当前browser中响应,必须覆盖WebViewClient对象
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
        //处理标题,图标
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
            }
        });

        //加载网页
        webView.loadUrl("http://www.baidu.com");

    }
}

效果如? 

点击任意内容?

仍在当前WebView


但是上面的案例有个小问题,点击返回会直接退出程序,而不是预期的返回上一个页面。

比如上面演示的,访问百度后点击百度的任意内容,进入下一个内容,点返回不会返回百度,而是直接退出程序。

为了解决这个问题,我们进行

回退键设置 

重写onKeyDown方法

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

与JS的交互

WebView提供了addJavascriptInterface(Object obj,String interfaceName)这个方法。

但是在API17后Android官方限制javascript代码只能调用声明了@JavascriptInterface 注解的Java方法。

该方法将一个Java对象绑定到一个Javascript对象中,这样初始化webView后,在webView加载的页面就可以直接通过Javascript:window.demo访问到绑定的java对象。

  • Javascript对象名即interfaceName(demo)
  • Javascript作用域为Global

案例

建一个assets包 下面创建一个index.html文件 并书写html代码

Android 浏览器预览word 安卓web浏览器_html_02

  • index.html
<html>
    <head>
        <title>hello webview</title>
        <script language="JavaScript">
            function myfun(){
                document.getElementById("imgid").src="https://ss0.baidu.com/94o3dSag_xI4khGko9WTAnF6hhy/image/w%3D500/sign=c290a0a3d9ca7bcb7d7bc72f8e086b3f/cb8065380cd7912327430d14a3345982b2b7802b.jpg";
            }

        </script>
        <body>
            <a onclick="window.demo.clickOnAndroid()">
                <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1555663226281&di=ddc3da2be5311ade569ca4bc2c9b5f98&imgtype=0&src=http%3A%2F%2Fimg.evolife.cn%2F2014-12%2F89a506ac5543ca53.jpg" id="imgid" width="300" height="400">
            </a>
        </body>
    </head>
</html>
  • 完整代码
package com.example.a4_17webview;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {
    private WebView webView;
    private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = findViewById(R.id.webView);
        handler = new Handler();
        //loadData
        //webView.loadData("<html><body>LOADDATA</body></html>","text/html","utf-8");

        /**参数设置**/
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setSupportZoom(true);
        settings.setBuiltInZoomControls(true);
        webView.requestFocus();
        webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);

        //希望点击链接继续在当前browser中响应,必须覆盖WebViewClient对象
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
        //处理标题,图标
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
            }
        });

        webView.addJavascriptInterface(new MyObject(),"demo");
        //加载网页
        //webView.loadUrl("http://www.baidu.com");

        //加载写的index.html
        webView.loadUrl("file:///android_asset/index.html");
    }

    //内部类
    public class MyObject{
        @JavascriptInterface
        public void clickOnAndroid(){
            handler.post(new Runnable() {
                @Override
                public void run() {
                    webView.loadUrl("javascript:myfun()");
                }
            });
        }
    }


    //回退键
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

}
  • 测试效果

Android 浏览器预览word 安卓web浏览器_android_03

点击后?

Android 浏览器预览word 安卓web浏览器_Android_04