Android 第三方库AgentWeb的使用

CodeNebula
• 阅读 10608
Android 第三方库AgentWeb的使用

一:前言
Android开发经常会用到WebView,用于加载网页。系统自带的WebView性能和流畅度都一般,AgentWeb是一款第三方的WebView,性能比系统自带的要好,功能也更多。
AgentWeb是一个高度封装的Android WebView,简单易用,带进度条,支持文件上传,下载,简化Javascript通信,链式调用,加强Web安全的库。让你轻松集成一个轻量级浏览器在应用上。
1.功能

  • 支持进度条以及自定义进度条
  • 支持文件下载
  • 支持文件下载断点续传
  • 支持下载通知形式提示进度
  • 简化 Javascript 通信
  • 支持 Android 4.4 Kitkat 以及其他版本文件上传
  • 支持注入 Cookies
  • 加强 Web 安全
  • 支持全屏播放视频
  • 兼容低版本 Js 安全通信
  • 更省电 。
  • 支持调起微信支付
  • 支持调起支付宝(请参照sample)
  • 默认支持定位
  • 支持传入 WebLayout(下拉回弹效果)
  • 支持自定义 WebView
  • 支持 JsBridge

AgentWeb是一个轻量级而且功能强大的Web库,大小只有200k
Android 第三方库AgentWeb的使用
二:使用
1.依赖:

implementation 'com.just.agentweb:agentweb:4.1.3' // (必选)使用这个基础的webView实现
implementation 'com.just.agentweb:filechooser:4.1.3'// (可选)
implementation 'com.download.library:Downloader:4.1.3'// (可选)

2.基本用法

public class FourActivity extends AppCompatActivity {
    private LinearLayout ll_root;
 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_four);
 ll_root = findViewById(R.id.ll_root);
 AgentWeb agentWeb = AgentWeb.with(this)//传入Activity
 .setAgentWebParent(ll_root, new LinearLayout.LayoutParams(-1, -1))//传入AgentWeb 的父控件 ,如果父控件为 RelativeLayout , 那么第二参数需要传入 RelativeLayout.LayoutParams .useDefaultIndicator()//使用默认进度条
 .createAgentWeb()
 .ready()//重试
 .go("https://www.baidu.com");//https,Android9.0要是使用http需要配置
 }
}

//添加权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Javascript调用Java,AndroidInterface类中有创建一些js方法

//Javascript调Java
agentWeb.getJsInterfaceHolder().addJavaObject("android",new AndroidInterface(agentWeb,this));

AndroidInterface类中

public class AndroidInterface {
    private AgentWeb agent;
 private Activity context;
 public AndroidInterface(AgentWeb agent, Activity context) {
        this.agent = agent;
 this.context = context;
 }
 
 @JavascriptInterface
public void callAndroid(String url) {
//要用 @JavascriptInterface标注
}
}

调用Javascript方法

//调用Javascript中的方法callAndroid
mAgentWeb.getJsAccessEntrace().quickCallJs("callAndroid");

事件处理

//手机的事件处理
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (agentWeb.handleKeyEvent(keyCode,event)){
        return true;
 }
    return super.onKeyDown(keyCode, event);
}

点击返回键

@Override
public void onBackPressed() {
    if (agentWeb!=null&&agentWeb.getIEventHandler().back()){
        Log.i("callBack", "go back");
 }else {
        Log.i("callBack", "finish");
 finish();
 }
}

跟随Activity 或Fragment生命周期,释放CPU更省电

@Override
protected void onPause() {
    mAgentWeb.getWebLifeCycle().onPause();
 super.onPause();
}
@Override
protected void onResume() {
    mAgentWeb.getWebLifeCycle().onResume();
 super.onResume();
}

创建WebviewClient,用来帮助WebView处理各种通知,请求事件
有如下等方法
onLoadResource()
onPageStart()
onPageFinish()
onReceiveError()
onReceivedHttpAuthRequest()


WebViewClient webViewClient=new WebViewClient(){
    @Override
 public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
 String title=view.getTitle();//拿到webView的title
 if (!TextUtils.isEmpty(title)){
            setToolBarTitle(title);
 }
    }
    @Override
 public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
 }
    @Override
 public void onPageCommitVisible(WebView view, String url) {
        super.onPageCommitVisible(view, url);
 }
    @Override
 public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        return super.shouldOverrideUrlLoading(view, request);
 }
};

创建WebChromeClient,辅助WebView处理JavaScript的对话框,网站图标,网站title,加载进度等,
有如下等方法
onCloseWindow(关闭WebView)
onCreateWindow()
onJsAlert(WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出)
onJsPrompt()
onJsConfirm()
onProgressChanged()
onReceivedIcon()
onReceivedTitle()

private WebChromeClient webChromeClient=new WebChromeClient(){
    @Override
 public void onProgressChanged(WebView view, int newProgress) {
        super.onProgressChanged(view, newProgress);
 }
};
//使用是链式调用中加入

