Android开发之应用程序更新实现
近期给项目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开发之应用程序更新实现的更多相关文章
- android 开发中 sdk 无法更新
现在用到android 的多个版本适配 , 换了个新环境 , 重新配置了android 的开发环境,哪想到遇到了很多小问题. 今天又遇到了 android sdk manager 无法更新的问题. ...
- [android] 手机卫士应用程序更新和签名
弹出升级对话框 获取AlertDialog.Builder对象,通过new出来 调用Builder对象的setTitle()方法,参数:文本 调用Builder对象的setMessage()方法,参数 ...
- Android开发eclipse运行程序时报timeout的解决方法
eclipse开发Android程序时,忽然莫名其妙报这个错,之前还好好的.忽然就不行了. Failed to install xxx.apk on device~~~: timeout 尝试过手机里 ...
- Android开发之应用程序窗体显示状态操作(requestWindowFeature()的应用)
转自:http://www.cnblogs.com/salam/archive/2010/11/30/1892143.html 我们在开发程序是经常会需要软件全屏显示.自定义标题(使用按钮等控件)和其 ...
- 写给 Android 开发的小程序布局指南,Flex 布局!
一.序 Hi,大家好,我是承香墨影! 最近在做小程序,验证一些方向,开发效率确实很快,就是各种微信的审核有点费劲,但是总归是有办法解决的. 想要开发一款小程序,其实和我们正常写一款 App 类似,你需 ...
- Android开发——实现子线程更新UI
Android中线程按功能分的话,可以分为两个,一个是主线程(UI线程),其他的都是子线程 主线程不能执行那些耗时过长的代码或任务(执行耗时过长的代码会出现应用未响应的提示),所以都是使用子线程来执行 ...
- Android开发之应用程序的安装
这里介绍的是用XUtils下载apk文件,然后进行安装. 首先用HttpUtils下载文件(记得获取SD卡的读写权限和联网的权限): /** * 下载Apk */ private void downL ...
- 【Android开发笔记】程序崩溃异常总结
广播注册相关(broadcastReceiver) 没有注册广播就注销广播 注册广播但未注销广播 注册广播后重复注销广播 解决办法: 添加一个布尔变量,注册广播后为true,若为true在执行注销,注 ...
- 在windows下用cygwin和eclipse搭建cocos2dx的android开发环境
在windows下用cygwin和eclipse搭建cocos2dx(2.1.4)的android开发环境,2013-8-1更新. 一.准备工作 需要下载和安装以下内容,请根据自己的操作系统选择x86 ...
随机推荐
- Flask实战第40天:图片验证码生成技术
图片验证码生成 安装pillow pip install pillow 在utils下新建python package命名为captcha 把需要需要用到的字体放在captcha下 编辑captcha ...
- Python开发基础-Day9-生成器、三元表达式、列表生成式、生成器表达式
生成器 生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器,生成器在本质上就是迭代器. def foo(): print('first------>') yield 1 pri ...
- Codeforces 379 F. New Year Tree
\(>Codeforces \space 379 F. New Year Tree<\) 题目大意 : 有一棵有 \(4\) 个节点个树,有连边 \((1,2) (1,3) (1,4)\) ...
- AGC 026 C - String Coloring
题面在这里! 比较简单的折半搜索,推一下hash函数,要求正反最后相等就行了. #include<bits/stdc++.h> #define ll unsigned long long ...
- [CODE FESTIVAL 2016]Encyclopedia of Permutations
题意:给定一个排列,其中有可能有一些未确定的数,求出所有可能的排列的排名之和 首先我们要知道怎么算一个给定排列的排名,设它为$p_{1\cdots n}$ 排名即为比它小的排列数$+1$,对于每一个比 ...
- 【模拟】【set】hdu 4789 ICPC Ranking
写了一晚上,TLE到死,我选择GG 喵的好像还是前几年我校出的题,这整场都……tm…… 改日在战 /*TLE代码*/ #include<cstdio> #include<vector ...
- mysql表相关操作
表的完整性约束 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性 主要分为: not null 标识该字段不能为空 default 为该字段设置默认值 unsign ...
- redis源码解析之dict数据结构
dict 是redis中最重要的数据结构,存放结构体redisDb中. typedef struct dict { dictType *type; void *privdata; dictht ht[ ...
- Ucenter添加新应用
最近手头上有个项目需要用到Ucenter跟Discuz和UcHome整合到一起,使用同步登录.注册,使用同一的用户数据. 以前没用过Ucenter,第一次接触,看过官网的教程感觉不难.于是开始动手,下 ...
- 也来讲REST、SOAP
在GIS网络开发过程中不可避免的的会涉及到REST(Representational State Transfer)的服务.自从Roy Fielding博士在2000年他的博士论文中提出REST风格的 ...