近期给项目app做升级。对Android应用程序更新稍有研究,分享一下我的心得。

既然是更新,那么一定是要联网和下载的。所以联网和存储訪问权限时一定要有的:

<!-- 权限申请 -->

    <uses-permission android:name="android.permission.INTERNET" />
<!-- 联网权限 -->

    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 存储权限 -->

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

能够用xml的方式和数据库、php等方式检測升级版本号

XML:

<?

xml version="1.0" encoding="utf-8"?>

<update>

        <version>2.0<ersion>

        <description>这里写一些这个版本号的特点</description>

        <apkurl>填写应用下载下载地址</apkurl>

        <!--这里的ip地址一定要写你server所在的电脑的ip地址。我们会在Security这个文件夹以下放置一下new.apk的,用来更新的-->

</update>

匹配一下:

public class UpdateInfoParser {

public static UpdateInfo getUpdateInfo(InputStream is) throws Exception {

UpdateInfo info = new UpdateInfo();

XmlPullParser xmlPullParser = Xml.newPullParser();

xmlPullParser.setInput(is, "utf-8");

int type = xmlPullParser.getEventType();

while (type != XmlPullParser.END_DOCUMENT) {

switch (type) {

case XmlPullParser.START_TAG:

if (xmlPullParser.getName().equals("version")) {

info.setVersion(xmlPullParser.nextText());

} else if (xmlPullParser.getName().equals("description")) {

info.setDescription(xmlPullParser.nextText());

} else if (xmlPullParser.getName().equals("apkurl")) {

info.setUrl(xmlPullParser.nextText());

}

break;

default:

break;

}

type = xmlPullParser.next();

}

return info;

}

}

HTTP请求:

public class UpdateInfoService {

private Context context;



public UpdateInfoService(Context context) {

this.context = context;

}



public UpdateInfo getUpdateInfo(int urlId) throws Exception {

String path = context.getResources().getString(urlId);// 拿到config.xml里面存放的地址

URL url = new URL(path);

HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();// 开启一个http链接

httpURLConnection.setConnectTimeout(5000);// 设置链接的超时时间,如今为5秒

httpURLConnection.setRequestMethod("GET");// 设置请求的方式

InputStream is = httpURLConnection.getInputStream();// 拿到一个输入流。里面包涵了update.xml的信息

return UpdateInfoParser.getUpdateInfo(is);// 解析xml

}

}

然后就能够依据与获取到的数据相比較而且下载更新了。

其它的做法和这个类似,只是此种方式比較简单一些,也是最频繁的使用方式。

个人辛勤劳动成果。如有转载,请注明出处,谢谢!

Android开发之应用程序更新实现的更多相关文章

  1. android 开发中 sdk 无法更新

    现在用到android 的多个版本适配 , 换了个新环境 , 重新配置了android 的开发环境,哪想到遇到了很多小问题.  今天又遇到了 android sdk manager 无法更新的问题.  ...

  2. [android] 手机卫士应用程序更新和签名

    弹出升级对话框 获取AlertDialog.Builder对象,通过new出来 调用Builder对象的setTitle()方法,参数:文本 调用Builder对象的setMessage()方法,参数 ...

  3. Android开发eclipse运行程序时报timeout的解决方法

    eclipse开发Android程序时,忽然莫名其妙报这个错,之前还好好的.忽然就不行了. Failed to install xxx.apk on device~~~: timeout 尝试过手机里 ...

  4. Android开发之应用程序窗体显示状态操作(requestWindowFeature()的应用)

    转自:http://www.cnblogs.com/salam/archive/2010/11/30/1892143.html 我们在开发程序是经常会需要软件全屏显示.自定义标题(使用按钮等控件)和其 ...

  5. 写给 Android 开发的小程序布局指南,Flex 布局!

    一.序 Hi,大家好,我是承香墨影! 最近在做小程序,验证一些方向,开发效率确实很快,就是各种微信的审核有点费劲,但是总归是有办法解决的. 想要开发一款小程序,其实和我们正常写一款 App 类似,你需 ...

  6. Android开发——实现子线程更新UI

    Android中线程按功能分的话,可以分为两个,一个是主线程(UI线程),其他的都是子线程 主线程不能执行那些耗时过长的代码或任务(执行耗时过长的代码会出现应用未响应的提示),所以都是使用子线程来执行 ...

  7. Android开发之应用程序的安装

    这里介绍的是用XUtils下载apk文件,然后进行安装. 首先用HttpUtils下载文件(记得获取SD卡的读写权限和联网的权限): /** * 下载Apk */ private void downL ...

  8. 【Android开发笔记】程序崩溃异常总结

    广播注册相关(broadcastReceiver) 没有注册广播就注销广播 注册广播但未注销广播 注册广播后重复注销广播 解决办法: 添加一个布尔变量,注册广播后为true,若为true在执行注销,注 ...

  9. 在windows下用cygwin和eclipse搭建cocos2dx的android开发环境

    在windows下用cygwin和eclipse搭建cocos2dx(2.1.4)的android开发环境,2013-8-1更新. 一.准备工作 需要下载和安装以下内容,请根据自己的操作系统选择x86 ...

