Android 中使用Webview所遇到的坑该如何解决呢?

      我们在Android 开发当中 经常会使用到Webview,有时候也会与其交互做一些处理,但这个时候往往会出现好多莫名其妙的问题。

例如

1 ,在Android中调用webview 想要执行webview中的js方法必须得加以下代码才会生效

  1. WebSettings webSettings = webview.getSettings();

  2. webSettings.setJavaScriptEnabled(true);

,如果不加webview中的js方法可是执行不了的哦。

2 ,如果想要在Activity界面中打开 而不是直接以浏览器的方式 那必须得 设置 setWebChromeClient() 然后重写shouldOverrideUrlLoading()  才行哦。

3,大家还会发现WebSettings  里面还有一个很重要的方法WebViewClient() 哦,此方法主要是 处理解析,渲染网页等浏览器做的事情,.比如 辅助 WebView处理Javascript的对话框,网站图标,网站title,加载进度等等,(其实Android 与H5交互中所存在的坑基本都是需要在这里面做处理的。比如 webview里面的一些第三方支付,直接是无法调起来的;打开相册也是会存在问题的 即使你在Android 本地加动态权限做相应的处理还是会存在问题的,当然有人也讲过说重写WebViewClient() 方法在里面做相对应的兼容各个版本,我告诉大家会很麻烦的 之前这个问题我是处理了一整天才搞好.真的很头疼哎。下面切入正题吧,遇到类似的问题该怎么解决呢,那就是接下来要给大家介绍的AgentWebview 。此框架 是一个高度封装的 Android WebView ,简单易用 , 带有进度条 、 支持文件上传 、 下载 、 简化 Javascript 通信 ,支持返回事件处理,支持注入 Cookies,加强 Web 安全的库,分分钟 可以解决所有问题。嘿嘿

下面就跟大家详细的介绍下吧。

1 ,学习其中的技术和实现:

(1)AgentWebview 它是继承自WebView时,在xml布局引用,只需写包名和类名。

<com.just.library.AgentWebView

android:layout_width="match_parent"

android:layout_height="match_parent"/>

通过这点,以便扩展,以后需要对某些view,进行添加新功能的时候,即可这样做,就像support v7包里,很多都是这样处理 的,比如android.support.v7.widget.Toolbar。

(2)对各个版本的兼容和处理。

在Android 4.4之前采用的是android 手机浏览器内核采用的是webkit,Android 4.4之后采用的是chromium作为内核。其中对于不同版本JS注入安全、防止内存泄漏、

通过WebBackForwardList来整理重定向的历史。我们现有的是采用的是通过Activity中的堆栈管理来处理的。

2 是否适合接入到本身项目中作为h5库?

AgentWeb优点:

(1)对于 WebView 的封装 , 很多人都是抽象在一个基类里面 , 封装成一个 BaseWebActivity , 或者 BaseWebFragment (包括我们项目里也是),复用性不高 , 而且容易导致 Activity 或者 Fragment 基类膨胀 。AgentWeb封装的思路是通过代理,将WebView从Activity或者Fragment中代理出来,不在需要Activity或者Fragment内部创建和管理,通过抽出AgentWeb来管理和对webview进行设置。换句通用的话来解释就是,之后要新建webviewActivity就不用依附在BaseWebActivity了。

(2)AgentWeb把WebView代理出来,将功能分成一个类去管理,WevCreator->负责创建WebView以及进度条、WebSettings->对WebView进行统一设置。JsEntraceAccess->Javascript方法访问进行统一入口,这样做使得每一个功能独立,相互不影响,也使得AgentWeb的结构清晰,符合单一职责原则。

但是,我个人认为这样的封装,对于业务很多布局都特别类似的,则不太合适,因为我们每个webview的显示的布局,几乎就是一个标题栏+一个webview控件+一个progress bar(进度条)。

3 具体使用 如下,首先

引入

Gradle中添加

      com.just.agentweb:agentweb:4.0.2(最新依赖库)

用法

mAgentWeb = AgentWeb.with(this)    
        .setAgentWebParent(webview, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,          ViewGroup.LayoutParams.MATCH_PARENT))
        .useDefaultIndicator(-1, 1)
        .createAgentWeb()
        .ready()
        .go(url);

混淆

-keep public class * extends android.webkit.WebChromeClient

总结

AgentWeb 是一个把 WebView 完全代理出来 , 脱离 Activity 、 Fragment xml 布局 , Android Web 库 ,没错,你没看错。使用就这么简单 。嘿嘿,大家要是觉得不错呢 记得点个赞哦 谢谢!

猜你喜欢

转载自blog.csdn.net/qq_37014804/article/details/81775367