转的:适合新手学习,但在实际项目中不可这么做。
以下是我转的内容:
===================================================================

各种平台软件更新做法差不多,大体做法如下:

1.服务器存放一个最新版本的xml文件,或者存在数据库,各种做法都可以。

1.1xml文件存储verCode verName updateUrl等信息

1.2用户安装的软件的verCode和服务器上取得的做比较,检测到版本低就更新

2.下面是Android手机软件版本更新的教程

2.1项目目录

2.2编写UpdateManager类

  1. package com.doublejun.update;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.net.HttpURLConnection;
  7. import java.net.MalformedURLException;
  8. import java.net.URL;
  9. import android.app.AlertDialog;
  10. import android.app.AlertDialog.Builder;
  11. import android.app.Dialog;
  12. import android.content.Context;
  13. import android.content.DialogInterface;
  14. import android.content.Intent;
  15. import android.content.DialogInterface.OnClickListener;
  16. import android.content.IntentFilter;
  17. import android.net.Uri;
  18. import android.os.Handler;
  19. import android.os.Message;
  20. import android.util.Log;
  21. import android.view.LayoutInflater;
  22. import android.view.View;
  23. import android.widget.ProgressBar;
  24. public class UpdateManager {
  25. private Context mContext;
  26. private final String updateMsg = "亲,有新版本,快下载吧!";            //下载消息提示
  27. private Dialog noticeDialog;                                        //下载提示对话框
  28. private Dialog downloadDialog;                                      //下载进度对话框
  29. private ProgressBar mProgressBar;                                   //进度条
  30. private Boolean interceptFlag = false;                              //标记用户是否在下载过程中取消下载
  31. private Thread downloadApkThread = null;                            //下载线程
  32. private final String apkUrl = "http://www.ypdm.com/hyjj.apk";       //apk的URL地址
  33. private final String savePath = "/sdcard/UpdateDemo/";              //下载的apk存放的路径
  34. private final String saveFileName = savePath + "hyjjrelease.apk";   //下载的apk文件
  35. private int progress = 0;                                           //下载进度
  36. private final int DOWNLOAD_ING = 1;                                 //标记正在下载
  37. private final int DOWNLOAD_OVER = 2;                                //标记下载完成
  38. private final String TAG="版本更新";                                    //日志打印标签
  39. private Handler mhandler = new Handler() {                          //更新UI的handler
  40. @Override
  41. public void handleMessage(Message msg) {
  42. super.handleMessage(msg);
  43. switch (msg.what) {
  44. case DOWNLOAD_ING:
  45. // 更新进度条
  46. mProgressBar.setProgress(progress);
  47. break;
  48. case DOWNLOAD_OVER:
  49. downloadDialog.dismiss();
  50. installApk();
  51. //安装
  52. break;
  53. default:
  54. break;
  55. }
  56. }
  57. };
  58. /*
  59. * 构造方法
  60. */
  61. public UpdateManager(Context context) {
  62. this.mContext = context;
  63. }
  64. /*
  65. * 检查是否有需要更新,具体比较版本xml
  66. */
  67. public void checkUpdate() {
  68. // 到服务器检查软件是否有新版本
  69. //如果有则
  70. showNoticeDialog();
  71. }
  72. /*
  73. * 显示版本更新对话框
  74. */
  75. private void showNoticeDialog() {
  76. AlertDialog.Builder builder = new Builder(mContext);
  77. builder.setTitle("版本更新");
  78. builder.setMessage(updateMsg);
  79. builder.setPositiveButton("更新", new OnClickListener() {
  80. public void onClick(DialogInterface dialog, int which) {
  81. noticeDialog.dismiss();
  82. showDownloadDialog();
  83. }
  84. });
  85. builder.setNegativeButton("以后再说", new OnClickListener() {
  86. public void onClick(DialogInterface dialog, int which) {
  87. noticeDialog.dismiss();
  88. }
  89. });
  90. noticeDialog = builder.create();
  91. noticeDialog.show();
  92. }
  93. /*
  94. * 弹出下载进度对话框
  95. */
  96. private void showDownloadDialog() {
  97. AlertDialog.Builder builder = new Builder(mContext);
  98. builder.setTitle("软件更新");
  99. final LayoutInflater inflater = LayoutInflater.from(mContext);
  100. View v = inflater.inflate(R.layout.progress, null);
  101. mProgressBar = (ProgressBar) v.findViewById(R.id.updateProgress);
  102. builder.setView(v);
  103. builder.setNegativeButton("取消", new OnClickListener() {
  104. public void onClick(DialogInterface dialog, int which) {
  105. downloadDialog.dismiss();
  106. interceptFlag = true;
  107. }
  108. });
  109. downloadDialog = builder.create();
  110. downloadDialog.show();
  111. downloadLatestVersionApk();
  112. }
  113. /*
  114. * 下载最新的apk文件
  115. */
  116. private void downloadLatestVersionApk() {
  117. downloadApkThread = new Thread(downloadApkRunnable);
  118. downloadApkThread.start();
  119. }
  120. //匿名内部类,apk文件下载线程
  121. private Runnable downloadApkRunnable = new Runnable() {
  122. public void run() {
  123. try {
  124. URL url = new URL(apkUrl);
  125. HttpURLConnection conn = (HttpURLConnection) url
  126. .openConnection();
  127. conn.connect();
  128. int length = conn.getContentLength();
  129. Log.e(TAG, "总字节数:"+length);
  130. InputStream is = conn.getInputStream();
  131. File file = new File(savePath);
  132. if (!file.exists()) {
  133. file.mkdir();
  134. }
  135. File apkFile = new File(saveFileName);
  136. FileOutputStream out = new FileOutputStream(apkFile);
  137. int count = 0;
  138. int readnum = 0;
  139. byte[] buffer = new byte[1024];
  140. do {
  141. readnum = is.read(buffer);
  142. count += readnum;
  143. progress = (int) (((float) count / length) * 100);
  144. Log.e(TAG, "下载进度"+progress);
  145. mhandler.sendEmptyMessage(DOWNLOAD_ING);
  146. if (readnum <= 0) {
  147. // 下载结束
  148. mhandler.sendEmptyMessage(DOWNLOAD_OVER);
  149. break;
  150. }
  151. out.write(buffer,0,readnum);
  152. } while (!interceptFlag);
  153. is.close();
  154. out.close();
  155. } catch (MalformedURLException e) {
  156. e.printStackTrace();
  157. } catch (IOException e) {
  158. e.printStackTrace();
  159. }
  160. }
  161. };
  162. /*
  163. * 安装下载的apk文件
  164. */
  165. private void installApk() {
  166. File file= new File(saveFileName);
  167. if(!file.exists()){
  168. return;
  169. }
  170. Intent intent= new Intent(Intent.ACTION_VIEW);
  171. intent.setDataAndType(Uri.parse("file://"+file.toString()), "application/vnd.android.package-archive");
  172. mContext.startActivity(intent);
  173. }
  174. }

