Android 检查版本更新 Server后台下载

问题来了,平时开发应用也许你会遇到这种场景:应用启动检查服务器版本,若大于当前版本,则要从网络上下载APK文件,并在Activity上展示进度条。

版本更新,无非是下载apk文件,安装apk。

这里写图片描述


//其中用到 Xutils

ublic class CheckVersionUtils {private static CheckVersionUtils mCheckVersionUtils;private CheckVersionUtils() {}public static CheckVersionUtils getInstance() {if (mCheckVersionUtils == null) {mCheckVersionUtils = new CheckVersionUtils();}return mCheckVersionUtils;}/*** 访问网络检查版本号码** @param isToastNoVersion 是否弹出"当前版本已为最新版本"的Toast* @param activity         弹窗需要的依赖的Activity*/public void checkVersionToServer(final boolean isToastNoVersion, final Activity activity) {x.http().get(new RequestParams(ConstantValue.CHECK_VERSION_JSON_URL), new Callback.CommonCallback<String>() {@Overridepublic void onSuccess(String result) {Log.e("CheckVersionActivity", "CheckVersionActivity onSuccess()" + result);processData(result, activity, isToastNoVersion);}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() {}});}/*** 返回版本号*/private int getVersionCode() {return BuildConfig.VERSION_CODE;}/*** 解析JSON** @param json* @param isToastNoVersion*/private void processData(String json, Activity activity, boolean isToastNoVersion) {Gson gson = new Gson();CheckVersionBean checkVersionBean = gson.fromJson(json, CheckVersionBean.class);/*** 保存在手机的位置*/String saveSDPath = EXB_SD_PATH_APK + checkVersionBean.getFileName();//判断是否需要更新if (getVersionCode() < checkVersionBean.getVersionCode()) {showUpdateDialog(checkVersionBean, saveSDPath, activity);} else {if (isToastNoVersion) {//不更新Toast.makeText(activity, "当前版本已为最新版本", Toast.LENGTH_SHORT).show();}}}/*** 显示更新对话框** @param checkVersionBean*/private void showUpdateDialog(final CheckVersionBean checkVersionBean, final String saveSDPath, final Activity activity) {//创建文件,判断是否存在AlertDialog.Builder builder = new AlertDialog.Builder(activity);AlertDialog alertDialog = builder.create();//更新描述信息String updateLog = checkVersionBean.getUpdateLog();if (TextUtils.isEmpty(updateLog)) {updateLog = "新版本,欢迎更新";}//版本名称String versionName = checkVersionBean.getVersionName();if (TextUtils.isEmpty(versionName)) {versionName = "1.1";}alertDialog.setTitle("新版本" + versionName);alertDialog.setMessage(updateLog);//判断是否要强制更新if (checkVersionBean.getIsForceUpdate() == 1) {//强制更新//设置外部点了没有效果alertDialog.setCanceledOnTouchOutside(false);//禁用返回键alertDialog.setCancelable(false);alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "更新", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//更新downloadApk(checkVersionBean.getDownloadUrl(), saveSDPath, activity);}});} else {alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}});alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "更新", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//更新downloadApk(checkVersionBean.getDownloadUrl(), saveSDPath, activity);}});}alertDialog.show();}/*** 下载apk** @param downurl*/private void downloadApk(String downurl, String path, final Activity activity) {final ProgressDialog progressDialog = new ProgressDialog(activity);RequestParams requestParams = new RequestParams(downurl);requestParams.setSaveFilePath(path);x.http().get(requestParams, new Callback.ProgressCallback<File>() {@Overridepublic void onWaiting() {}@Overridepublic void onStarted() {}@Overridepublic void onLoading(long total, long current, boolean isDownloading) {progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);progressDialog.setMessage("拼命下载中...");progressDialog.show();progressDialog.setMax(100);double fcurrent = current;progressDialog.setProgress((int) ((fcurrent / total) * 100));}@Overridepublic void onSuccess(File result) {Toast.makeText(NiceyooApplication.getNiceyooApp(), "下载完成", Toast.LENGTH_SHORT).show();progressDialog.dismiss();installApk(activity, result);}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {ex.printStackTrace();Toast.makeText(NiceyooApplication.getNiceyooApp(), "下载失败,请检查网络和SD卡", Toast.LENGTH_SHORT).show();progressDialog.dismiss();}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() {}});}/*** 安装对应apk** @param activity* @param file     安装文件*/private void installApk(Activity activity, File file) {//系统应用界面,源码,安装apk入口Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");//设置安装的类型intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");activity.startActivityForResult(intent, ConstantValue.INSTALL_NEW_VERSION_SUCCESS);}
}

上边代码不是server下载

为什么要用server下载呢?因为有可能 你需要更新的这个Activity要求是可以转屏的。那么在转屏时Actvitiy会重启,如何保证下载的进度条能正确展示进度呢?当然是用server下载了…

这里写图片描述


public class UpdateService extends Service {public UpdateService() {}/*** 安卓系统下载类**/DownloadManager manager;/*** 接收下载完的广播**/DownloadCompleteReceiver receiver;/*** 初始化下载器**/private void initDownManager() {manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);receiver = new DownloadCompleteReceiver();//设置下载地址DownloadManager.Request down = new DownloadManager.Request(//     百度音乐Uri.parse("http://gdown.baidu.com/data/wisegame/fd84b7f6746f0b18/baiduyinyue_4802.apk"));//    乐视体育// Uri.parse("http://122.228.237.132/apk.r1.market.hiapk.com/data/upload/apkres/2016/6_12/16/com.lesports.glivesports_040405.apk"));// 设置允许使用的网络类型,这里是移动网络和wifi都可以down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);// 下载时,通知栏显示途中if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {down.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);}// 显示下载界面down.setVisibleInDownloadsUi(true);// 设置下载后文件存放的位置down.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, "leshi.apk");// 将下载请求放入队列manager.enqueue(down);//注册下载广播registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// 调用下载initDownManager();return super.onStartCommand(intent, flags, startId);}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onDestroy() {// 注销下载广播if (receiver != null)unregisterReceiver(receiver);super.onDestroy();}// 接受下载完成后的intentclass DownloadCompleteReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//判断是否下载完成的广播if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {//获取下载的文件idlong downId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);//自动安装apkif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {Uri uriForDownloadedFile = manager.getUriForDownloadedFile(downId);Log.d("kodulf", "uri=" + uriForDownloadedFile);installApkNew(uriForDownloadedFile);}//停止服务并关闭广播UpdateService.this.stopSelf();}}//安装apkprotected void installApkNew(Uri uri) {Intent intent = new Intent();//执行动作intent.setAction(Intent.ACTION_VIEW);//执行的数据类型intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setDataAndType(uri, "application/vnd.android.package-archive");//不加下面这句话是可以的,查考的里面说如果不加上这句的话在apk安装完成之后点击单开会崩溃// android.os.Process.killProcess(android.os.Process.myPid());startActivity(intent);}}
}

参考:http://blog.csdn.net/rodulf/article/details/51706788#comments


下载demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

error: style attribute '@android:attr/windowEnterAnimation' not found

是的在导入一个依赖的时候又报错了&#xff0c;除了上面这个下面还有几句类似的&#xff0c;解决方法很简单 在gradle.properties这个文件中添加如下一行代码即可&#xff1a; android.enableAapt2false 1这条语句关闭了Aapt2编译。

Java_WEB项目OOM(OutOfMemError内存溢出) MyEclipse配置Jvm内存

前言 刚刚接触的项目是基于SSM&#xff0c;但Tomcat启动时默认的64M内存就总显得不太够。程序运行过程中经常出现OOM(OutOfMemError)。 措施 搜索网上的解决方案&#xff0c;还是比较好解决的&#xff0c;需要给MyEclipse设置Jvm内存大小(即设置Tomcat的Jvm内存大小) : Win…

net.sf.ezmorph.Morpher问题解决

运行web项目&#xff0c;外部访问Servlet报错 报错如下&#xff1a; nested exception is java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher 找不到这个类&#xff1a;net.sf.ezmorph.Morpher 解决方法&#xff1a;复制这些servlet必要的jar包到WEB-INF文件夹下lib文…

工作223:状态管理里面取值

第一步 computed 第二步 取值 computed: {/*GY5 控制新增标题的显隐*/fullTitle() {return this.title "用户";},DepartmentId(){return this.$store.state.department.id},Property(){return this.$store.state.department.property}},created() {/*第二步*/ge…

工作224:当前函数造成

这种报错一般是当前页面的create函数造成的

在VirtualBox中安装BlackArch Linux

作者&#xff1a;荒原之梦安装前的准备 下载系统映像&#xff1a;BlackArch Linux官网下载页面 在本文中我使用的是BlackArch Linux的Live ISO&#xff0c;这样可以减少安装时下载系统的时间。BlackArch的Live ISO文件有7.5G&#xff0c;我们可以使用BT种子来下载&#xff0c;这…

工作225:当前导致name报错

<!-- <el-form ref"form" :model"form" size"medium" :label-width"formLabelWidth" v-loading"loading"><el-form-item label"订单名称" ><el-input v-model"form.order.name" :dis…

Maven的安装以及在Myeclipse上的配置——超详细

在网上找了配置maven的文章&#xff0c;感觉还是有点图文会比较方便查看。 一&#xff1a;Maven的下载安装 准备工作&#xff1a; 1)安装环境 Windows 7 2)需安装JDK ,并配置环境变量(略) 3) Maven版本3.0.5 4)下载地址:http://mirror.bit.edu.cn/apache/maven/maven-3/3.0.5/b…

myeclipse中如何在整个工程中搜索字符串

看图点击即可。项目——>Search——>File 选择搜索条件

myeclipse中添加Oracle数据库

打开Myeclipse后点击如图右上方进入MyEclipse Database Explorer视图 在如图空白处鼠标右击后点选new进入Create a new connection driver界面 在Driver template:中下拉选中Oracle(Thin driver); 在Driver name中填写你希望的名称&#xff1b; 在Connection URL中将后面…

SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一)

SSM(SpringSpringMVCMybatis)框架环境搭建(整合步骤)(一) 1. 前言 最近在写毕设过程中&#xff0c;重新梳理了一遍SSM框架&#xff0c;特此记录一下。 附上源码&#xff1a;https://gitee.com/niceyoo/jeenotes-ssm 2. 概述 在写代码之前我们先了解一下这三个框架分别是干什么…

ORA-28000: the account is locked

首先使用具有sysdba权限的账户登陆&#xff0c;如sys账户和system账户 新建一个sql窗体&#xff0c;并执行语句解锁被锁定的账户&#xff0c;如我这里sgyw账户&#xff1a; alter user sgyw account unlock; 执行成功后再次用这个账户就可以登陆系统了。

工作227:小程序学习1开始布局页面

<template><view class"box u-p-l-35 u-p-r-35 "><view class"title"><text>请选择您要管理的市场</text></view><view :class" [u-flex,u-row-center,{choose_market: selectIndex 0},{market : selectIndex…

工作228:小程序学习2开始布局页面2

<template><view class"box u-p-l-35 u-p-r-35 "><view class"title"><text>请选择您要管理的市场</text></view><view :class" [u-flex,u-row-center,{choose_market: selectIndex 0},{market : selectIndex…

mybatis BindingException: Invalid bound statement (not found)

错误截图 解决措施 此异常的原因是由于mapper接口编译后在同一个目录下没有找到mapper映射文件而出现的。 通常我们在配置SqlSessionFactory时会有如配置 1 <!-- 配置SqlSessionFactory -->2 <bean class"org.mybatis.spring.SqlSessionFactoryBean">…

前端学习(2712):重读vue电商网站32之让菜单栏展开与折叠

通过点击一个按钮&#xff0c;让侧边栏进行展开与折叠。通过 isCollapse 的值来动态变化侧边栏的宽度。 其中 cursor: pointer 设置是为了让鼠标放在折叠与展开处会有一个手指指向。 letter-spacing: 0.2em 是为了让 ||| 有一定间隔

Myeclipse下Maven的配置

1.配置    window--Preferences JDK的配置(执行命令&#xff0c;控制台可能无法输出) -Dmaven.multiModuleProjectDirectory$MAVEN_HOME 新建 Maven Project 转载于:https://www.cnblogs.com/xdalsh/p/8399299.html

前端学习(2713):重读vue电商网站33之实现首页路由重定向

我们想要在登录之后重定向到 /welcome 路径&#xff0c;于是需要添加子路由children 属性&#xff0c;然后设置 redirect重定向到我们的子路由。 然后在我们组件 Home.vue 的右侧主体区域&#xff0c;放置一个路由占位符 router-view 即可。

myeclipse链接数据库,SQL语句实现增删改查

1、创建properties文件 #oracle #driveroracle.jdbc.OracleDriver #urljdbc\:oracle\:thin\:localhost\:1521\:xe #usernamesystem #passwordmanager #mysql drivercom.mysql.jdbc.Driver urljdbc\:mysql\://192.168.0.121\:3306/test?user\root&password\root&chara…

前端学习(2714):重读vue电商网站34之侧边栏路由改造

通过给侧边栏设置 router 属性为 true&#xff0c;我们就能开启 vue-router 路由模式&#xff0c;然后将我们二级菜单的 index 属性绑定我们的数据 path 即可。