我们在Android 开发当中 经常会使用到Webview,有时候也会与其交互做一些处理,但这个时候往往会出现好多莫名其妙的问题。
例如
1 ,在Android中调用webview 想要执行webview中的js方法必须得加以下代码才会生效
-
WebSettings webSettings = webview.getSettings();
-
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 库 ,没错,你没看错。使用就这么简单 。嘿嘿,大家要是觉得不错呢 记得点个赞哦 谢谢!