美文网首页Android实用知识Android收藏
一个越来越强大的android版本检测更新库

一个越来越强大的android版本检测更新库

作者: 似水无痕ls | 来源:发表于2017-02-28 14:14 被阅读13842次

    CheckVersionLib

    最新文档请看github

    V2版震撼来袭,功能强大,链式编程,调用简单,集成轻松,扩展性强大

    老规矩先看V2效果,这个版本最大的特点就是使用非常简单,相对于1.+版本

    效果

    v2.png v2.gif

    特点

    • [x] 任何地方都可以调用

    • [x] 简单简单简单简单(重要的话我说四遍)

    • [x] 扩展性强大

    • [x] 所有具有升级功能的app均可使用,耶稣说的

    • [x] 更强大的自定义界面支持

    • [x] 支持强制更新(一行代码)

    • [x] 支持静默下载 (一行代码)

    • [x] 适配到Android O

    导入

    compile 'com.allenliu.versionchecklib:library:2.0.0'
    

    使用

    和1.+版本一样,两种模式

    只使用下载模式

    先来个最简单的调用

            AllenVersionChecker
                    .getInstance()
                    .downloadOnly(
                            UIData.create().setDownloadUrl(downloadUrl)
                    )
                    .excuteMission(context);
    

    UIData:UIData是一个Bundle,用于存放用于UI展示的一些数据,后面自定义界面时候可以拿来用

    请求服务器版本+下载

    该模式最简单的使用

       AllenVersionChecker
                    .getInstance()
                    .requestVersion()
                    .setRequestUrl(requestUrl)
                    .request(new RequestVersionListener() {
                        @Nullable
                        @Override
                        public UIData onRequestVersionSuccess(String result) {
                            //拿到服务器返回的数据,解析,拿到downloadUrl和一些其他的UI数据
                            ...
                            return UIData.create().setDownloadUrl(downloadUrl);
                        }
    
                        @Override
                        public void onRequestVersionFailure(String message) {
    
                        }
                    })
                    .excuteMission(context);
    
    
    

    请求版本一些其他的http参数可以设置,如下

     AllenVersionChecker
                    .getInstance()
                    .requestVersion()
                    .setHttpHeaders(httpHeader)
                    .setRequestMethod(HttpRequestMethod.POSTJSON)
                    .setRequestParams(httpParam)
                    .setRequestUrl(requestUrl)
                    .request(new RequestVersionListener() {
                        @Nullable
                        @Override
                        public UIData onRequestVersionSuccess(String result) {
                            //拿到服务器返回的数据,解析,拿到downloadUrl和一些其他的UI数据
                            ...
                            UIData uiData = UIData
                                    .create()
                                    .setDownloadUrl(downloadUrl)
                                    .setTitle(updateTitle)
                                    .setContent(updateContent);
                            //放一些其他的UI参数,拿到后面自定义界面使用
                            uiData.getVersionBundle().putString("key", "your value");
                            return uiData;
    
                        }
    
                        @Override
                        public void onRequestVersionFailure(String message) {
    
                        }
                    })
                    .excuteMission(context);
    

    以上就是最基本的使用(库默认会有一套界面),如果还不满足项目需求,下面就可以用这个库来飙车了

    一些其他的function设置

    解释下,下面的builder叫DownloadBuilder

     DownloadBuilder builder=AllenVersionChecker
                    .getInstance()
                    .downloadOnly();
                    
                    
          or          
                    
                    
                    
     DownloadBuilder builder=AllenVersionChecker
                     .getInstance()
                     .requestVersion()
                     .request()
    

    取消任务

     AllenVersionChecker.getInstance().cancelAllMission(this);
    
    

    静默下载

     builder.setSilentDownload(true); 默认false
    

    强制更新

    设置此listener即代表需要强制更新,会在用户想要取消下载的时候回调
    需要你自己关闭所有界面

    builder.setForceUpdateListener(() -> {
                  forceUpdate();
              });
    

    下载忽略本地缓存

    如果本地有安装包缓存也会重新下载apk

     builder.setForceRedownload(true); 默认false
    

    是否显示下载对话框

    builder.setShowDownloadingDialog(false); 默认true
    

    是否显示通知栏

    builder.setShowNotification(false);  默认true
    

    自定义通知栏

          builder.setNotificationBuilder(
                     NotificationBuilder.create()
                             .setRingtone(true)
                             .setIcon(R.mipmap.dialog4)
                             .setTicker("custom_ticker")
                             .setContentTitle("custom title")
                             .setContentText(getString(R.string.custom_content_text))
             );
    

    是否显示失败对话框

      builder.setShowDownloadFailDialog(false); 默认true
    

    自定义下载路径

      builder.setDownloadAPKPath(address); 默认:/storage/emulated/0/AllenVersionPath/
    

    可以设置下载监听

       builder.setApkDownloadListener(new APKDownloadListener() {
                 @Override
                 public void onDownloading(int progress) {
                     
                 }
    
                 @Override
                 public void onDownloadSuccess(File file) {
    
                 }
    
                 @Override
                 public void onDownloadFail() {
    
                 }
             });
    

    自定义界面

    自定义界面使用回调方式,开发者需要返回自己定义的Dialog(父类android.app)

    • 所有自定义的界面必须使用listener里面的context实例化

    • 界面展示的数据通过UIData拿

    自定义显示更新界面

    设置CustomVersionDialogListener

    • 定义此界面必须有一个确定下载的按钮,按钮id必须为@id/versionchecklib_version_dialog_commit

    • 如果有取消按钮(没有忽略本条要求),则按钮id必须为@id/versionchecklib_version_dialog_cancel

    eg.

      builder.setCustomVersionDialogListener((context, versionBundle) -> {
                BaseDialog baseDialog = new BaseDialog(context, R.style.BaseDialog, R.layout.custom_dialog_one_layout);
                //versionBundle 就是UIData,之前开发者传入的,在这里可以拿出UI数据并展示
                TextView textView = baseDialog.findViewById(R.id.tv_msg);
                textView.setText(versionBundle.getContent());
                return baseDialog;
            });
    
    

    自定义下载中对话框界面

    设置CustomDownloadingDialogListener

    • 如果此界面要设计取消操作(没有忽略),请务必将id设置为@id/versionchecklib_loading_dialog_cancel
        builder.setCustomDownloadingDialogListener(new CustomDownloadingDialogListener() {
                @Override
                public Dialog getCustomDownloadingDialog(Context context, int progress, UIData versionBundle) {
                    BaseDialog baseDialog = new BaseDialog(context, R.style.BaseDialog, R.layout.custom_download_layout);
                    return baseDialog;
                }
    //下载中会不断回调updateUI方法
                @Override
                public void updateUI(Dialog dialog, int progress, UIData versionBundle) {
                    TextView tvProgress = dialog.findViewById(R.id.tv_progress);
                    ProgressBar progressBar = dialog.findViewById(R.id.pb);
                    progressBar.setProgress(progress);
                    tvProgress.setText(getString(R.string.versionchecklib_progress, progress));
                }
            });
    

    自定义下载失败对话框

    设置CustomDownloadFailedListener

    • 如果有重试按钮请将id设置为@id/versionchecklib_failed_dialog_retry

    • 如果有 确认/取消按钮请将id设置为@id/versionchecklib_failed_dialog_cancel

       builder.setCustomDownloadFailedListener((context, versionBundle) -> {
                BaseDialog baseDialog = new BaseDialog(context, R.style.BaseDialog, R.layout.custom_download_failed_dialog);
                return baseDialog;
            });
    

    最后


    • 更全面的使用请看demo

    • 感谢各位对本库的支持

    • 欢迎star/issue

    License


    Apache 2.0

    相关文章

      网友评论

      • 623dcc25f33a:你好,请问请求参数是个json 应该怎么添加到请求中。
        似水无痕ls:@千弘 看github上的demo 可以直接post json的形式
      • 7b985d48fdc1:你好,请问你这个可以直接根据url进行下载吗?,不需要你带代码里面去获取那些请求头啊,去请求数据====
      • x1s:您好。关于这个库的混淆有没有?
      • sure_ee88:debug没问题,打包后 Unable to create service com.allenliu.versionchecklib.v2.ui.VersionService: org.a.a.e: Subscriber class com.allenliu.versionchecklib.v2.ui.VersionService and its super classes have no public methods with the @subscribe annotation 报这个错是什么原因
      • d16a182dfdca:可以支持不自动跳转安装页面,在状态栏点击安装吗?体验性感觉好一些。
      • 秋天的银杏叶逗:老哥,版本不对啊,我的3.0.1,你的太低了,能更新一下吗
      • 8debe470cc89:我使用自定义的对话框
        builder.setCustomVersionDialogListener((context, versionBundle) -> {
        @LayoutRes int dialogLayout = checkupDateModel.isForce() ? R.layout.custom_force_update_dialog_layout : R.layout.custom_update_dialog_layout;
        BaseDialog baseDialog = new BaseDialog(context, R.style.BaseDialog, dialogLayout);
        TextView tvMsg = baseDialog.findViewById(R.id.tv_msg);
        TextView title = baseDialog.findViewById(R.id.tv_title);
        TextView tvCancel = baseDialog.findViewById(R.id.versionchecklib_version_dialog_cancel);
        tvMsg.setText(Html.fromHtml(checkupDateModel.getContent()));
        title.setText(Html.fromHtml("检测到新版本: " + checkupDateModel.getVersionName()));
        return baseDialog;
        });
        需要点击两次确定才能开始更新,请问是为什
      • Hooliganism先生:感谢lz分享,有个问题 想问一下,在获取返回版本之后,onRequestVersionSuccess在这里可否根据后台返回的数据设置本次更新是否为强制更新,或者是有其他的什么解决方式吗。谢谢
      • 02cc6a7d0a82:7.0 还是有bug 要通过 fileprovider
      • 码圣:Error:Could not find com.android.support:appcompat-v7:27.0.0.
        Required by:
        XiaoE:app:unspecified
        XiaoE:app:unspecified > XiaoE:magicindicator:unspecified

        这个怎么解决啊?
      • 小刀_ab0a:你这个看起来很好啊,如果有暂停 继续 下载,支持断点下载就更强大了。哈哈
      • 艾特不出先生:看起来很强大,不过我试没有返回数据,用okhttp请求就有
      • 2d0ac5a90df7:很好很强大,我扒了楼主的dialog图片:smile:
        似水无痕ls:@MelvinCen 随便扒
      • 73e3b989826c:service.showVersionDialog(sysUpgradeModel.getApkPath(),"系统更新!",sysUpgradeModel.getReleaseLog() );我用上面这句话为什么会有下面的提示?
        java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.allenliu.versionchecklib.core.VersionParams.isSilentDownload()' on a null object reference
      • 3964a5579870:怎么实现自动下载,不用手动点确认更新?
        似水无痕ls:@3964a5579870 静默下载
      • null_js:机型:华为荣耀v10
        系统版本:8.0
        库版本:1.8.6
        问题:使用通知栏下载的时候,每一次更新下载进度都会有系统提示,会不停的有提示音和振动
      • 面熟_gson:我想问一下报这个错是什么问题
        java.lang.NoSuchMethodError: No direct method <init>(Landroid/content/Context;Ljava/lang/String;)V in class Landroid/support/v4/app/NotificationCompat$Builder; or its super classes (declaration of 'android.support.v4.app.NotificationCompat$Builder' appears in /data/app/com.hxe.hxeplatform-1/split_lib_dependencies_apk.apk)
        at com.allenliu.versionchecklib.core.DownloadManager.createNotification(DownloadManager.java:230)
        似水无痕ls:@面熟_3fd5 你用的V7包版本多少,buildToolsVersion,targetSdkVersion 版本统一一下
      • ca3aade74126:学习了,感谢
      • 聪葱忙忘:吐槽下,两点,用了你的库后。
        1.appname会被你的覆盖,具体原因不明
        2.sample代码好乱,可以说稀烂
        mapboo:吐槽下,两点,用了你的库后。
        1.appname会被你的覆盖,具体原因不明
        2.sample代码好乱,可以说稀烂

        1,第一个是因为作者做了国际化,你没有,所以你新建个 values-zh,然后里面加入你的应用名称,例如我的:
        <resources>
        <string name="app_name">IT面试宝典</string>
        </resources>

        2,没有下载代码,不清楚,另外希望作者更新下通知栏上面,加入:

        .setNotificationSmallIconRes(R.drawable.app_icon)//设置通知小图标

        3,希望作者修改下通知栏下载进度条显示 20%/100%,有点不妥;

        最后,感谢作者的付出。
      • Mike张小多:你好,请问大神做了android 7.0及以上系统的适配了吗?听说7.0以后升级安装的时候会报android.os.FileUriExposedException “私有目录被限制访问”的异常。最近要实现在在线升级的功能,感觉自己写的话比较麻烦,觉得你的这个挺不错的!
        似水无痕ls:@Mike张小多 嗯 适配了
      • dcfcb21b8c10:Demo在什么地方下载
        似水无痕ls:@董鹏飞_cfc9 github
      • 南宫逸诺:谢谢 不过 怎么取消下载啊 就是我可以反悔那种下载啊
        似水无痕ls:@南宫逸诺 最新版已经支持
        似水无痕ls:@南宫逸诺 这个暂时还么对取消下载做处理
      • bigmonk:支持增量更新吗
      • 小_默默:你好,请问我如果想在下载apk的接口中添加Token,这个要怎么实现呢?
        似水无痕ls:@小简白书 那你得改源码了
        小_默默:@似水无痕ls 我在你的DownloadManager里边的downApk方法里把token传进来加到headers里边就行了吧?
        似水无痕ls:这个不支持哦, 如果是get的话 你可以添加token到downloadUrl后面
      • e7fa46c17820::clap: 66666666 弱弱的问一下,下载连接是https 的也可以么?
      • Erwooow:点个赞先,辛苦:clap:
      • 似水无痕ls:最新文档请看github
        似水无痕ls:@null_js 兄弟,看我github上回复你的
        null_js:机型:华为荣耀v10
        系统版本:8.0
        库版本:1.8.6
        问题:使用通知栏下载的时候,每一次更新下载进度都会有系统提示,会不停的有提示音和振动
      • 0bf7e1936a5e:你好,下载时的进度条的总长度怎么传的
        似水无痕ls:progress为100 你可以做相应的换算
      • 春夏见得月东生:填写自己的.apk下载地址时,回调出现负值。
        E/CustomVersionDialogActi: 正在下载中回调...
        E/VersionDilaogActivity: -516096.0
        E/CustomVersionDialogActi: 正在下载中回调...
        E/VersionDilaogActivity: -537368.0
        E/CustomVersionDialogActi: 正在下载中回调...
        E/VersionDilaogActivity: -558584.0
        E/CustomVersionDialogActi: 正在下载中回调...
        E/VersionDilaogActivity: -577176.0
        E/CustomVersionDialogActi: 正在下载中回调...
        E/VersionDilaogActivity: -584120.0
        E/CustomVersionDialogActi: 正在下载中回调...
        E/VersionDilaogActivity: -603544.0
        E/CustomVersionDialogActi: 正在下载中回调...
        E/VersionDilaogActivity: -621528.0
        E/CustomVersionDialogActi: 正在下载中回调...
        E/VersionDilaogActivity: -630784.0
        E/CustomVersionDialogActi: 正在下载中回调...
        E/VersionDilaogActivity: -647168.0
        E/CustomVersionDialogActi: 正在下载中回调...
        E/VersionDilaogActivity: -666480.0
        这是什么原因?
        b031d760e794:你好,如果是自定义的界面,在service里面也是调用showVersionDialog();这个方法来显示自定义的下载界面吗?
        b031d760e794:你好,请问,我在service中解析回调结果后,如何把我的值传入到自定义的下载对话框中?好像只有在versionParams.setCustomDownloadActivityClass()之前设置才有效。
        似水无痕ls:@闲听雨 不好意思才看到 。我看看
      • fb797a8f432a:手动检查更新时如果用户多次点击会多次弹出对话框;请求版本接口时建议加个loading,有时候网络慢点了会觉得app卡死;如果没有网络时候手动更新,没有错误回调,不好处理
        似水无痕ls:@闲听雨 这个是用来请求版本的url,对应于你app后台的版本请求接口。
        春夏见得月东生: 麻烦问一下,versionParams = new VersionParams().setRequestUrl("http://www.baidu.com&quot;);这个setRequestUrl("http://www.baidu.com&quot;)是用来干什么的?
        似水无痕ls:@sky__land 这个功能如果库实现了 扩展性就不好了,所以最好自己加loading。你可以开启service的时候loading。然后在回调resp里面dismiss
      • SoMustYY:如果想要在下载时隐藏掉下载对话框,可以在此基础上修改库吗
        SoMustYY:上个星期看了源码修改实现了需求,谢谢博主:relaxed:
        似水无痕ls:@SoMustYY 你现在可以重写showLoadingDialog方法,然后方法里面什么都不做就不会显示下载中Dialog
        似水无痕ls:@SoMustYY 可以的,下个版本的计划加入静默下载
      • 削坏蛋:能给一下eclipse版的demo吗?Android studio项目转eclipse 很费事
        曾大稳丶:ec老司机啊!做android早点转吧 开始有点不习惯 后面就爽了
        流穿枫:盆友,AS都出来好多年了,还在坚持eclipse啊?
        似水无痕ls:https://github.com/AlexLiuSheng/CheckVersionLib/blob/master/library.jar 资源文件那些还是需要你自己弄 兄弟转AS吧!
      • 478107300384::anguished: 按物理按键 下载弹窗并不能取消并在后台下载
        似水无痕ls:@tyHaiFeng 可以使用静默下载
        c6d1ead233c8:@似水无痕ls 应该弄个可以取消的
        似水无痕ls:对的,已经在下载了就是不能取消了
      • chaohx:不错,可以值得学习
        似水无痕ls:@chaohx :v: 谢谢
      • e34144c54fca:两个项目都用这个库装在通一个手机上 只能装一个 INSTALL_FAILED_CONFLICTING_PROVIDER
        报内容提供者重名!!!
        似水无痕ls:因为两个项目使用了同一个fileprovier
        似水无痕ls:额 这是一个bug 7.0以上使用fileprovider 我去修复下
      • 咯里s://传入下载地址,以及版本更新消息
        service.showVersionDialog(downloadUrl,title,updateMsg
        这个service是哪来的 无力吐槽了..。。
        似水无痕ls:能认真看文档看demo?
      • 星_025f:屏幕设置横屏时候,弹出的提示框会有问题
        星_025f:@似水无痕ls 请问有打包好用在EClipse项目中的jar包吗?
        似水无痕ls:@星_025f 修改了
        星_025f:setCustomDownloadActivityClass
      • cc9b42b6f8e3:<-- HTTP FAILED: java.net.UnknownHostException: Unable to resolve host "api.staging.so": No address associated with hostname
        allen debug liyu Key: 34359738368

        7.0系统 报异常
        似水无痕ls:@双木火羽白 是下载的最新的demo?
        熠闲:@似水无痕ls 样例中还是不能再7.0上跑起来
        似水无痕ls:已经适配7.0

      本文标题:一个越来越强大的android版本检测更新库

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