為了修復Bug或更新軟件,我們通常需要實現自動更新,沒有哪一個牛逼的人能夠搞到每一個用戶的機子去幫他們更新。
1、自動更新的流程
我們將了解一下自動更新的思路。既然軟件要自動更新,那么它必須知道自己是不是最新版本,那么我們就需要在某一個地方放跟版本和更新有關的信息,一般來講,我們會在自己的網站上放一個記錄版本信息的XML文本,還有我們的軟件。當我們獲取了版本信息,假設這時候需要更新,那么我們的軟件會自動向服務器下載最新版本,然后用最新版本將老版本替換掉。具體的流程如下圖所示
2、利用雲存儲空間實現自動更新
照着上面講的流程,我們將慢慢實現:
編寫版本信息文件
上傳文件到雲存儲空間
使用相關的代碼來實現
2.1現在我們來編寫所需要的版本信息文件。后面,我們軟件里面主要通過讀取版本信息,來判斷是否要更新,要更新的時候從這個文件中獲取新版軟件下載地址。我寫了一個示例的,如下圖。
2.2七牛是一個雲存儲服務商,用七牛來演示主要是因為他提供了一些免費空間。七牛空間的申請和上傳文件可以參考文檔。上傳完版本信息文件,記錄一下他的下載地址,以便后面用來檢測是否有新版本。
2.3 解析XML相關的代碼
/** * 從網絡上獲取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; }
2.4 更新有關的樣例和代碼請參考http://www.cnblogs.com/coolszy/archive/2012/04/27/2474279.html,這篇博文已經講的很好了。
3、進一步的考慮。
3.1 有時候我們會需要顯示軟件更新的信息,這時候我們可以在剛剛編寫的version.xml文件中寫上軟件的更新說明,然后將它顯示到更新的提示框中。
我再解釋一下跟解析版本信息有關的代碼吧。
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; } }
3.2 有時候我們會需要針對不同的版本
就像微軟會為WinXP,Win2003,Win7發布不同的補丁一樣,有時候我們也需要為自己不同版本的軟件發布補丁,因為並不是所有的軟件都像新浪微博一樣,只要用戶齊刷刷地更新到最新版本就行了。
針對這一點,我的思路是:將之前的version.xml的命名方式改成以“版本名+版本號.xml”的命名方式,這樣子,我們就可以根據版本名和版本號對應到指定的更新信息。
參考鏈接:http://www.cnblogs.com/coolszy/archive/2012/04/27/2474279.html