随机推荐

  1. 【JavaScript】JS将Java的Timestamp转为Date类型

    遇到一个小需求,由于要填充日期插件里的数据,前台要把java后台传来的Date类型的数据转成YYYY-MM-DD格式的时间数据.通过json传输,Java的Date类型的数据自动转成了时间戳,例如 “ ...

  2. JavaScript中的Array数组详解

    ECMAScript中的数组与其他多数语言中的数组有着相当大的区别,虽然数组都是数据的有序列表,但是与其他语言不同的是,ECMAScript数组的每一项可以保存任何类型的数据.也就是说,可以用数组的第 ...

  3. 【CodeVS 2845】排序的代价

    http://codevs.cn/problem/2845/ 好难的题啊qwq 没想到把排好序的数组的第i位和原数组的第i位的值看成一个单射函数,这样这是一个长度为n的置换. 对于置换的其中一个循环, ...

  4. 【最短路】【Heap-dijkstra】hihocoder 1587 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 J. Typist's Problem

    题意:给你一个串,仅含有a~g,且每个字母只出现最多一次.和一个光标初始位置,以及一个目标串,问你最少要多少的代价变化成目标串. 有五种操作:在光标前添加一个未出现过的字母,代价1. 删除光标前或者光 ...

  5. 【最大流FF模板】HDU1532&POJ1273

    参照<挑战程序设计竞赛> #include<iostream> #include<cstdio> #include<cstdlib> #include& ...

  6. bootstrapTable定位行固定滚动条

    写在前面: 当页面table列表数据有修改后,用户需要再次回到修改的行位置. 1.当修改行数据后,table刷新,行数据位置前后不发生改变 ,可使用下面这种方法: /*获取当前滚动条的位置*/ var ...

  7. (小规模)b牌棋盘完美覆盖数

    (小规模)b牌棋盘完美覆盖数 考虑一个普通的国际象棋棋盘,它被分成8*8(8行8列)的64个正方形.设有形状一样的多米诺骨牌,每张牌恰好覆盖棋盘上相邻的两个方格(即1*2的骨牌).那么能否把32个这样 ...

  8. mongo基础---增删改查

    正文 MongoDB 是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB是一个介于关系型数据库和非关系数据库之间的产品,是非关系数据 ...

  9. WEB.NET error:请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping 解决方案

    参考 http://blog.csdn.net/kisscatforever/article/details/50579935 今天用了一个组件 一个验证型的组件. 然后出现了这个问题. 我看了网上一 ...

  10. QPS相关的概念收集(吞吐量(TPS)、QPS、并发数、响应时间(RT))

    一.概念: 1.响应时间(RT) 响应时间是指系统对请求作出响应的时间.直观上看,这个指标与人对软件性能的主观感受是非常一致的,因为它完整地记录了整个计算机系统处理请求的时间.由于一个系统通常会提供许 ...