问题来了,平时开发应用也许你会遇到这种场景:应用启动检查服务器版本,若大于当前版本,则要从网络上下载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

Android 检查版本更新 Server后台下载相关推荐

  1. Android 检查版本更新服务并下载,BLE蓝牙连接,BLE蓝牙连接1对多及通用工具

    https://github.com/inksnow/InksLibrary 引用方法: 1. aar 应用 apply plugin: 'com.android.application' andro ...

  2. Android程序版本更新--通知栏更新下载安装(转)

    Android应用检查版本更新后,在通知栏下载,更新下载进度,下载完成自动安装,效果图如下: 检查当前版本号 AndroidManifest文件中的versionCode用来标识版本,在服务器放一个新 ...

  3. 检查版本更新,跳转到腾讯应用宝进行下载

    检查版本更新,跳转到腾讯应用宝进行下载 private void intit_getClick() { if (isAvilible(this, "com.tencent.android.q ...

  4. Android 天气APP(二十六)增加自动更新(检查版本、通知栏下载、自动安装)

    上一篇:Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据 效果图 开发流程 1.开发前言 2.上传应用到分发平台 3.版本数据请求与存储 4.检查版本更新.自定义更新提示弹窗 ...

  5. android端向后台传图片,Android前台从后台下载一张图片 以及 Android前台上传一张图片到后台...

    Android 与 服务器(这里我用的是JSP)对于图片的交互(Android --> JSP && JSP --> Android) Android,在写Android项 ...

  6. Android Service后台下载 广播(Eventbus)通知并展示

    因为好多项目都会用到比如后台下载apk,下载图片,音视频,这个时候就需要我们用Service进行后台下载了,首先讲一下我的思路一个简单的service后台图片下载展示,我需要创建一个service并注 ...

  7. 图形引擎实战:手游Android端后台下载技术分享

    一.功能特点 手游android端后台下载SDK是畅游自主研发的一款移动平台android端后台文件下载工具包,它主要提供网络文件的后台下载功能,功能完善,性能高,可以满足游戏制作有关后台下载文件的需 ...

  8. android后台时不显示,Android后台下载问题

    下载任务显然需要在主线程之外处理. 而从当前执行下载任务的activity按了返回键,然后再次进入后,该activity已经被销毁并且重建了,并且一般情况下,在activity被销毁后,我们应该清理新 ...

  9. android 通知栏进度_Android改造下载图片进度通知

    android 通知栏进度 In this tutorial, we'll be using the Retrofit library in order to download an image fr ...

最新文章

  1. 开源代码“All in One”:6 份最新「Paper + Code」等你复现 | PaperDaily #12
  2. github结合TortoiseGit使用sshkey,无需输入账号和密码
  3. 【免费】某平台3980元大数据课程免费下载,仅此1次
  4. linux shell脚本 可以全局使用
  5. 那些一毕业就选择华为的人,后来都怎么样了
  6. selenium之时间日期控件的处理
  7. 5万字、97 张图总结操作系统核心知识点
  8. c语言:输入三角形的边长求面积
  9. 阿里P9纯手打亿级高并发系统设计手册,走进阿里的架构世界
  10. Spring Boot配置MongoDB多数据源
  11. upload-labs攻略
  12. 2007年中国邮政贺年(有奖)明信片开奖了~~
  13. 2023 新版二开彩虹易支付 持续更新
  14. pandas中的绘图函数(什么是kde)
  15. 计算机win7等级考试试题,计算机等级考试一级win7操作题.docx
  16. format格式化输出
  17. NBA只有这四个人真正影响了世界-艾弗森
  18. 网站10大常见安全漏洞及解决方案
  19. 基于C语言实现的网络嗅探器设计课程设计
  20. 2003集群中的域控服务器配置,配置Windows2003集群(MSCS)与iSCSI

热门文章

  1. [jQuery] jQuery的attr和prop方法有什么区别?
  2. 前端学习(2848):鼠标点击事件
  3. 工作168:代码中的删除逻辑处理
  4. 前端学习(2577):Nuxt解决了什么问题
  5. 前端学习(2474):页面布局
  6. 前端学习(1734):前端系列javascript之添加动画
  7. mybatis学习(20):模糊查询$
  8. 第一百三十四期:MySQL分页查询方法及优化
  9. 实例44:python
  10. 前端利用CryptoJS进行AES对称加解密(16进制编码)