美文网首页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;
    });
    需要点击两次确定才能开始更新,请问是为什
  • bd6d9e04f375:感谢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