以上代码注释足够详细。不解释了。。

2.3在Main中调用试试吧。

  1. package com.doublejun.update;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. public class Main extends Activity {
  5. /** Called when the activity is first created. */
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.main);
  10. UpdateManager update = new UpdateManager(this);
  11. update.checkUpdate();
  12. }
  13. }

好吧,就这些。希望对你有帮助。

Android软件版本更新的更多相关文章

  1. Android软件开发之ListView 详解【转】

    ListView的使用方法  ListView是Android软件开发中非常重要组件之一,基本上是个软件基本都会使用ListView ,今天我通过一个demo来教大家怎么样使用ListView组件 绘 ...

  2. android软件开发之webView.addJavascriptInterface循环渐进【二】

    本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gra ...

  3. android软件开发之webView.addJavascriptInterface循环渐进【一】

    本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gra ...

  4. win 10 Hbuilder1.2.1连接Genymotion 调试Android 软件

    这里记录一下 Hbuilder1.2.1连接Genymotion 调试Android 软件 的过程: 步骤一:把Genymotion 的 adb.exe 路径配置到 Hbuilder 中 在 菜单栏 ...

  5. Android 软件管理工具类Utils

    Android 软件管理工具类Utils /** * Created by uilubo on 2015/9/30. * 工具类 */ public class Utils { public stat ...

  6. Android 软件退出系统方法重写

    Android 软件退出系统按键方法重写 //针对Andriod软件退出系统按键方法重写 ;//key down time @Override public boolean onKeyDown(int ...

  7. Android软件更新

    Android软件更新 //得到当前版本编码和版本名称. public static int getVerCode(Context context) { ; try { verCode =).vers ...

  8. 我对android 软件栈了解

    android 软件栈如图所示: Android平台的核心是Linux内核,它负责设备驱动程序.资源访问.电源管理和完成其他操作系统的职责.提供的设备驱动程序包括显示器.照相机,键盘.WiFi.闪存. ...

  9. 使用ViewPager实现android软件使用向导的功能

    现在的大部分android软件,都是使用说明,就是第一次使用该软件时,会出现向导,可以左右滑动,然后就进入应用的主界面了. 先看下效果图: 首先需要一个布局文件,是FlameLayout组成的,里面包 ...

随机推荐

  1. css实现两端对齐的3种方法

    两端对齐在移动端非常见,说到两端对齐,大家并不陌生,在word.powerpoint.outlook等界面导航处,其实都有一个两端对齐(分散对齐)的按钮,平时使用的也不多,我们更习惯与左对齐.居中对齐 ...

  2. javascript 数据结构和算法读书笔记 > 第三章 列表

    1. 结构分析 列表首先要有以下几个属性: listSize 长度 pos 当前位置 dataStore 数据 我们要通过以下方法对上面三个属性进行操作: length() 获取长度 | getPos ...

  3. 利用js制作异步验证ajax方法()

    如何利用js写ajax异步验证.代码如下: window.onload = function(){ var name = document.getElementById('register-name- ...

  4. leetcode算法刷题(三)

    今天在刷了几道简单的动态规划后,又看了看string方面的题 第五题 Longest Palindromic Substring 题目的意思:求一个字符串的最长回文子串 分析:开始,我的想法是,现在字 ...

  5. 无良教程-破解SublimeText3

    这教程实际上并不是倡导大伙儿去破解软件然后传播出去以侵犯作者的权益,纯粹是技术分享,如果大伙儿觉得Low了,可立马删除. sublime text是我非常喜欢的一款编辑器,在ubuntu上,之前用的一 ...

  6. Spring+Spring MVC+MyBatis

    Spring+Spring MVC+MyBatis 目录 一.新建一个基于Maven的Web项目 二.创建数据库与表 三.添加依赖包 四.新建POJO实体层 五.新建MyBatis SQL映射层 六. ...

  7. JS中如何使用Cookie

    1.关于JS设置Cookie的说明 在Javascript脚本里,一个cookie 实际就是一个字符串属性.当你读取cookie的值时,就得到一个字符串,里面当前WEB页使用的所有cookies的名称 ...

  8. Linux软件大全

    https://www.linux-apps.com/browse/cat/239/ord/latest/http://www.cnblogs.com/riskyer/p/3262745.htmlht ...

  9. CentOS 7 安装 Gitlab

    https://segmentfault.com/a/1190000002729796

  10. Android UI ActionBar功能-自动隐藏 Action Bar

    为了使ActionBar不影响Activity的布局内容,我们还可以设置ActionBar,将其设置为透明,并且让Activity是头部自动空出一个ActionBar的空间: 官方文档:http:// ...