agentWeb = AgentWeb.with(this)//传入Activity
.setAgentWebParent(ll_root, new LinearLayout.LayoutParams(-1, -1))//传入AgentWeb 的父控件 ,如果父控件为 RelativeLayout , 那么第二参数需要传入 RelativeLayout.LayoutParams .useDefaultIndicator()//使用默认进度条
.setWebViewClient(webViewClient)//加入webViewClient
.setWebChromeClient(webChromeClient)//加入webChromeClient
.createAgentWeb()
.ready()//重试
.go("https://www.baidu.com");

修改AgentWeb默认的背景色

FrameLayout frameLayout =agentWeb.getWebCreator().getWebParentLayout();
frameLayout.setBackgroundColor(Color.BLUE);

三:注意事项:

  • 支付宝使用需要引入支付宝SDK ,并在项目中依赖 , 微信支付不需要做任何操作。
  • AgentWeb 内部使用了 AlertDialog 需要依赖 AppCompat 主题 。
  • setAgentWebParent 不支持 ConstraintLayout
  • mAgentWeb.getWebLifeCycle().onPause();会暂停应用内所有WebView
  • minSdkVersion 低于等于16以下自定义WebView请注意与 JS 之间通信安全。
  • AgentWeb v3.0.0以上版本更新了包名,混淆的朋友们,请更新你的混淆配置。
  • 多进程无法取消下载,解决方案

具体的github地址:[https://github.com/Justson/Ag...

END:知行合一

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
待兔 待兔
5年前
Android WebView加载优化
1.前言最近几年关于原生WebView与H5混合开发的项目越来越多,这种开发带来了很多便利,但也会有一些缺点,比如说通过WebView加载H5会有一定的卡顿现象,会影响用户体验。下面本文就此问题一一展开讨论。2.场景根据日常需求一般是通过webView.loadUrl()方法加载指定的网页,其大概流程如下:(https://i
腾讯安卓面试,完美讲解内存缓存LruCache实现原理
开头在Android开发当中,相信大家对第三方库的重要性是无需多说的,尤其是三方库源码更是重中之重,而EventBus源码就属于其中的一个重点。EventBus是安卓(Java中也可以用)开发中非常流行的一个第三方库,是一种发布/订阅事件的总线.想必每个入了门的Android开发者都多少对EventBus有过了解,EventBus是一个Android事件发布
Wesley13 Wesley13
4年前
Android深入理解WebView——上
摘要作为Android开发者,我们都知道在手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件。今天就为大家讲讲Android中WebView的详细使用方法    本文原创,转载请注明地址:http://blog.kymjs.com/(https://www.oschina.net/
Stella981 Stella981
4年前
Flutter平台webview现状
TL;DR官方的webview\_flutter及各第三方实现基本用不了,尤其是在Android下,IOS下可以满足基本需求。问题现在最大问题在Android平台上,所有内嵌的AndroidView都不能进行文本输入,原因在于其所在Window拿不到焦点。可以在这里(https://www.oschina.net/acti
Stella981 Stella981
4年前
Flutter
在Flutter加载网页?也是有WebView的哦,和Android一样1.添加依赖dependencies:flutter\_webview\_plugin:^0.2.122.导入库import'import'package:flutter\_webview\_plugin/flutter\_webview\_plug
Wesley13 Wesley13
4年前
UltimateAndroid快速开发框架教程
UltimateAndroid是一套集成了许多现有优秀的Android开源类库并将之组合成一个整体的Android快速开发框架。框架目前主要包含的功能有ViewInjection,ORM,异步网络请求和图片加载,自动化脚本测试,磁盘LRU等功能.同时提供了类似于TripleDes、Webview快速设置、Md5处理、String处理,Htt
Stella981 Stella981
4年前
Android实现分享功能
最近是越来越懒了,连打字都懒着打,最近有人问到Android分享功能用那个比较好,使用Android自带的Intent来进行分享还是借助第三方呢,直接上代码:一:使用Intent直接和第三方应用进行通信:/\\\分享功能\\@paramcontext\
Stella981 Stella981
4年前
Android使用WebView加载H5页面播放视频音频,退出后还在播放问题解决
Android中经常会使用到WebView来加载H5的页面,如果H5页面中有音频或者视频的播放时,还没播放完就退出界面,这个时候会发现音频或者视频还在后台播放,这就有点一脸懵逼了,下面是解决方案:方案一:在webview所在的activity中的onPause()和onResume()方法中写上两句话。publicvoidon
Wesley13 Wesley13
4年前
Unity横屏
Android下发现Unity里面的Player设置,并不能完全有效,比如打开了自动旋转,启动的时候还是会横屏,修改XML添加以下代码<applicationandroid:icon"@drawable/ic\_launcher"                    android:label"@string/app\_name"
少湖说 少湖说
1年前
鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview
鸿蒙Flutter开发中集成Webview主要有两种方案使用第三方库如使用flutterinappwebview插件,在pubspec.lock文件中配置:yamlflutterinappwebview:git:url:https://gitee.com/