Android中实现app版本更新
1,获取本地程序apk版本,并开启服务(下面这段代码一般在主Activity中的onCreate()方法中执行的,并开启后台服务下载新版本的apk)
//获取apk包文件的管理者对象
PackageManager manager = getPackageManager();
String apkVersion = "";
try{
PackageInfo packageInfo = manager.getPackageInfo(getPackagename,PackageManager.GET_ACTIVITIES);
//获取到当前apk版本
apkVersion=packageInfo.versionName;
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //开始服务的跳转,到service类
Intent intent=new Intent(this,UpdateApkService.class);
intent.putExtra("apkVersion", apkVersion);
startService(intent);
2,在服务UpdataApkService.java文件中的代码如下:
package com.example.queryencyclopediademo01.service; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject; import android.app.IntentService;
import android.content.Intent;
import android.os.Environment;
import android.os.Looper;
import android.widget.Toast; import com.example.queryencyclopediademo01.common.CBKApi;
import com.example.queryencyclopediademo01.domain.Apk;
import com.example.queryencyclopediademo01.utils.HttpUtils;
/**
* 自定义更新Apk的服务类
* @author dell
*
*/
public class UpdateApkService extends IntentService { public UpdateApkService() {
super("");
// TODO Auto-generated constructor stub
} /**
* 声明Apk对象
*/
private Apk apk; @Override
protected void onHandleIntent(Intent intent) {
System.out.println("onHandleIntent中线程的名称:"+Thread.currentThread().getName());
String apkVersion=intent.getStringExtra("apkVersion");
System.out.println("当前应用程序的版本名称:"+apkVersion); try {
byte[] buffer=HttpUtils.getNetBytes(CBKApi.UPDATE_APK_PATH);
if(buffer!=null){
JSONObject jsonObject=new JSONObject(new String(buffer));
this.apk=Apk.jsonParseApk(jsonObject); this.downLoadApk(apkVersion);
}else{
System.out.println("====获取最新APK文件失败!===");
//Toast.makeText(this, "获取最新APK文件失败!", Toast.LENGTH_LONG).show();
} } catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } /**
* 下载最新apk,尽量不要在3G网络下使用,会浪费用户很多流量
* @param apkVersion
*/
private void downLoadApk(String apkVersion) {
//如果网上最新版本和当前运行版本不相同,则下载
if(!this.apk.getVersion().equals(apkVersion)){
HttpClient httpClient=new DefaultHttpClient();
HttpGet httpGet=new HttpGet(apk.getUrl());
HttpResponse httpResponse=null;
InputStream inputStream=null; File file=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"new.apk");
OutputStream outputStream=null;
byte[] buffer=new byte[1024];
int len=0; try {
httpResponse=httpClient.execute(httpGet);
if(httpResponse.getStatusLine().getStatusCode()==200){
inputStream=httpResponse.getEntity().getContent();
outputStream=new FileOutputStream(file);
while((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer, 0, len);
} outputStream.flush();
Toast.makeText(getApplicationContext(), "最新APK下载成功!", Toast.LENGTH_LONG).show();
System.out.println("最新APK下载成功!"); }
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "最新APK下载失败!", Toast.LENGTH_LONG).show();
e.printStackTrace();
}finally{
httpClient.getConnectionManager().shutdown();
try {
inputStream.close();
outputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} } }
Apk.java中的jsonParseApk()方法中的代码,将更新版本的url中的json数据存入到Apk对象中
public static Apk jsonParseApk(JSONObject jsonObject){
JSONObject jsonObjectApk=jsonObject.optJSONObject("info");
String version=jsonObjectApk.optString("version");
String url=jsonObject.optString("url");
String createTime=jsonObject.optString("createTime"); return new Apk(version,url,createTime);
}
对上面的代码进行思路上的说明:首先创建一个IntentService类的子类,在onHandleIntent()方法中(这个方法是在子线程中进行的,所以可以进行耗时操作),
通过intent.getStringExtra(“XXX”)方法,获取到从Activity中传递过来的当前apk的版本,再通过网络请求获取服务器上该apk的最新版本,this.apk=
Apk.jsonParseApk(jsonObject); ,在downLoadApk()方法中进行比较,当服务器上的版本和本地版本不相同时,则开始下载新版本的apk。
Android中实现app版本更新的更多相关文章
- Android 中如何计算 App 的启动时间?
(转载) 已知的两种方法貌似可以获取,但是感觉结果不准确:一种是,adb shell am start -w packagename/activity,这个可以得到两个值,ThisTime和Total ...
- Android中为APP创建快捷方式的原理(自己的理解)
我们首先来看Android中为APP创建快捷方式的原理: 从图上可以看出,Android大致分7步完成快捷方式的创建: 第一步:Android系统的launcher程序会调用它的pickShortcu ...
- Android中实现APP文本内容的分享发送与接收方法简述
谨记(指定选择器Intent.createChooser()) 开始今天的内容前,先闲聊一下: (1)突然有一天头脑风暴,对很多问题有了新的看法和见解,迫不及待的想要分享给大家,文档已经写好了,我需要 ...
- Android测试(一):在Android中测试App
原文:https://developer.android.com/training/testing/index.html 测试你的App是开发过程中的重要组成部分.通过对应用程序持续的运行测试,你可以 ...
- 在Android中使App高速、简单地支持新浪微博、微信、QQ、facebook等十几个主流社交平台的分享功能
前言 在如今的APP或者游戏中,分享功能差点儿已经成为标配.分享功能不但能够满足用户的需求.也能够为产品带来很多其它的用户,甚至能够对用户的行为.活跃度.年龄段等情况进行数据统计,使得软件公司能够对产 ...
- 关于Android中查看app安装时间等信息的问题
PackageManager packageManager=this.getPackageManager(); try { PackageInfo packageInfo=packageManager ...
- Android 轻松实现后台搭建+APP版本更新
http://blog.csdn.net/u012422829/article/details/46355515 (本文讲解了在Android中实现APP版本更新,文末附有源码.) 看完本文,您可以学 ...
- 抓包工具Fidder详解(主要来抓取Android中app的请求)
今天闲着没吊事,来写一篇关于怎么抓取Android中的app数据包?工欲行其事,必先利其器,上网google了一下,发现了一款神器:Fiddler,这个貌似是所有软件开发者必备神器呀!这款工具不仅可以 ...
- Android 6.0 7.0 8.0 一个简单的app内更新版本-okgo app版本更新
登陆时splash初始页调用接口检查app版本.如有更新,使用okGo的文件下载,保存到指定位置,调用Android安装apk. <!-- Android 8.0 (Android O)为了针对 ...
随机推荐
- 我的第一个chrome扩展(3)——继续读样例
1.操作用户正在浏览的界面 http://www.ituring.com.cn/article/60212 问题:1.google未定义ID,用name为何无法找到? 2.如何让整个按钮一起动?原函数 ...
- 轮询、select、 epoll
网卡设备对应一个中断号, 当网卡收到网络端的消息的时候会向CPU发起中断请求, 然后CPU处理该请求. 通过驱动程序 进而操作系统得到通知, 系统然后通知epoll, epoll通知用户代码. 一. ...
- Asp.net Mvc4默认权限详细(下)
前言 菜鸟去重复之Sql的问题还没有得到满意的答案.如果哪位大哥有相关的资料解释,能够分享给我,那就太谢谢了. 以后每发表一篇博文我都会将以前遗留的问题在前言里指出,直到解决为止. 本文主要在于探讨一 ...
- 使用git Rebase让历史变得清晰
当多人协作开发一个分支时,历史记录通常如下方左图所示,比较凌乱.如果希望能像右图那样呈线性提交,就需要学习git rebase的用法. “Merge branch”提交的产生 我们的工作流程是:修改代 ...
- Swift-11-协议(Protocols)
协议定义了一个蓝图,规定了用来实现某一特定工作或者功能所必须的方法和属性.类.结构体或者枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能.任意能满足协议要求的类型被称为遵循confor ...
- stretchableImageWithLeftCapWidth 的使用方法
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight: (NSInteger)topCa ...
- 深度实践KVM笔记
深度实践KVM笔记 libvirt(virt-install,API,服务,virsh)->qemu(qemu-kvm进程,qemu-img)->KVM虚拟机->kvm.ko 内核模 ...
- MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- Java学习——对象和类
1. 入门例子 package jihite; public class Dog{ int dogage; public Dog(String name){ System.out.println(&q ...
- javaScript常用工具库
对应于百度前端技术学院2015年春季的课程2相关内容 https://github.com/baidu-ife/ife/tree/master/2015_spring/task/task0002 ht ...