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版本更新的更多相关文章

  1. Android 中如何计算 App 的启动时间?

    (转载) 已知的两种方法貌似可以获取,但是感觉结果不准确:一种是,adb shell am start -w packagename/activity,这个可以得到两个值,ThisTime和Total ...

  2. Android中为APP创建快捷方式的原理(自己的理解)

    我们首先来看Android中为APP创建快捷方式的原理: 从图上可以看出,Android大致分7步完成快捷方式的创建: 第一步:Android系统的launcher程序会调用它的pickShortcu ...

  3. Android中实现APP文本内容的分享发送与接收方法简述

    谨记(指定选择器Intent.createChooser()) 开始今天的内容前,先闲聊一下: (1)突然有一天头脑风暴,对很多问题有了新的看法和见解,迫不及待的想要分享给大家,文档已经写好了,我需要 ...

  4. Android测试(一):在Android中测试App

    原文:https://developer.android.com/training/testing/index.html 测试你的App是开发过程中的重要组成部分.通过对应用程序持续的运行测试,你可以 ...

  5. 在Android中使App高速、简单地支持新浪微博、微信、QQ、facebook等十几个主流社交平台的分享功能

    前言 在如今的APP或者游戏中,分享功能差点儿已经成为标配.分享功能不但能够满足用户的需求.也能够为产品带来很多其它的用户,甚至能够对用户的行为.活跃度.年龄段等情况进行数据统计,使得软件公司能够对产 ...

  6. 关于Android中查看app安装时间等信息的问题

    PackageManager packageManager=this.getPackageManager(); try { PackageInfo packageInfo=packageManager ...

  7. Android 轻松实现后台搭建+APP版本更新

    http://blog.csdn.net/u012422829/article/details/46355515 (本文讲解了在Android中实现APP版本更新,文末附有源码.) 看完本文,您可以学 ...

  8. 抓包工具Fidder详解(主要来抓取Android中app的请求)

    今天闲着没吊事,来写一篇关于怎么抓取Android中的app数据包?工欲行其事,必先利其器,上网google了一下,发现了一款神器:Fiddler,这个貌似是所有软件开发者必备神器呀!这款工具不仅可以 ...

  9. Android 6.0 7.0 8.0 一个简单的app内更新版本-okgo app版本更新

    登陆时splash初始页调用接口检查app版本.如有更新,使用okGo的文件下载,保存到指定位置,调用Android安装apk. <!-- Android 8.0 (Android O)为了针对 ...

随机推荐

  1. SDP协议中的Continuation State

    在SDP request和SDP response中,最后一部分为Continuation State,结构如下: 它用于一次response不够把所有的Data传回去的情况.这时候需要将respon ...

  2. asr,tts,vsr

    http://max.book118.com/html/2014/0814/9432056.shtm   ASR技术的基础主要是信号处理和概率模型. 信号处理技术 语音信号处理 谱分析   基于时间的 ...

  3. 答CsdnBlogger问-关于定时和后台服务问题

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 前段时间写了不少博客,在问答页面也陆续回答几十个问题,之后Csdn乙同学找到我,说要推荐我参加问答类 ...

  4. 用Quartz处理定时执行的任务

    这次做的项目中,有一部分功能需要实现定时执行.呃,这样说可能有点笼统,打个比方吧.例如用户在登录的时候,连续输错3次密码后,系统会将该用户冻结,不再允许该用户登录系统,等到了晚上零晨时分,再为所有被冻 ...

  5. Windows-004-显示文件的扩展名

    此文主要讲述 Windows 7 下如何显示文件的扩展名,敬请亲们参阅.若有不足之处,敬请大神指正,不胜感激! 通常安装好 Win7 后,文件的扩展名默认是不显示的,如下所示: 点击工具栏中的 组织, ...

  6. sql中的行转列和列转行的问题

    sql中的行转列和列转行的问题 这是一个常见的问题,也是一个考的问题 1.行转列的问题  简单实例 CREATE TABLE #T ( MON1 INT, MON2 INT, MON3 INT ) G ...

  7. openni2 和opencv读取数据

    http://blog.csdn.net/aptx704610875/article/details/49585241

  8. saltstack之(十一)扩展组件salt-returners

    场景:每次执行salt任务后,将返回结果存入到数据库,可以做任务跟踪以及历史查看. 1.在node1上安装mysql数据库并启动设置root密码.[root@node1 ~]# yum -y inst ...

  9. android handler调用post方法阻塞

    1.试下用postDelayed(Runnable a, int time),因为post把消息放到Looper中就返回,但Looper中没有其他消息又会被立刻取出来执行,这样就有可能做了run中的操 ...

  10. 对JSP和Servlet性能优化,提升执行效率

    你的J2EE应用是不是运行的很慢?它们能不能承受住不断上升的访问量?本文讲述了开发高性能.高弹性的JSP页面和Servlet的性能优化技术.其意思是建立尽可能快的并能适应数量增长的用户及其请求.在本文 ...