开发者社区> 最美的回忆> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

本文转自陈哈哈博客园博客,原文链接http://www.cnblogs.com/kissazi2/p/3349149.html如需转载请自行联系原作者


kissazi2


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android存储访问及目录
原文:Android存储访问及目录   Android存储访问及目录   Android的外部存储   Android支持外部存储(case-insensitive filesystem with immutable POSIX permission classes and modes)。
700 0
Android Studio进行APP设计开发之矢量图及XML文件转换
Android Studio进行APP设计开发之矢量图及XML文件转换
0 0
Android studio开发APP时设置更改启动时的主界面程序
Android studio开发APP时设置更改启动时的主界面程序
0 0
Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案
Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案
0 0
Android开发:使用Java对手机截图图片进行任意区域的颜色对比度处理操作
开发项目过程中,对于手机屏幕截图,需要对获取到的截图的任意部分进行区域颜色对比度的识别操作,由此判定任意指定区域是否满足某对比度基本标准,但是该功能在网上任何地方都没有找到过Java方面的代码,于是根据RGB转换测试的原理:即获取每个像素点的RGB,通过RGB对比度定义公式进行像素点的集合换取。
0 0
开发android项目的常用jar包
开发android项目的常用jar包
0 0
Android Studio开发Android APP
Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试。 Android Studio 主窗口由下图标注的几个逻辑区域组成:
0 0
开发时遇到监听的事件处理机制和SoundPool播放音效解决方法以及外部类的使用【Android】
开发时遇到监听的事件处理机制和SoundPool播放音效解决方法以及外部类的使用【Android】
0 0
【Android】开发Android应用时对于Handler消息传递与缓存问题深入运用and理解
【Android】开发Android应用时对于Handler消息传递与缓存问题深入运用and理解
0 0
ANDROID开发之http调试常见错误
ANDROID开发之http调试常见错误
0 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Android热修复技术原理详解与升级探索
立即下载
《深入探索Android热修复技术原理》
立即下载
手机卫士性能优化方案-Android篇
立即下载