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

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

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. python3.5之string

    刚开始学习python变成, 这勉强算是第一个博客吧, 主要记录了一下 字符串 中的方法, 不太准确,或者是错误的地方, 请大家指点 str1 = "GooGle" str2 = ...

  2. CSS自学笔记(9):CSS拓展(二)

    CSS图片 当一个网页上有一张或多张图片,而且这些图片的尺寸比较大时,为了是网页布局更紧凑合理,我们可以将这些图片放到一个图片库里,可以有效的防止图片过大可能会对网页布局造成的不良影响. 通过CSS我 ...

  3. PHP5中__call、__get、__set、__clone、__sleep、__wakeup的用法

    __construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__w ...

  4. Taobao File System

    TFS是淘宝针对海量非结构化数据存储设计的分布式系统,构筑在普通的Linux机器集群上,可为外部提供高可靠和高并发的存储访问.高可扩展.高可用.高性能.面向互联网服务. 特性 采用扁平化的数据组织结构 ...

  5. Android TextView文字描边的实现!!

    Android开发:文字描边 转自:http://www.oschina.net/code/snippet_586849_37287 1. [代码][Java]代码 1 2 3 4 5 6 7 8 9 ...

  6. poj3589---判断两个数有多接近

    #include <stdio.h> #include <stdlib.h> int main() { ],s2[]; int a,b,i,j,n; scanf("% ...

  7. 数据存储(三)--JSON数据处理

    JSON是一种轻量级的数据交换格式,具有良好的可读和便于高速编写的特性,从而能够在不同平台间进行数据交换.JSON採用兼容性非常高的文本格式,同一时候也具备类似于C语言体系的行为.JSON能够将Jav ...

  8. C#学习基础总结

    概念:.net与c#.net/dontnet:一般指.net framework框架,一种平台,一种技术c#(charp):一种编程语言,可以开发基于.net的应用. *java既是一种技术又是一种编 ...

  9. JS原型,Prototype,原型

    对于javascript这样一种前端语言,个人觉得,要真正的理解其oop, 就必须要彻底搞清楚javascript的对象,原型链,作用域,闭包,以及this所引用的对象等概念.这些对弄明白了,应该就可 ...

  10. 2014.12.06 ASP.NET 三级联动,添加员工,修改员工

    (一)三级联动 要实现的效果: 代码: MyDBDataContext context = new MyDBDataContext(); protected void Page_Load(object ...