使用七牛雲存儲實現Android的自動更新


為了修復Bug或更新軟件,我們通常需要實現自動更新,沒有哪一個牛逼的人能夠搞到每一個用戶的機子去幫他們更新。

1、自動更新的流程

我們將了解一下自動更新的思路。既然軟件要自動更新,那么它必須知道自己是不是最新版本,那么我們就需要在某一個地方放跟版本和更新有關的信息,一般來講,我們會在自己的網站上放一個記錄版本信息的XML文本,還有我們的軟件。當我們獲取了版本信息,假設這時候需要更新,那么我們的軟件會自動向服務器下載最新版本,然后用最新版本將老版本替換掉。具體的流程如下圖所示

 

2、利用雲存儲空間實現自動更新

照着上面講的流程,我們將慢慢實現:

編寫版本信息文件

上傳文件到雲存儲空間

使用相關的代碼來實現

2.1現在我們來編寫所需要的版本信息文件。后面,我們軟件里面主要通過讀取版本信息,來判斷是否要更新,要更新的時候從這個文件中獲取新版軟件下載地址。我寫了一個示例的,如下圖。

image

2.2七牛是一個雲存儲服務商,用七牛來演示主要是因為他提供了一些免費空間。七牛空間的申請和上傳文件可以參考文檔。上傳完版本信息文件,記錄一下他的下載地址,以便后面用來檢測是否有新版本。

image

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文件中寫上軟件的更新說明,然后將它顯示到更新的提示框中。

image

我再解釋一下跟解析版本信息有關的代碼吧。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM