Android 中,webview 绝对是使用最频繁的一个组件,涉及到很多的应用场景。如:新闻阅读、加载前端 H5 页面、与合作方的对接、加载本地静态资源等等。以下是我这几年在使用 webview 时的一些总结。
webView 的加载
webview 加载页面的方式主要有俩种,一种是加载HTTP || HTTPS 的H5 链接,一种是加载assets中大的本地HTML。
webView.loadUrl("https");//加载一个链接
webView.loadUrl("file:///android_asset/***.html");//加载静态文件
webView 设置 HEAD
有时候,为了一些安全考虑,会在加载 webview 时添加 head
Map<String, String> webViewHead = new HashMap<>();
webViewHead.put("Referer", HOST);
webView.loadUrl(url, webViewHead);
webView 设置 userAgent
同样,设置 userAgent 也是一种与外部 H5 交互时常用的一种安全方面的配置,一般我会先把想要设置的新 agent放在原来的基础上
String ua = webView.getSettings().getUserAgentString();
webView.getSettings().setUserAgentString(ua + webAgent);
webView 设置H5 调用原生时的标识
在与 H5 交互时,会涉及到 H5 与原生互相调用方法的情况,一般默认情况下,H5 会使用 android.去调用原生提供的方法,为了隐私和安全考虑,我们有时候会约定一个别的参数
webView.addJavascriptInterface(new WebAppInterface(),"约定好的标识");
webView 设置文件下载
如果H5 中有下载文件的一些操作,如果没有特别的要求,一般我们只需要简单配置就好
//webView 文件下载。直接跳转到外部浏览器进行下载
webView.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
downloadByBrowser(url);
}
});
private void downloadByBrowser(String url) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse(url));
startActivity(intent);
}
其他一些细节
- 涉及到拍照,录像可能会需要原生对WebChromeClient进行一些特殊的处理这些根据实际情况查找资料并完善,没有一个统一的配置。需要注意的存储的权限,位置,回调。
- 我们会在等待加载的过程中配置过渡动画,这些在 WebViewClient中进行配置,同时可以配置一下证书问题,防止某些网页无法正常访问。
- 特殊情况下,可能会要求手机端网页使用PC 版效果,这个可以通过设置setUserAgentString来实现。
- 加载缓慢,卡顿等可以通过开启硬件加速来避免。
- 腾讯封装的 webview有利有弊,你得能接受你的 App 增加几十 M 的缓存。