当前位置: 首页 > news >正文

济南专业做公司网站的机构又好又快自助建站

济南专业做公司网站的机构,又好又快自助建站,微信开放平台官网登录,修改wordpress插件在这里插入图片描述项目简介XUpdate是一个轻量级、高可用性的Android全量版本更新框架。XUpdate是为了解决在不同项目组、不同平台之间进行统一的Android全量版本更新的库。它具有轻量、灵活、低耦合、高可用等特点#xff0c;可以很方便地定制属于自己的版本更新。设计原由在…在这里插入图片描述项目简介XUpdate是一个轻量级、高可用性的Android全量版本更新框架。XUpdate是为了解决在不同项目组、不同平台之间进行统一的Android全量版本更新的库。它具有轻量、灵活、低耦合、高可用等特点可以很方便地定制属于自己的版本更新。设计原由在没有XUpdate之前的版本更新Android版本更新基本都是靠写各种版本更新工具类来实现版本更新更可怕的是有时在不同项目组或者平台之间它们的版本更新完全是不一样的这样的结果就是会写无数的版本更新工具类并且每次更换一个项目组或者平台就需要从头重写再写一遍非常得麻烦。当时我就在想版本更新作为一个Android应用基本都有且内容相对稳定的功能有没有可能设计出一个通用的、不为业务或者平台所影响的基础库呢设计思路在着手写XUpdate之前我特地去Github上搜了一圈有关Android版本更新的内容发现AppUpdate这个项目star数量最多。但是当我翻阅它的源码之后发现它设计得并不优美内部耦合非常严重不过优点就是Android版本更新的功能基本都涵盖了。于是我就照着它所拥有的功能结合了我对版本更新的理解进行了重新设计感兴趣的可点击查看框架UML设计图。解决痛点使用简单只需一行代码即可完成版本更新功能。功能强大兼容Android6.0、7.0、8.0、9.0和10.0支持静默更新和自动更新支持国际化。扩展性强可自定义请求API接口、提示弹窗、下载服务、文件加密器等。搭建简单只需提供json内容即可支持版本更新。配套齐全默认提供了后台服务、管理界面以及各类插件。项目地址为了方便大家使用, XUpdate提供了一整套的全量版本更新解决方案.Android基础库: https://github.com/xuexiangjys/XUpdate版本更新后台服务: https://github.com/xuexiangjys/XUpdateService版本更新管理系统: https://github.com/xuexiangjys/xupdate-managementFlutter插件: https://github.com/xuexiangjys/flutter_xupdateReact-Native插件: https://github.com/xuexiangjys/react-native-xupdate项目演示客户端效果默认版本更新后台更新xupdate_background.png强制版本更新xupdate_force.png可忽略版本更新xupdate_ignore.png自定义提示弹窗主题使用系统弹窗提示xupdate_system.png后台管理界面登录页面在这里插入图片描述后台管理主页应用版本添加xupdate_management_3.png应用版本修改集成指南添加Gradle依赖1.先在项目根目录的 build.gradle 的 repositories 添加:allprojects {repositories {...maven { url https://jitpack.io }}}2.然后在dependencies添加:以下是版本说明选择一个即可。androidx版本2.0.0及以上dependencies {...// androidx版本implementation com.github.xuexiangjys:XUpdate:2.0.2}support版本1.1.6及以下dependencies {...// support版本implementation com.github.xuexiangjys:XUpdate:1.1.6}初始化SDK在Application进行初始化配置【注意】这里需要注意的是IUpdateHttpService必须设置否则框架将无法正常使用IUpdateHttpService的实现可参照Demo中的实现XUpdate.get().debug(true).isWifiOnly(true)    //默认设置只在wifi下检查版本更新.isGet(true)         //默认设置使用get请求检查版本.isAutoMode(false)   //默认设置非自动模式可根据具体使用配置.param(versionCode, UpdateUtils.getVersionCode(this)) //设置默认公共请求参数.param(appKey, getPackageName()).setOnUpdateFailureListener(new OnUpdateFailureListener() { //设置版本更新出错的监听Overridepublic void onFailure(UpdateError error) {if (error.getCode() ! CHECK_NO_NEW_VERSION) { //对不同错误进行处理ToastUtils.toast(error.toString());}}}).supportSilentInstall(true)  //设置是否支持静默安装默认是true.setIUpdateHttpService(new OKHttpUpdateHttpService()) //这个必须设置实现网络请求功能。.init(this);【注意】如果出现任何问题可开启debug模式来追踪问题。如果你还需要将日志记录在磁盘上可实现以下接口XUpdate.get().setILogger(new ILogger() {Overridepublic void log(int priority, String tag, String message, Throwable t) {//实现日志记录功能}});混淆配置-keep class com.xuexiang.xupdate.entity.** { *; }//注意如果你使用的是自定义Api解析器解析还需要给你自定义Api实体配上混淆如下是本demo中配置的自定义Api实体混淆规则-keep class com.xuexiang.xupdatedemo.entity.** { *; }基础使用默认版本更新直接调用如下代码即可完成版本更新操作XUpdate.newBuild(getActivity()).updateUrl(mUpdateUrl).update();需要注意的是使用默认版本更新请求服务器返回的json格式应包括如下内容{Code: 0, //0代表请求成功非0代表失败Msg: , //请求出错的信息UpdateStatus: 1, //0代表不更新1代表有版本更新不需要强制升级2代表有版本更新需要强制升级VersionCode: 3,VersionName: 1.0.2,ModifyContent: 1、优化api接口。\r\n2、添加使用demo演示。\r\n3、新增自定义更新服务API接口。\r\n4、优化更新提示界面。,DownloadUrl: https://raw.githubusercontent.com/xuexiangjys/XUpdate/master/apk/xupdate_demo_1.0.2.apk,ApkSize: 2048ApkMd5: ...  //md5值没有的话就无法保证apk是否完整每次都会重新下载。}自动版本更新自动版本更新自动检查版本 自动下载apk 自动安装apk(静默安装)。只需要设置isAutoMode(true),不过如果设备没有root权限的话是无法做到完全的自动更新(因为静默安装需要root权限)。除此之外,对于某些特殊设备可能需要自定义安装监听才能实现静默安装。XUpdate.newBuild(getActivity()).updateUrl(mUpdateUrl).isAutoMode(true) //如果需要完全无人干预自动更新需要root权限【静默安装需要】.update();支持后台更新开启支持后台更新后, 用户点击“后台更新”按钮后,就可以进入到后台更新,不用一直在更新界面等待.XUpdate.newBuild(getActivity()).updateUrl(mUpdateUrl).supportBackgroundUpdate(true).update();自定义版本更新主题样式通过设置更新顶部图片、主题色、按钮文字颜色、宽高比率等来实现自定义主题样式.promptThemeColor: 设置主题颜色promptButtonTextColor: 设置按钮的文字颜色promptTopResId: 设置顶部背景图片promptWidthRatio: 设置版本更新提示器宽度占屏幕的比例默认是-1不做约束promptHeightRatio: 设置版本更新提示器高度占屏幕的比例默认是-1不做约束XUpdate.newBuild(getActivity()).updateUrl(mUpdateUrl).promptThemeColor(ResUtils.getColor(R.color.update_theme_color)).promptButtonTextColor(Color.WHITE).promptTopResId(R.mipmap.bg_update_top).promptWidthRatio(0.7F).update();强制版本更新就是用户不更新的话程序将无法正常使用。如果你使用的是默认版本更新返回api的话, 只需要服务端返回UpdateStatus字段为2即可。如果你自定义请求返回api的话只需要设置UpdateEntity的mIsForce字段为true即可。进阶使用版本更新信息实体UpdateEntity作为框架各个环节接口的通信媒介了解它们的作用对后面接口的自定义非常关键。UpdateEntity字段属性字段名类型默认值备注mHasUpdatebooleanfalse是否有新版本mIsForcebooleanfalse是否强制安装不安装无法使用appmIsIgnorablebooleanfalse是否可忽略该版本mVersionCodeint0最新版本codemVersionNameStringunknown_version最新版本名称mUpdateContentString更新内容mDownloadEntityDownloadEntity下载信息实体mIsSilentbooleanfalse是否静默下载有新版本时不提示直接下载mIsAutoInstallbooleantrue是否下载完成后自动安装DownloadEntity字段属性字段名类型默认值备注mDownloadUrlString下载地址mCacheDirString文件下载的目录mMd5String下载文件的md5值用于校验防止下载的apk文件被替换(最新演示demo中有计算md5值的工具)mSizelong0下载文件的大小【单位KB】mIsShowNotificationbooleanfalse是否在通知栏上显示下载进度PromptEntity字段属性字段名类型默认值备注mThemeColorintR.color.xupdate_default_theme_color主题色(进度条和按钮的背景色)mTopResIdintR.drawable.xupdate_bg_app_top顶部背景图片资源idmButtonTextColorint0按钮文字颜色mSupportBackgroundUpdatebooleanfalse是否支持后台更新mWidthRatiofloat-1(无约束)版本更新提示器宽度占屏幕的比例mHeightRatiofloat-1(无约束)版本更新提示器高度占屏幕的比例组成结构在了解了版本更新的结构和各部分的功能后,我们就可以根据我们实际的需求进行自定义了.以下是版本更新的组成结构:版本更新检查器IUpdateChecker检查是否有最新版本。版本更新解析器IUpdateParser解析服务端返回的数据结果。版本更新提示器IUpdatePrompter展示最新的版本信息。版本更新下载器IUpdateDownloader下载最新的版本APK安装包。网络请求服务接口IUpdateHttpService定义了进行网络请求的相关接口。除此之外还有两个监听器版本更新失败的监听器OnUpdateFailureListener。版本更新apk安装的监听器OnInstallListener。更新调度核心版本更新业务代理IUpdateProxy负责版本更新的流程控制调用update开始进行版本更新流程。理论上,以上所有组成部分都开放了自定义的api,我们只需要根据我们的需求实现对应的接口即可完成自定义.自定义版本更新解析器如果你不想使用默认版本更新返回的接口数据, 那么你可以实现IUpdateParser接口即可实现解析器的自定义, 示例如下:XUpdate.newBuild(getActivity()).updateUrl(mUpdateUrl3).updateParser(new CustomUpdateParser()) //设置自定义的版本更新解析器.update();public class CustomUpdateParser implements IUpdateParser {Overridepublic UpdateEntity parseJson(String json) throws Exception {CustomResult result  JsonUtil.fromJson(json, CustomResult.class);if (result ! null) {return new UpdateEntity().setHasUpdate(result.hasUpdate).setIsIgnorable(result.isIgnorable).setVersionCode(result.versionCode).setVersionName(result.versionName).setUpdateContent(result.updateLog).setDownloadUrl(result.apkUrl).setSize(result.apkSize);}return null;}}自定义版本更新检查器版本更新解析器版本更新提示器实现IUpdateChecker接口即可实现检查器的自定义。实现IUpdateParser接口即可实现解析器的自定义。实现IUpdatePrompter接口即可实现提示器的自定义。XUpdate.newBuild(getActivity()).updateUrl(mUpdateUrl3).updateChecker(new DefaultUpdateChecker() {Overridepublic void onBeforeCheck() {super.onBeforeCheck();CProgressDialogUtils.showProgressDialog(getActivity(), 查询中...);}Overridepublic void onAfterCheck() {super.onAfterCheck();CProgressDialogUtils.cancelProgressDialog(getActivity());}}).updateParser(new CustomUpdateParser()).updatePrompter(new CustomUpdatePrompter(getActivity())).update();public class CustomUpdatePrompter implements IUpdatePrompter {private Context mContext;public CustomUpdatePrompter(Context context) {mContext  context;}Overridepublic void showPrompt(NonNull UpdateEntity updateEntity, NonNull IUpdateProxy updateProxy, NonNull PromptEntity promptEntity) {showUpdatePrompt(updateEntity, updateProxy);}/*** 显示自定义提示** param updateEntity* param updateProxy*/private void showUpdatePrompt(final NonNull UpdateEntity updateEntity, final NonNull IUpdateProxy updateProxy) {String updateInfo  UpdateUtils.getDisplayUpdateInfo(mContext, updateEntity);new AlertDialog.Builder(mContext).setTitle(String.format(是否升级到%s版本, updateEntity.getVersionName())).setMessage(updateInfo).setPositiveButton(升级, new DialogInterface.OnClickListener() {Overridepublic void onClick(DialogInterface dialog, int which) {updateProxy.startDownload(updateEntity, new OnFileDownloadListener() {Overridepublic void onStart() {HProgressDialogUtils.showHorizontalProgressDialog(mContext, 下载进度, false);}Overridepublic void onProgress(float progress, long total) {HProgressDialogUtils.setProgress(Math.round(progress * 100));}Overridepublic boolean onCompleted(File file) {HProgressDialogUtils.cancel();return true;}Overridepublic void onError(Throwable throwable) {HProgressDialogUtils.cancel();}});}}).setNegativeButton(暂不升级, null).setCancelable(false).create().show();}自定义文件加密校验器本框架默认使用的文件加密校验方法是MD5加密方式当然如果你不想使用MD5加密你也可以自定义文件加密器IFileEncryptor,以下是MD5文件加密器的实现供参考/*** 默认的文件加密计算使用的是MD5加密** author xuexiang* since 2019-09-06 14:21*/public class DefaultFileEncryptor implements IFileEncryptor {/*** 加密文件** param file* return*/Overridepublic String encryptFile(File file) {return Md5Utils.getFileMD5(file);}/*** 检验文件是否有效(加密是否一致)** param encrypt 加密值, 如果encrypt为空直接认为是有效的* param file    需要校验的文件* return 文件是否有效*/Overridepublic boolean isFileValid(String encrypt, File file) {return TextUtils.isEmpty(encrypt) || encrypt.equalsIgnoreCase(encryptFile(file));}}最后再调用XUpdate.get().setIFileEncryptor方法设置即可生效。只使用XUpdate的下载器功能进行apk的下载XUpdate.newBuild(getActivity()).apkCacheDir(PathUtils.getExtDownloadsPath()) //设置下载缓存的根目录.build().download(mDownloadUrl, new OnFileDownloadListener() {   //设置下载的地址和下载的监听Overridepublic void onStart() {HProgressDialogUtils.showHorizontalProgressDialog(getContext(), 下载进度, false);}Overridepublic void onProgress(float progress, long total) {HProgressDialogUtils.setProgress(Math.round(progress * 100));}Overridepublic boolean onCompleted(File file) {HProgressDialogUtils.cancel();ToastUtils.toast(apk下载完毕文件路径  file.getPath());return false;}Overridepublic void onError(Throwable throwable) {HProgressDialogUtils.cancel();}});只使用XUpdate的APK安装的功能_XUpdate.startInstallApk(getContext(), FileUtils.getFileByPath(PathUtils.getFilePathByUri(getContext(), data.getData()))); //填写文件所在的路径如果你的apk安装与众不同你可以实现自己的apk安装器。你只需要实现OnInstallListener接口并通过XUpdate.setOnInstallListener进行设置即可生效。常见问题接入的问题1.问为什么我刚接入的时候一直报错updateHttpService null?答你需要仔细阅读接入文档必须在Application中按要求初始化XUpdate而其中IUpdateHttpService必须设置除非你自定义版本检查器和版本更新下载器否则框架将无法正常使用2.问为什么我在开发调试的时候能够出现最新版本的提示但是打出来的包却什么反应也没有?答出现这个问题一般是少了混淆配置。如果你使用了自定义的版本更新解析器请对你的接口实体进行混淆配置。3.问为什么我点击下载后文件是能下载下来的但是进度条不更新或者打印出进度条的值是-1?答出现这种情况可以从两个方面来排查。如果你打印出进度条的值是-1那很有可能是服务端提供的下载服务本身就不支持进度。因为如果你在请求服务端下载文件的时候服务端在请求头中没有返回数据长度即contentLength(Content-Length)没有设置是未知的那么是不可能有进度的。这个你可以通过抓包来查看响应头中是否设置了“Content-Length”。如果你使用的服务端本身已经确认是支持进度的。那么就可能需要考虑是不是你的IUpdateHttpService的download接口实现有问题你务必要保证接口DownloadCallback的onProgress方法能被正常执行。4.问为什么我执行了版本更新的方法它却一直提示无最新版本或者是一直在进行版本更新?答出现这个问题你首先得明确一点的是你判断是否有最新版本的依据是什么。到底是依据VersionCode还是VersionName这个取决于你实际使用的场景。明确完这一点你才可以根据日志去判断到底是前端出了问题还是后端出了问题。5.问这个最新版本我已经下载过了只不过没安装在下一次进行版本更新的检查时为什么我还要重新下载一次答出现这个问题只能证明你的后端在返回版本信息的时候并没有返回最新版本文件的MD5值或者返回了你没有设置。如果你设置了MD5值那么就是你设置的MD5值和文件计算出来的MD5值不匹配这种情况下你的APK文件极有可能被篡改了(当然在这种情况下你也不能正常安装)或者是你们前后端的MD5值计算算法不一致(一般不存在这种情况)。6.问为什么我最新的应用下载了但是点击安装按钮后一直提示更新失败呢答出现这种问题的情况有很多种。首先你需要确保能否找到下载下来的最新APK如果你设置了MD5值的话还需要判断下载下来的最新APK计算出来的MD5值和后台接口返回的MD5值是否一致(计算文件的MD5值Demo中有对应的方法)其次你需要手动安装一下APK,确保APK文件没问题(签名一致、文件完整)能正常安装最后你可以在多台设备上尝试一下确保不是设备自身的问题。如果以上方法都不能解决问题很遗憾那么你只能自定义安装监听器OnInstallListener接口实现能够正确安装APK的方法了。7.问在版本更新的过程中出现了错误我该如何进行排查答最好的解决方法当然是打断点逐个进行排查啦当然在打断点前我们需要调用XUpdate.get().debug(true)开启debug模式打印相关日志明确出错的位置这样才能更快地解决问题啦8.问为什么版本更新弹窗弹不出来报System.err: at com.xuexiang.xupdate.widget.BaseDialog.init(BaseDialog.java:72)错误答最好的解决方法就是传入的context使用的是AppCompatActivity, 而不是Activity或者FragmentActivity如果你一定要使用Activity或者FragmentActivity那么请设置其主题为Theme.AppCompat类型的主题。自定义的问题经常有使用者反馈不知道该如何自定义接口(面对一堆接口不知道该如何下手)进行个性化的定制以满足版本更新实现的需求下面我将一一列举问题和解决的方法。1.问我使用的是retrofit自定义的接口不想使用IUpdateHttpService那套通用请求方式来查询最新版本我该怎么办答可以自定义版本更新检查器IUpdateChecker它主要负责的是查询是否存在最新版本。可参考框架默认提供的版本更新检查器来自定义。2.问我不想使用框架默认的请求服务器返回的json格式因为公司的后端有自己的一套数据返回格式我该怎么办答可以自定义版本更新解析器IUpdateParser它主要负责的是解析服务端返回的数据结果并构建更新信息实体UpdateEntity。具体可参考自定义版本更新解析器, 也可参考框架默认提供的版本更新解析器来自定义。3.问我觉得框架提供的一套默认的版本更新提示界面不符合我们公司的UI风格我能自定义一套自己的版本更新提示界面吗答可以自定义版本更新提示器IUpdatePrompter它主要负责的是展示最新的版本信息。具体可参考自定义版本更新提示器, 也可参考框架默认提供的版本更新提示器来自定义。4.问我总觉得框架中提供的最新版本APK下载服务速度不行我想实现自己的下载服务并做相关下载进度的提示可以吗答可以自定义版本更新下载器IUpdateDownloader它主要负责的是下载最新的版本APK安装包。可参考框架默认提供的版本更新下载器来自定义。5.问我的应用和普通应用有些特别并不能使用系统的安装api安装程序我该怎么办答如果你的apk安装与众不同你可以实现自己的apk安装器。你只需要实现OnInstallListener接口并通过XUpdate.setOnInstallListener进行设置即可生效。【注意】以上实现的自定义接口都可以通过XUpdate进行全局和局部的设置。错误码错误码备注2000查询更新失败2001没有wifi2002没有网络2003正在进行版本更新2004无最新版本2005版本检查返回空2006版本检查返回json解析失败2007已经被忽略的版本2008应用下载的缓存目录为空3000版本提示器异常错误3001版本提示器所在Activity页面被销毁4000新应用安装包下载失败4001读写权限申请失败5000apk安装失败5100未知错误资源链接Android基础库: https://github.com/xuexiangjys/XUpdate版本更新后台服务: https://github.com/xuexiangjys/XUpdateService版本更新管理系统: https://github.com/xuexiangjys/xupdate-managementFlutter插件: https://github.com/xuexiangjys/flutter_xupdateReact-Native插件: https://github.com/xuexiangjys/react-native-xupdate微信公众号更多资讯内容欢迎扫描关注我的个人微信公众号:【我的Android开源之旅】gzh_weixin.jpg
http://www.zqtcl.cn/news/841504/

