• 使用七牛云存储实现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

  • 相关阅读:
    适用于Bash编程初学者小例子
    Linux下的压缩与解压命令速查
    Linux下拷贝一个带有soft link的dir,会把被link的内容也拷贝过来吗?
    适用于Bash编程初学者小例子
    从一个git仓库迁移代码到另一个git仓库(亲测有效版)(转)
    海量数据面试题(附题解+方法总结)(转)
    leetcode刷题(六)路径总和I、II、III(转)
    浅谈AVL树,红黑树,B树,B+树原理及应用(转)
    [LeetCode] 860. Lemonade Change 买柠檬找零(转)
    [leetcode] 134. Gas Station 解题报告(转)
  • 原文地址:https://www.cnblogs.com/kissazi2/p/3349149.html
Copyright © 2020-2023  润新知