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. MySQL数据库表名、列名、别名区分大小写的问题

    MySQL在Linux下数据库名.表名.列名.别名大小写规则是这样的: 1.数据库名与表名是严格区分大小写的: 2.表的别名是严格区分大小写的: 3.列名与列的别名在所有的情况下均是忽略大小写的: 4 ...

  2. MySQL-中文全文检索

    一.概述 MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度. 二.语法 1 2 MATCH (col1,col2,...) AGAINST (exp ...

  3. Activity初步,初学者必看

    Activity是什么? Activity是一个可与用户交互并呈现组件的视图.通俗说就是运行的程序当前的这个显示界面. 如果你还不明白,那么你写过HTML吗,它就好比一个网页.我们程序中的用户视图,都 ...

  4. Maven实战(一)安装与配置

    1. 简介 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 如果你已经有十次输入同样的Ant targets来编译你的代码.jar或者w ...

  5. [LeetCode]题解(python):051-N-Queens

    题目来源 https://leetcode.com/problems/n-queens/ The n-queens puzzle is the problem of placing n queens ...

  6. Essential Documents to Manage Your Projects

    Speak to an experienced project manager, and they can give you a wealth of good advice on the do's a ...

  7. c#基础,面试前迅速巩固c#最基础知识点

    n年前为了面试,搜罗的C#基础知识,记在了文档里.今天写到博客园里,与人分享,因为不是专家,所以仅供参考. 1.面向对象 在面向对象概念提出之前,语言都是面向过程的,说到面向对象,应该与面向过程比较, ...

  8. http://blog.sina.com.cn/s/blog_6940cab30101hn9j.html

    http://blog.sina.com.cn/s/blog_6940cab30101hn9j.html

  9. js的语句

    1.语句类型总结 var box = 100;//单行语句 { //用花括号包含的语句集合,叫做复合语句,单位一个 //一对花括号,表示一个复合语句,处理时,可以单做一条单行语句, //复合语句,我们 ...

  10. Apache中压力测试工具ab的操作说明

    1.压力测试工具ab(ApacheBench)的简单说明 1)     网站性能压力测试是性能调优过程中必不可少的一环.只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题.Apache中有个 ...