Android WebView组件

   2017-01-06 0
核心提示:原生应用的用户体验不错,但是开发成本相对较高。原生应用的灵活性相对页不如 Web 页,切 Web 页相对原生有更强的控制力。原生应用出了 Bug,如果没有热补丁等热修复技术,应用就需要重新发版上线。Web 页面的控制权都在服务器端,故出了问题,在服务器端修复

原生应用的用户体验不错,但是开发成本相对较高。原生应用的灵活性相对页不如 Web 页,切 Web 页相对原生有更强的控制力。原生应用出了 Bug,如果没有热补丁等热修复技术,应用就需要重新发版上线。Web 页面的控制权都在服务器端,故出了问题,在服务器端修复问题,就把线上的 Bug 修复完了。

下图列出了它们的优势和劣势(包括混合型应用):

Android WebView组件

原生和 Web 页各有优势和劣势,混合应用顺势而生。在原生应用中显示 Web 页也成为很流行的一种策略,即保证了主体功能的用户体验,又包含了 Web 页的灵活性和高控制性。

现状

现在,我们的应用中很多都需要能够支持显示 H5 页面。对于活动页和变动比较频繁以及尚在尝试阶段的需求,一般都会先用 H5 来实现。我们原生应用显示 H5 页面也称为应用的一个强需求,故做此组件。

实现

Android 中使用 WebView 来显示网页。WebViewClient 帮助 WebView 处理各种通知、请求事件。WebChromeClient 主要辅助 WebView 处理 Javascript 的对话框、网站图标、网站 title、加载进度等。

快速使用

简单使用方法调用如下:

WebActivity.launch(this, "http://ihongqiqu.com", "标题");

原理介绍

UrlHandler 负责对 url 进行拦截。 独立的业务可以实现自己的 UrlHandler 。然后只需要在 MyWebViewClient 修改一下方法:

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    FirstUrlHandler firstUrlHandler = new FirstUrlHandler(view.getContext());
    OriginUrlHandler originUrlHandler = new OriginUrlHandler(view.getContext());
    firstUrlHandler.setNextUrlHandler(originUrlHandler);
    // 此处可以设置自己的 UrlHandler 处理
    boolean isHandle = firstUrlHandler.handlerUrl(url);
    if (isHandle) {
        return true;
    } else {
        view.loadUrl(url);
        return false;
    }
}

WebView 设置在 WebFragment 中,代码如下:

private void initWebView() {
    mWebView.getSettings().setDefaultTextEncodingName("utf-8");
    mWebView.getSettings().setSupportZoom(true);
    // 设置是否支持执行JS,如果设置为true会存在XSS攻击风险
    mWebView.getSettings().setJavaScriptEnabled(true);
    // mWebView.addJavascriptInterface(new HTMLheaderJavaScriptInterface(), "local_obj");
    mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
    // 水平不显示
    mWebView.setHorizontalScrollBarEnabled(false);
    // 垂直不显示
    mWebView.setVerticalScrollBarEnabled(false);
    mWebView.setWebViewClient(new MyWebViewClient());
    mWebView.setWebChromeClient(new MyWebChromeClient(mListener));
    mWebView.getSettings().setUseWideViewPort(true);
    // 安全考虑,防止密码泄漏,尤其是root过的手机
    mWebView.getSettings().setSavePassword(false);
    String ua = mWebView.getSettings().getUserAgentString();
    String appUA = ua + "; MYAPP";
    mWebView.getSettings().setUserAgentString(appUA);
    mWebView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);

    mWebView.getSettings().setDatabaseEnabled(true);
    String dir = getActivity().getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();

    // 启用地理定位
    mWebView.getSettings().setGeolocationEnabled(true);
    // 设置定位的数据库路径
    mWebView.getSettings().setGeolocationDatabasePath(dir);

    // 最重要的方法,一定要设置,这就是出不来的主要原因
    mWebView.getSettings().setDomStorageEnabled(true);

    mWebView.loadUrl(mUrl);
}
 
标签: 安卓热修复
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 移动周刊第 176 期:Android 知识梳理
    移动周刊第 176 期:Android 知识梳理
    写在前面 本期移动周刊第 176 期如约而至,聚焦 Android、iOS、VR/AR/MR、直播等前沿移动开发技术,收录一周最热点,解读开发技巧,每周三移动周刊抢先看,我们希望从中能够让你有一些收获,如果你有好的文章以及优化建议,请发送邮件至mobilehub@csdn.net,
  • AssetBundle里的Shader问题
    关于Resources和AssetBundle优劣之前已经提过很多次了(参考官方教程The Resources folder),正好最近@张迪在做框架AssetBundle部分的优化,特此整理一下两个特常见的坑及对应解决办法。之前在关于Unity中的资源管理,你可能遇到这些问题里有有人提到过这个问
  • 热修复框架HotFix源码解析
    热修复框架HotFix源码解析
    讲起 Android 的热修复,相信大家对其都略知一二。热修复可以说是继插件化之后,又一项新的技术。目前的 Android 热修复框架主要分为了两类:基于 Native Hook:使用 JNI 动态改变方法指针,比如有 Dexposed 、 AndFix 等; 基于 Java Dex 分包:改变 dex 加
  • Android 热修复 (Hot Fix) 案例全剖析(一)
    Android 热修复 (Hot Fix) 案例全剖析(一)
    说到热修复技术,我们不得不先谈一下什么是冷修复。冷修复当我们发现上线的应用APK存在Bug,我们通过发布新的应用APK,去替换旧的应用APK,以达到解决Bug的目的,但是这样做存在很大的缺点,需要用户二次下载APK,浪费用户流量,费时、费力、用户体验差。热修
  • Android插件化笔记-2-ClassLoader
    https://zhuanlan.zhihu.com/p/20524252有几个ClassLoader如MainActivity的代码所示,protectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ClassLoader classLoader = getClass
点击排行