Android实现程序自动更新实例教程

一个良好的android 程序都应该有版本的更新,那怎样实现更新呢?今天就为大家介绍应用自动更新 的全过程。

程序 自动更新 的流程大致如下:

程序启动 -> 适时后台检查更新 -> 链接远程服务器 -> 获取新版本信息
-> 比对当前版本 -> if(有更新) -> 显示更新提示对话框并显示更新的内容 -> 交与用户选择

        下面是我做的一个简单demo,大家可以参考一下:
        布局比较简单就不上代码了。
        主程序代码:

  1. package com.cloay.update;

  2. import java.io.IOException;
  3. import java.net.HttpURLConnection;
  4. import java.net.MalformedURLException;
  5. import java.net.URL;

  6. import android.app.Activity;
  7. import android.app.AlertDialog;
  8. import android.content.DialogInterface;
  9. import android.content.pm.PackageManager.NameNotFoundException;
  10. import android.os.Bundle;
  11. import android.view.View;
  12. import android.view.View.OnClickListener;
  13. import android.widget.Button;
  14. import android.widget.Toast;

  15. /**
  16. * 程序<a title="自动更新" >自动更新</a> UpdateTestActivity.java
  17. *
  18. * @author Cloay 2011-11-23
  19. */
  20. public class UpdateTestActivity extends Activity {
  21.     private Button button;

  22.     @Override
  23.     public void onCreate(Bundle savedInstanceState) {
  24.         super.onCreate(savedInstanceState);
  25.         setContentView(R.layout.main);

  26.         button = (Button) findViewById(R.id.check);
  27.         button.setOnClickListener(new OnClickListener() {

  28.             @Override
  29.             public void onClick(View v) {
  30.                 try {
  31.                     checkVersion();
  32.                 } catch (NameNotFoundException e) {
  33.                     // TODO Auto-generated catch block
  34.                     e.printStackTrace();
  35.                 }
  36.             }
  37.         });
  38.     }

  39.     /**
  40.      * 检查是否需要更新程序
  41.      *
  42.      * @throws NameNotFoundException
  43.      */
  44.     private void checkVersion() throws NameNotFoundException {
  45.         UpdateInfo updateInfo = new UpdateInfo();
  46.         URL url;
  47.         try {
  48.             url = new URL("http://localhost:8080/update.xml");
  49.             HttpURLConnection connection = (HttpURLConnection) url
  50.                     .openConnection();
  51.             // connection.setConnectTimeout(5000);
  52.             updateInfo = ParseXmlUtils.parseXml(connection.getInputStream());

  53.         } catch (MalformedURLException e) {
  54.             e.printStackTrace();
  55.         } catch (IOException e) {
  56.             e.printStackTrace();
  57.         }
  58.         if (updateInfo.getVersion().equals(VersionUtil.getVersionName(this))) {
  59.             Toast.makeText(this, "版本相同,不需要升级!", Toast.LENGTH_SHORT).show();
  60.         } else {
  61.             showUpdateDialog(updateInfo);
  62.         }
  63.     }

  64.     private void showUpdateDialog(UpdateInfo updateInfo) {
  65.         AlertDialog alertDialog = new AlertDialog.Builder(this)
  66.                 .setTitle("提示检测到新版本,确定升级吗?").setIcon(R.drawable.ask)
  67.                 .setMessage(updateInfo.getDescription())
  68.                 .setPositiveButton("确定", new DialogInterface.OnClickListener() {
  69.                     @Override
  70.                     public void onClick(DialogInterface dialog, int which) {
  71.                         dialog.cancel();
  72.                     }
  73.                 })
  74.                 .setNegativeButton("取消", new DialogInterface.OnClickListener() {

  75.                     @Override
  76.                     public void onClick(DialogInterface dialog, int which) {
  77.                         dialog.cancel();
  78.                     }
  79.                 }).create();
  80.         alertDialog.show();
  81.     }
  82. }

