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

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

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. 在Linux手动把文件转码的方法,防止乱码出现

    iconv -f utf-8 -t gb2312 report.html  >  report_test.html

  2. poj 1860 (Bellman_Ford判断正环)

    题意:给出n种货币,m中交换关系,给出两种货币汇率和手续费,求能不能通过货币间的兑换使财富增加. 用Bellman_Ford 求出是否有正环,如果有的话就可以无限水松弛,财富可以无限增加. #incl ...

  3. php 验证身份证有效性,根据国家标准GB 11643-1999 15位和18位通用

    //验证身份证是否有效 function validateIDCard($IDCard) { if (strlen($IDCard) == 18) { return check18IDCard($ID ...

  4. Linux网桥

    linux网桥的功能 转发数据包 网桥的功能在延长网络跨度上类似于中继器,然而它能提供智能化连接服务,即根据帧的终点地址处于哪一网段来进行转发和滤除.网桥对站点所处网段的了解是靠"自学习&q ...

  5. 配置oracle账号密码永不过期

    查看用户的proifle是哪个,一般是default: sql>SELECT username,PROFILE FROM dba_users; 查看指定概要文件(如default)的密码有效期设 ...

  6. openstack中文文档

    http://www.openstack.cn/p392.html   openStack Hacker中文文档 http://docs.mirantis.com/fuel-dev/develop/a ...

  7. Aix_bugzilla

    原创作品,转载请注明出处! Bugzilla在AIX上部署,网上看到的不多.我耗费了很长时间才算部署完,记录在这里,以防忘记了. 一.    下载安装文件或源代码 1. 下载Bugzilla 3.6. ...

  8. hdu2795线段树

    //=========================================== //segment tree //final version //by kevin_samuel(fenic ...

  9. Mysql 计算时间间隔函数

    #计算两个时间的间隔 #计算间隔天数 select TIMESTAMPDIFF(day,'2014-06-01',date(now())) #计算间隔月数 select TIMESTAMPDIFF(m ...

  10. deferred initcalls与模块化

    deferred initcalls与模块化 有两个技术可以加快kernel的启动速度: 1.deferred initcalls 2.模块化 它们的思想类似,都是将非必要的模块初始化推迟到内核启动之 ...