在Android开发中,许多开发者都会遇到如何让应用程序自动更新的问题,也就是需要让应用程序自动发现服务器上的新版本然后提示更新,当用户点击确定后就下载新版本的应用程序,下载完毕后自动安装更新新程序。

  关于这个主要的流程是这样的:程序启动 --> 在适当的时候后台检查更新 --> 链接远程服务器 --> 获取服务器端新版本信息 --> 比对当前版本 --> 判断是否有更新,如果有有 --> 显示更新提示对话框并显示更新提示内容 --> 交与用户选择是否立即更新。

  这个功能的实现需要在服务器端放置一个xml文件,xml文件主要用来说明当前版本信息,包括版本号,发布时间,版本功能

  介绍等信息。下面是一个例子:

     新版本描述信息

  1.uptInfo实体类,这个实体类对应于服务器端的xml文件,当程序检测是否有新版本时,首先从服务器下载xml文件后,会将这个xml文件内的信息解析到这个实体类中,参考代码如下:

  public class UptInfo {

  private String version; // 版本号

  private String url; // url路径

  private String description; // 更新说明信息

  public String getVersion() {

  return version;

  }

  public void setVersion(String version) {

  this.version = version;

  }

  public String getUrl() {

  return url;

  }

  public void setUrl(String url) {

  this.url = url;

  }

  public String getDescription() {

  return description;

  }

  public void setDescription(String description) {

  this.description = description;

  }

  }

  2.解析xml代码的工具类(这个类主要将从服务器端下载的xml解析到uptInfo实体类中),参考代码如下:

  public class ParseXmlUtils {

  //解析xml文件

  public static UptInfo parseXml(InputStream in) {

  UptInfo uptInfo = new UptInfo();

  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

  DocumentBuilder db = null;

  db = dbf.newDocumentBuilder();

  Document doc = null;

  doc = db.parse(in);

  Element root = doc.getDocumentElement();

  NodeList resultNode = root.getElementsByTagName("info");

  for (int i = 0; i < resultNode.getLength(); i++) {

  Element res = (Element) resultNode.item(i);

  uptInfo.setVersion(res.getElementsByTagName("version")

  .item(0).getFirstChild().getNodeValue());

  uptInfo.setUrl(res.getElementsByTagName("url").item(0)

  .getFirstChild().getNodeValue());

  uptInfo.setDescription(res

  .getElementsByTagName("description").item(0)

  .getFirstChild().getNodeValue());

  }

  return upInfo;

  }

  }

  3.VersionUtil类,这个类主要用来获取当前已安装的安卓应用程序的版本信息,主要用来与服务器端的xml中的版本信息对比判断是否提示更新,参考代码如下:

  public class VersionUtil {

  //获取版本号

  public static String getCurVersion(Context context)

  throws NameNotFoundException {

  // 获取PackageManager 实例

  PackageManager packageManager = context.getPackageManager();

  // 获得context所属类的包名,0表示获取版本信息

  PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);

  return packageInfo.versionName;

  }

  }

  4.主程序代码:

  public class AutoUptDemoActivity extends Activity {

  private Button button;

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  button = (Button) findViewById(R.id.check);

  button.setOnClickListener(new OnClickListener() {

  @Override

  public void onClick(View v) {

  checkVersion();

  }

  });

  }

  //检查是否需要更新程序

  private void checkVersion() throws NameNotFoundException {

  UptInfo uptInfo = new UptInfo();

  URL url;

  url = new URL(http://192.168.0.150:8080/update.xml);

  HttpURLConnection connection = (HttpURLConnection) url.openConnection();

  uptInfo = ParseXmlUtils.parseXml(connection.getInputStream());

  if (uptInfo.getVersion().equals(VersionUtil.getCurVersion(this))) {

  Toast.makeText(this, "版本相同,不需要升级!", Toast.LENGTH_SHORT).show();

  } else {

  showUpdateDialog(uptInfo);

  }

  }

  private void showUpdateDialog(UptInfo uptInfo) {

  AlertDialog alertDialog = new AlertDialog.Builder(this)

  .setTitle("提示检测到新版本,确定升级吗?").setIcon(R.drawable.ask)

  .setMessage(uptInfo.getDescription())

  .setPositiveButton("确定", new DialogInterface.OnClickListener() {

  @Override

  public void onClick(DialogInterface dialog, int which) {

  dialog.cancel(); //此处下载新版程序文件并安装,本文已经很长,这里不再赘述

  }

  })

  .setNegativeButton("取消", new DialogInterface.OnClickListener() {

  @Override

  public void onClick(DialogInterface dialog, int which) {

  dialog.cancel();

  }

  }).create();

  alertDialog.show();

  }

  }

  想要了解更多有关android开发的知识可以查询天地会。