美文网首页移动开发Android懂不起待集成
AgentWeb , 一个简洁易用的 Android Web

AgentWeb , 一个简洁易用的 Android Web

作者: Justson | 来源:发表于2017-05-27 17:02 被阅读11571次

    AgentWeb 介绍

    AgentWeb 是一个高度封装的 Android WebView ,简单易用 , 带有进度条 、 支持文件上传 、 下载 、 简化 Javascript 通信 ,加强 Web 安全的库 。 App 下载体验

    前言

    WebView 可谓是每个应用必备的一个控件了 ,但是谈起它的使用 ,让很多人都不是那么喜欢它 ,比如说每个 Web 页面都需要各种一大推的 setting ,好一点的可能封装成一个 BaseWebActivity 和 BaseWebFragment ,但是重复的代码总是让有洁癖的程序员不舒服 ,而且 WebView 本身功能也不是很完善 , AgentWeb 就泥补了这些空缺 。

    AgentWeb 功能

    1. 支持进度条以及自定义进度条
    2. 支持文件下载
    3. 支持文件断点续传
    4. 支持下载通知形式提示进度
    5. 简化 Javascript 通信
    6. 支持返回事件处理
    7. 支持注入 Cookies
    8. WebView 安全

    为什么要使用 AgentWeb ?

    七个字 ,简洁易用体验好 。 最重要的是 WebView 很多东西不支持呀 , 坑太多!

    Web 文件下载 文件上传 Js通信 断点续传 使用简易度 进度条 线程安全
    WebView 不支持 不支持 支持 不支持 麻烦 没有 不安全
    AgentWeb 支持 支持 更简洁 支持 简洁 安全

    简洁易用

    为什么说它简洁易用吗 ? 下面京东商城效果图 , 只需一句话 !

    mAgentWeb = AgentWeb.with(this)//传入Activity
                    .setAgentWebParent(mLinearLayout, new LinearLayout.LayoutParams(-1, -1))//传入AgentWeb 的父控件 ,如果父控件为 RelativeLayout , 那么第二参数需要传入 RelativeLayout.LayoutParams
                    .useDefaultIndicator()// 使用默认进度条
                    .defaultProgressBarColor() // 使用默认进度条颜色
                    .setReceivedTitleCallback(mCallback) //设置 Web 页面的 title 回调
                    .createAgentWeb()//
                    .ready()
                    .go("http://www.jd.com");
    
    

    你没看错 ,里面没有一句 Setting , 甚至连 WebChromeClient 都不配置就有进度条 。

    Javascript 通信拼接太麻烦 ? 请看 。

    //Javascript 方法
    function callByAndroid(){
          console.log("callByAndroid")
      }
    
    
    

    Android 端

    mAgentWeb.getJsEntraceAccess().quickCallJs("callByAndroid");

    结果

    05-27 08:27:04.945 469-469/com.just.library.agentweb:web I/Info: consoleMessage:callByAndroid  lineNumber:27
    

    京东商城效果图

    京东效果图

    到了这里 , 弱弱问一句 , 你还有什么理由不使用 AgentWeb ?

    浅谈进度条

    为什么要谈一下进度条这个东西呢 ? 因为没有进度条的 WebView 页面体验实在太差了 ,AgentWeb 默认的进度条是一般浏览器的进度条 ,为什么采用这种进度条呢 ? 因为体验好 ,微信和QQ ,支付宝 、 UC 以及 Safari 都采用这种进度条是有他们道理的 , 我还见过应用加载 Web 页面的时候直接弹 Dialog 不可取消 ,这种恶心的做法 ,没有非常必要让用户确定情况都别弹 Dialog ,特别在用户网络不好的情况下 ,加载速度变得突奇的慢 ,那么 Dialog 就一直存在 ,用户耐性不好 ,只能把你进程杀死 。

    Agentweb 视图结构

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <WebView
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    
            </WebView>
             <!--进度条-->
            <com.just.library.BaseIndicatorView
                android:layout_width="match_parent"
                android:layout_height="2dp"
                >
    
            </com.just.library.BaseIndicatorView>
        </FrameLayout>
    
    

    很清晰 AgentWeb 最外层是 FrameLayout , 所以在使用 AgentWeb 的时候还需要给 FrameLayout 指定父控件(下面有使用方式) 。

    引入

    • Gradle

      compile 'com.just.agentweb:agentweb:1.0.3'
      
    • Maven

      <dependency>
        <groupId>com.just.agentweb</groupId>
        <artifactId>agentweb</artifactId>
        <version>1.0.3</version>
        <type>pom</type>
      </dependency>
      
      

    用法

    Activity 使用如下

    mAgentWeb = AgentWeb.with(this)//传入Activity
                    .setAgentWebParent(mLinearLayout, new LinearLayout.LayoutParams(-1, -1))//传入AgentWeb 的父控件 ,如果父控件为 RelativeLayout , 那么第二参数需要传入 RelativeLayout.LayoutParams
                    .useDefaultIndicator()// 使用默认进度条
                    .defaultProgressBarColor() // 使用默认进度条颜色
                    .setReceivedTitleCallback(mCallback) //设置 Web 页面的 title 回调
                    .createAgentWeb()//
                    .ready()
                    .go("http://www.jd.com");
    
    

    Fragment 使用如下

    @Override
        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            mAgentWeb = AgentWeb.with(this.getActivity(), this)//这里需要把 Activity 、 和 Fragment  同时传入
                    .setAgentWebParent((ViewGroup) view, new LinearLayout.LayoutParams(-1, -1))// 设置 AgentWeb 的父控件 , 这里的view 是 LinearLayout , 那么需要传入 LinearLayout.LayoutParams
                    .useDefaultIndicator()// 使用默认进度条
                    .setReceivedTitleCallback(mCallback) //标题回调
                    .setSecurityType(AgentWeb.SecurityType.strict) //注意这里开启 strict 模式 , 设备低于 4.2 情况下回把注入的 Js 全部清空掉 , 这里推荐使用 onJsPrompt 通信
                    .createAgentWeb()//
                    .ready()//
                    .go(getUrl());
            
        }
    
    

    混淆

    
    -keep public class * extends android.webkit.WebChromeClient
    

    总结

    AgentWeb 是一个把 WebView 完全代理出来 , 脱离 Activity 、 Fragment xml 布局 , Android Web 库 。

    地址 : AgentWeb 欢迎star

    相关文章

      网友评论

      • 只欠秋天:加载html标签怎么弄
      • d3163db4c2ea:请问下可以有方法刷新当前页面吗
      • 心_动:您好,请教一下 播放腾讯短视频无法全屏 怎么解决?
      • 小碗熊Tony:很强势,后面使用看看
      • 啊飞飞飞飞飞:agentweb放在fragment中+viewpager翻页就报错求解决
      • qquser_d336:请教您一个问题,我发送一个post请求的h5怎么设置
      • 唔使朙:请问楼主,android在同一个界面里同时发起两个WebView 请求,不能自适应高度显示吖,要写死高度才可以显示出来,有什么办法可以解决自适应高话的么?谢谢
      • 蜗牛1:agentWeb怎么清除全局缓存啊,h5更新后还是加载原来的界面。
      • Destiny_ZRJ:请问文件下载可以设置下载路径吗
      • cp我要吃饭:AgentWeb如何加载带html标签的内容?
      • cp我要吃饭:mAgentWeb如何加载带网页标签的内容?
      • 隰有荷:文档写的不是很明白啊
      • _明川:你好 博主 ,我现在需求是 点击 js 回调 android 的办法,我找到了您的 JsbridgeWebFragment 和 其对应的 demo.html 我看只有 点击 选择文件 才是 js 回调 android 的方法,但是往下 没有追踪到 该 选项 的 方法,请问 您 具体在哪里 实现的
      • 起风了啊啊啊啊啊啊啊:具体该怎么用啊,我还是没明白
      • hellomyshadow:楼主,请问怎么设置背景色为透明色?试了好几种方式,发现无法设置透明背景
      • 7cdec7c82a25:我用AgentWebX5, 访问加载https://m.baidu.com,新闻列表点开网页内容详情只展示一半,只是访问百度这个问题,其他的网址正常
      • 来碗睡觉:请问一下,Android6.0以上版本,在网页中调用系统相机和相册无效,这该如何解决呢?已经申请了权限了,可以打开相册,但是无法使用相机!
        Li_sten:也遇到了这个,我的解决方式是在mWebChromeClient里重写openFileChooser和onShowFileChooser,然后自己处理相机和相册的选择框,重写onActivityResult处理拍照和相册选择之后的结果
      • afe019859593:我想问下 下载的地址可以改么 默认下载缓存里面apk文件不给打开
        Justson: @不知今夕是何年_abe8 不给打开是什么意思?
      • fd6a18efc74e:mAgentWeb.getJsEntraceAccess().quickCallJs("callByAndroid");调用不起作用啊
      • fd6a18efc74e:楼主 怎么解决接口跨域问题?
      • Attach:其中webview有一个方法可以判断是否可以返回上一个网页:webView.canGoBack(),然后执行webView.goBack();可以返回上一个页面
        在agentweb中可以使用 agentWeb.back();返回上一个网页,但是怎么样判断是否可以返回上一页,是哪个方法?求指点
        Attach:@Justson
        整明白了
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (KeyEvent.KEYCODE_BACK == keyCode) {
        boolean flag = agentWeb.back();
        Logger.i("agentWeb.back()=" + flag);
        if (flag) {
        return true;
        }
        return super.onKeyDown(keyCode, event);
        }
        return super.onKeyDown(keyCode, event);
        }
        Attach:@Justson
        我是在一个activity中嵌套了一个webview wb1中点击按钮跳转到另一个activity中的agentWeb aw中
        若使用
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (KeyEvent.KEYCODE_BACK == keyCode && webView.canGoBack()) {
        agentWeb.back();
        return true;
        }
        return super.onKeyDown(keyCode, event);
        }
        能返回到wb1所在页面
        若使用:
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (KeyEvent.KEYCODE_BACK == keyCode) {
        return agentWeb.back();
        }
        return super.onKeyDown(keyCode, event);
        }
        则将会留在aw所在页面不会再继续往后跳
        Justson:agentWeb.back(); 走的就是你上面所说的逻辑
      • 11ab97d68d02:你好问一下,加载服务器端的网页,持久化同步登录状态可以实现吗
        Justson:@雨中仙 可以
        Justson:@雨中仙 可以
      • 502530aec348:mAgentWeb.getJsEntraceAccess().quickCallJs("callByAndroid");是Android端调用网页的方法吧?那么网页如何调用Android的方法?
        d3b602e70cc9: @Justson 谢谢,可以了。😃
        Justson:@kangjinwen 参照Sample
        d3b602e70cc9:同问,好像是这样//Android 端 , AndroidInterface 是一个注入类 ,里面有一个无参数方法:callAndroid
        mAgentWeb.getJsInterfaceHolder().addJavaObject("android",new AndroidInterface(mAgentWeb,this));
        //在 Js 里就能通过
        window.android.callAndroid() //调用 Java 层的 AndroidInterface 类里 callAndroid 方法


        但是没用
      • wasdzy111:mAgentWeb = AgentWeb.with(this.getActivity(), this)//这里需要把 Activity 、 和 Fragment 同时传入
        .setAgentWebParent((ViewGroup) view, new LinearLayout.LayoutParams(-1, -1))// 设置 AgentWeb 的父控件 , 这里的view 是 LinearLayout , 那么需要传入 LinearLayout.LayoutParams
        .useDefaultIndicator()// 使用默认进度条
        .setReceivedTitleCallback(mCallback) //标题回调
        .setSecurityType(AgentWeb.SecurityType.strict) //注意这里开启 strict 模式 , 设备低于 4.2 情况下回把注入的 Js 全部清空掉 , 这里推荐使用 onJsPrompt 通信
        .createAgentWeb()//
        .ready()//
        .go(getUrl());

        请问下这个go()中的url地址 拼接参数的时候 报错怎么解决呢
      • 阿策神奇:如何接入支付宝跳转?
      • 2672b0418f9d: @Override
        protected void onPause() {
        mAgentWeb.getWebLifeCycle().onPause();
        super.onPause();

        }

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

        没有getWebLifeCycle这个方法啊
      • 335905722282:怎么设置背景透明
        Justson:mAgentWeb.getWebCreator().getGroup().setBackgroundColor(Color.TRANSPARENT);
      • 4be416c16c45:楼主也没写怎么掉起微信支付
        Justson:参照Sample , 微信支付不需要做任何动作。
      • 咸鱼小笼包:视频好像点不了,没反应
        咸鱼小笼包:用X5的可以播放
      • 0d298124c4ac:能否把定位关掉呢
      • 0fb23651fd09:怎么设置UA呢
      • 3866b3f2e166:下载有bug,点击会崩溃
        爱言语论:@月影唯殇 准备跳转的activity加个intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 打开一个新的栈堆
        3866b3f2e166: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
        at android.app.ContextImpl.startActivity(ContextImpl.java:1050)
        at android.app.ContextImpl.startActivity(ContextImpl.java:1037)
        at android.content.ContextWrapper.startActivity(ContextWrapper.java:311)
        at com.just.agentwebX5.DefaultDownLoaderImpl.onDownloadStart(DefaultDownLoaderImpl.java:62)
        Justson:@月影唯殇 能把错误日志发一下吗?
      • 面具张:还有刚才试了一下网页里面有弹窗的时候直接崩掉了,博主有遇到过吗?
        山峰01:博主 我加载一个url 这个url里面有地图和其他列表 现在 加载的时候 其他东西都能显示出来 就是地图显示不出来
        Justson:使用最新版依赖试试
      • 面具张:请问一下这个要怎么设置错误加载页呢?
        Justson:重写 WebViewClient

      本文标题:AgentWeb , 一个简洁易用的 Android Web

      本文链接:https://www.haomeiwen.com/subject/olvqfxtx.html