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. js判断ie版本号

     jQuery 2.0 去除了对浏览器版本号的判断(它推荐特性检测),这里是一个老外写的原生判断方法,这段代码着实巧妙!既简介.有向后兼容!一般做法都是:正则搜索 USER_AGENT :但因为历史原 ...

  2. github中国版本coding.net 的部署和使用

    1.在coding.net注册帐号. 2.安装github,自己百度github软件然后安装. 3.打开coding.net 输入帐号后新建项目 创建项目 创建后,创建ssh公钥,如果不创建的话,在每 ...

  3. 用Js的eval解析JSON中的注意点

    在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery的ea ...

  4. hdu1231最大连续子序列

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1231 #include<iostream> #include<cstdio> ...

  5. 面向对象分析方法(I)

    找出最关键的一些业务场景:一般通过动词来寻找,比如招聘系统中,一个应聘人投递一个职位就是一次应聘,应聘就是一个业务场景:一个学生参加某门课的考试,那么考试就是一个业务场景:一个学生去图书馆借书,那么借 ...

  6. Selenium2学习-016-WebUI自动化实战实例-014-Selenium 窗口选择

    在日常的 WebUI 自动化测试脚本编写过程中,经常需要打开新的页面,或者在多个打开的页面之间进行切换,以对页面元素进行相应的操作,以模拟用户的行为,实现 UI 的自动化测试.在过往的时间中,经常有初 ...

  7. Ioc-Autofac实现自动的注入

    在开发过程中,最郁闷的莫过于当你新增一个Service时,你需要对该Service进行注册,有的是使用代码注入,有的是XML配置注入,不管是哪种类型的注入,经常会出现开发人员忘记注入的情况. 于是我试 ...

  8. json和string 之间的相互转换

    json和string 之间的相互转换 <script type="text/javascript"> //先认识一下js中json function showInfo ...

  9. 网站启动SSL, http变为https后,session验证码错误解决方法

    网站启动SSL, http变为https后,session验证码错误解决方法   最近公司需要后台启动安全证书,证书安装完毕后,后台老提示 验证码错误,经过几天的研究,此问题已经得到有效解决,现把方法 ...

  10. 最近在研究电台类app,分享2个源码大家一起讨论

    好像去年有一阵,电台类的app特别火爆,喜马拉雅和蜻蜓FM互相还撕逼.听老罗,听好好说话,都得在电台app里,所以我想研究研究这些app.我没那么多资源,只好从app的开发架构方面去研究. 我看api ...