复制代码
这里说明一下:远程服务器放置一个xml文件,用来说明当前新版本的信息。包括版本号,新版本功能说明,新版下载链接。
xml解析工具代码:

  1. package com.cloay.update;

  2. import java.io.IOException;
  3. import java.io.InputStream;

  4. import javax.xml.parsers.DocumentBuilder;
  5. import javax.xml.parsers.DocumentBuilderFactory;
  6. import javax.xml.parsers.ParserConfigurationException;

  7. import org.w3c.dom.Document;
  8. import org.w3c.dom.Element;
  9. import org.w3c.dom.NodeList;
  10. import org.xml.sax.SAXException;

  11. /**
  12. * 解析Xml文件 ParseXmlUtils.java
  13. *
  14. * @author Cloay 2011-11-7
  15. */
  16. public class ParseXmlUtils {
  17.     /**
  18.      * 通过InputStream 解析文件
  19.      *
  20.      * @param in
  21.      * @return
  22.      */
  23.     public static UpdateInfo parseXml(InputStream in) {
  24.         UpdateInfo updateInfo = new UpdateInfo();
  25.         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  26.         DocumentBuilder db = null;
  27.         try {
  28.             db = dbf.newDocumentBuilder();
  29.             Document doc = null;
  30.             doc = db.parse(in);
  31.             Element root = doc.getDocumentElement();
  32.             NodeList resultNode = root.getElementsByTagName("info");
  33.             for (int i = 0; i < resultNode.getLength(); i++) {
  34.                 Element res = (Element) resultNode.item(i);
  35.                 updateInfo.setVersion(res.getElementsByTagName("version")
  36.                         .item(0).getFirstChild().getNodeValue());
  37.                 updateInfo.setUrl(res.getElementsByTagName("url").item(0)
  38.                         .getFirstChild().getNodeValue());
  39.                 updateInfo.setDescription(res
  40.                         .getElementsByTagName("description").item(0)
  41.                         .getFirstChild().getNodeValue());
  42.             }
  43.         } catch (ParserConfigurationException e) {
  44.             e.printStackTrace();
  45.         } catch (SAXException e) {
  46.             e.printStackTrace();
  47.         } catch (IOException e) {
  48.             e.printStackTrace();
  49.         }
  50.         return updateInfo;
  51.     }
  52. }

复制代码
updateInfo实体:

  1. package com.cloay.update;

  2. /**
  3. * 更新信息实体类 UpdateInfo.java
  4. *
  5. * @author Cloay 2011-11-23
  6. */
  7. public class UpdateInfo {
  8.     private String version; // 版本号
  9.     private String url; // 新版本存放url路径
  10.     private String description; // 更新说明信息,比如新增什么功能特性等

  11.     public String getVersion() {
  12.         return version;
  13.     }

  14.     public void setVersion(String version) {
  15.         this.version = version;
  16.     }

  17.     public String getUrl() {
  18.         return url;
  19.     }

  20.     public void setUrl(String url) {
  21.         this.url = url;
  22.     }

  23.     public String getDescription() {
  24.         return description;
  25.     }

  26.     public void setDescription(String description) {
  27.         this.description = description;
  28.     }
  29. }

复制代码
获取当前已安装版本信息:

  1. package com.cloay.update;

  2. import android.content.Context;
  3. import android.content.pm.PackageInfo;
  4. import android.content.pm.PackageManager;
  5. import android.content.pm.PackageManager.NameNotFoundException;

  6. /**
  7. * 版本工具类 VersionUtil.java
  8. *
  9. * @author Cloay 2011-11-23
  10. */
  11. public class VersionUtil {
  12.     /**
  13.      * 获取版本号
  14.      *
  15.      * @param context
  16.      *            上下文
  17.      * @return
  18.      * @throws NameNotFoundException
  19.      */
  20.     public static String getVersionName(Context context)
  21.             throws NameNotFoundException {
  22.         // 获取PackageManager 实例
  23.         PackageManager packageManager = context.getPackageManager();
  24.         // 获得context所属类的包名,0表示获取版本信息
  25.         PackageInfo packageInfo = packageManager.getPackageInfo(
  26.                 context.getPackageName(), 0);
  27.         return packageInfo.versionName;
  28.     }
  29. }

复制代码
整个过程并不麻烦,许多地方已经详细注释了,就写那么多。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值