我们将了解一下自动更新的思路。既然软件要自动更新,那么它必须知道自己是不是最新版本,那么我们就需要在某一个地方放跟版本和更新有关的信息,一般来讲,我们会在自己的网站上放一个记录版本信息的XML文本,还有我们的软件。当我们获取了版本信息,假设这时候需要更新,那么我们的软件会自动向服务器下载最新版本,然后用最新版本将老版本替换掉。具体的流程如下图所示
2.1现在我们来编写所需要的版本信息文件。后面,我们软件里面主要通过读取版本信息,来判断是否要更新,要更新的时候从这个文件中获取新版软件下载地址。我写了一个示例的,如下图。
/**
* 从网络上获取XML
*
* @return XML输入流
* @throws IOException
* 网络文件不存在
*/
private InputStream getVersionFromNetwork() throws IOException {
// 确定请求服务器的地址
// 注意在Android模拟器中访问本机服务器时不可以使用localhost与127字段
// 因为模拟器本身是使用localhost绑定
String path = "
http://换成你自己的空间名.u.qiniudn.com/version.xml";
// 建立一个URL对象
URL url = new URL(path);
// 得到打开的链接对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置请求超时与请求方式
conn.setReadTimeout(5 * 1000);
conn.setRequestMethod("GET");
// 从链接中获取一个输入流对象
InputStream inStream = conn.getInputStream();
return inStream;
}

package com.example.utils.android;//这是我的命名空间,你应该换成自己的
import java.io.InputStream;
import java.util.HashMap;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class ParXmlService {
public HashMap<String, String> parseXml(InputStream inStream)
throws Exception {
HashMap<String, String> hashMap = new HashMap<String, String>();
// 创建DocumentBuilderFactory,该对象将创建DocumentBuilder。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder,DocumentBuilder将实际进行解析以创建Document对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析该文件以创建Document对象
Document document = builder.parse(inStream);
// 获取XML文件根节点
Element root = document.getDocumentElement();
// 获得所有子节点
NodeList childNodes = root.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node childNode = (Node) childNodes.item(i);
if (childNode.getNodeType() == Node.ELEMENT_NODE) {
Element childElement = (Element) childNode;
// 版本号
if ("version".equals(childElement.getNodeName())) {
hashMap.put("version", childElement.getFirstChild()
.getNodeValue());
// 软件名称
} else if ("name".equals(childElement.getNodeName())) {
hashMap.put("name", childElement.getFirstChild()
.getNodeValue());
// 下载地址
} else if ("url".equals(childElement.getNodeName())) {
hashMap.put("url", childElement.getFirstChild()
.getNodeValue());
} else if (("displayMessage".equals(childElement.getNodeName())))// 更新描述
{
hashMap.put("displayMessage", childElement.getFirstChild()
.getNodeValue());
}
}
}
return hashMap;
}
}

就像微软会为WinXP,Win2003,Win7发布不同的补丁一样,有时候我们也需要为自己不同版本的软件发布补丁,因为并不是所有的软件都像新浪微博一样,只要用户齐刷刷地更新到最新版本就行了。
针对这一点,我的思路是:将之前的version.xml的命名方式改成以“版本名+版本号.xml”的命名方式,这样子,我们就可以根据版本名和版本号对应到指定的更新信息。