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

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

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. 创建style和修改style

    1.创建style 在res/values/styles.xml中设置style 根元素<resource> 子元素:<style> 属性:name:样式的名称 parent: ...

  2. HTTP生命周期

    HTTP生命周期 Http 请求 AspNet_ISAIP.DLL (ISAPI扩展,独立于站点外,用于可扩展的桥梁), w3wp.exe (net工作进程) IIS6 以上,6以下为aspnet_w ...

  3. 用gson 解 json

    1.json 简单介绍 轻量级数据存储传输文件,比xml精简. 2.Gson简单介绍 android中解json方式很多,比较常用json-lib  goole-Gson. json-lib要包含的包 ...

  4. Delphi 进阶基础技能说明

    以下讨论均基于Delphi XE8,主要是利用DELPHI新版的功能,如:Unicode,泛型,匿名函数等[XE2 后应该都支持]. 用新特性的好处是少写代码,提高效率.本博客不再讨论Delphi旧版 ...

  5. 驳Linux不娱乐 堪比Win平台中十款播放器

    播放器在我们日常生活中扮演着非常重要的角色,在Windows操作系统中,播放器被应用的非常广泛,不但我们可以听音乐,甚至还可以听广播,制作铃声,下载音乐等等.而在Linux发行版中,缺少娱乐性一直性W ...

  6. 《小C QQ空间转帖、分享工具》之QQ空间数据传递的g_tk算法(C#)

    原文地址:http://user.qzone.qq.com/419067339/2 public string GET_HTTP(string url, string referer_post, st ...

  7. HashMap 的遍历key与value的方法

    HashMap最经常使用的使用方法是依据key增删改查value,有时候会须要知道一个HashMap有多少个keys以及这些keys都是什么,能够用以下的代码实现. 方法1: Map map = ne ...

  8. Secret of Success(成功的秘诀)

    A youngman asked Socrates the secret of Success. Socrates told the youngman to meet him near the riv ...

  9. list去重 转载

    http://blog.csdn.net/huaishuming/article/details/47778319 1. 单个List 去重: 如果用的是Set集合就不用怕重复的问题了,如果用的Lis ...

  10. php curl详解用法[真的详解]

    目前为目最全的CURL中文说明了,学PHP的要好好掌握.有很多的参数.大部份都很有用.真正掌握了它和正 则,一定就是个采集高手了. 通用函数: function curl_file_get_conte ...