相关文章:

  • cms 做网站用模板网站做h5宣传页多少钱
  • 坪山网站建设行业现状官方建网站有哪些步骤
  • 软件下载网站模版单页网站开发实例下载
  • 张家口网站建设vewanseo实战技术培训
  • 机加工网站室内设计联盟论坛
  • 汕头装修接单网站wordpress php加密
  • 重庆网站建设推广设置wordpress静态主页
  • 科技设计公司网站模板下载网站建设计划 文库
  • 建设美食网站做的好的阅读类的网站有哪些
  • 全屏网站模板制作教程吴江建设局房产网站
  • 浠水网站建设漳州找人做网站要求哪些
  • 做网站需要前台和后台吗公众号制作要求
  • 做一个网站 如何盈利模式招聘网站排行榜2021
  • 免费做网站网站有人哪些c 网站开发网易云课堂百度云下载
  • 高端品牌网站设计欣赏扬中网站建设包括哪些
  • 手机怎么访问微网站网络运营商电话
  • 怎么成立网站战争局势最新消息
  • 嘉定网站设计制作报价crm系统营销
  • 一个网站做几个关键词怎么样子做网站
  • 关于做网站的创新创业策划书怎么进网站后台管理系统
  • 品牌型网站开发wap网站开发工具
  • 网站改版设计微信淘宝购物券网站是怎么做的
  • 网站建设基本流程心得网站设计开发报价
  • 泉州网站建设网站制作电商网站建设需要
  • 沈阳工程建设信息网深圳seo网站排名优化
  • wordpress仿dz长沙seo网站优化
  • 西宁做网站公司电话关键词快速排名怎么做
  • 昆山网站建设秦皇岛淘宝关键词推广
  • 建设娱乐网站的要求微网站开发多少钱
  • 海港区网站快排seo网站怎么添加流量