思路

在app启动时候去请求服务器上的app版本号,看是否大于本地版本号,本地版本号使用 SharedPreferences 方式保,当服务器版本号大于本地版本号就进行下载更新操作。

1、UpdateManager

package com.rfid.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL; import org.json.JSONException;
import org.json.JSONObject; import com.UHF.scanlable.R;
import com.squareup.okhttp.Call;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response; import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast; public class UpdateManager { OkHttpClient okHttpClient = new OkHttpClient();
private Context mContext;
private SharedPreferences preferences;
private int version;
private String apkName;
private String apkUrl; private static final String URL ="http://localhost:8080/apkUpdateVersion/updateVersion.json";
private static final String savePath = "/sdcard/updateAPK/";
private String saveFileName = savePath; private ProgressBar mProgress;
private static final int DOWNLOADING = 1;
private static final int DOWNLOADED = 2;
private static final int DOWNLOAD_FAILED = 3;
private int progress;
private boolean cancelFlag = false; private String updateDescription = "更新描述";
private boolean forceUpdate = true; private AlertDialog alertDialog1, alertDialog2; public UpdateManager(Context context) {
this.mContext = context;
} public void checkUpdate(){
final int localVersion = getLocalVersion();
Request request = new Request.Builder()
.url(URL).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new com.squareup.okhttp.Callback() { @Override
public void onResponse(Response response) throws IOException { String json = response.body().string();
try {
JSONObject jsonObject = new JSONObject(json);
version = jsonObject.getInt("version");
apkName = jsonObject.getString("apkName");
apkUrl = jsonObject.getString("apkUrl"); new Thread(new Runnable() {
@Override
public void run() {
if(version > localVersion){
showNoticeDialog(version, localVersion);
// Message msg = new Message();
// msg.what = 1;
// mHandler.sendMessage(msg);
} }
}).start();
} catch (JSONException e) {
e.printStackTrace(); }
} @Override
public void onFailure(com.squareup.okhttp.Request request,
IOException ioexception) { }
}); } //获取本地版本
private int getLocalVersion()
{
preferences = mContext.getSharedPreferences(VersionService.VERSION_KEY, mContext.MODE_ENABLE_WRITE_AHEAD_LOGGING | mContext.MODE_MULTI_PROCESS); VersionService verService = new VersionService(preferences);
int version = verService.getVersion(); return version;
} public void showNoticeDialog(double serverVersion,double clientVersion) {
if (serverVersion <= clientVersion)
return;
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle("发现新版本 :" + serverVersion);
dialog.setMessage(updateDescription); dialog.setPositiveButton("现在更新", new OnClickListener() { @Override
public void onClick(DialogInterface arg0, int arg1) {
arg0.dismiss();
showDownloadDialog();
}
}).show(); if(forceUpdate==false){
dialog.setNegativeButton("待会更新", new OnClickListener() { @Override
public void onClick(DialogInterface arg0, int arg1) {
arg0.dismiss(); }
}); }
} public void showDownloadDialog(){ AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle("正在更新"); final LayoutInflater inflater = LayoutInflater.from(mContext); View v = inflater.inflate(R.layout.update_progress, null);
mProgress = (ProgressBar) v.findViewById(R.id.update_progressBar);
dialog.setView(v); if(forceUpdate==false){
dialog.setNegativeButton("待会更新", new OnClickListener() { @Override
public void onClick(DialogInterface arg0, int arg1) {
arg0.dismiss();
cancelFlag = false;
}
}); } alertDialog2 = dialog.create();
alertDialog2.setCancelable(false);
alertDialog2.show(); //下载apk
downloadAPK(); } //下载apk
public void downloadAPK(){ new Thread(new Runnable() { @Override
public void run() {
try {
URL url = new URL(apkUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect(); int length = conn.getContentLength();
InputStream is = conn.getInputStream(); File file = new File(savePath);
if(!file.exists()){
file.mkdir();
}
//修改保存apk名称 apk_v1.apk
saveFileName = savePath + apkName+"_V"+ version+".apk";
String apkFile = saveFileName;
File ApkFile = new File(apkFile);
FileOutputStream fos = new FileOutputStream(ApkFile); int count = 0;
byte buf[] = new byte[1024]; do{
int numread = is.read(buf);
count += numread; progress = (int)(((float)count / length) * 100);
mHandler.sendEmptyMessage(DOWNLOADING); if(numread <= 0){
mHandler.sendEmptyMessage(DOWNLOADED);
break;
}
fos.write(buf, 0, numread);
}while(!cancelFlag); fos.close();
is.close(); } catch (Exception e) {
mHandler.sendEmptyMessage(DOWNLOAD_FAILED);
e.printStackTrace();
} }
}).start();
} private Handler mHandler = new Handler(){ @Override
public void handleMessage(Message msg){ switch (msg.what){
case DOWNLOADING:
mProgress.setProgress(progress);
break;
case DOWNLOADED:
if (alertDialog2 != null)
alertDialog2.dismiss();
//安装apk
installAPK();
break;
case DOWNLOAD_FAILED:
Toast.makeText(mContext, "网络断开,请稍候再试", Toast.LENGTH_LONG).show();
break;
default:
break;
}
} }; public void installAPK(){
File apkFile = new File(saveFileName);
if (!apkFile.exists()) {
return;
} Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.parse("file://" + apkFile.toString()), "application/vnd.android.package-archive");
mContext.startActivity(intent); //将服务版本保存到客户端
saveSeverVersion();
} public void saveSeverVersion(){
VersionService verService = new VersionService(preferences);
verService.save(version, apkName);
} }

2、VersionService

package com.rfid.util;

import android.content.SharedPreferences;

public class VersionService {

    public final static String VERSION_KEY = "VERSION_KEY";
public final static String APK_NAME = "APK_NAME"; private SharedPreferences preferences; public VersionService(SharedPreferences preferences){
this.preferences = preferences;
} public int getVersion(){
SharedPreferences.Editor editor = preferences.edit();
int version = preferences.getInt(VERSION_KEY,1);
return version;
} public String getApkName(){
SharedPreferences.Editor editor = preferences.edit();
String apkName = preferences.getString(APK_NAME,"UHF_5100.apk");
return apkName;
} public boolean save(int version,String apkName){
SharedPreferences.Editor editor = preferences.edit();
editor.putInt(VERSION_KEY,version);
editor.putString(APK_NAME,apkName);
return editor.commit();
}
}

3、update_progress.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" > <ProgressBar
android:id="@+id/update_progressBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal" />
</LinearLayout>

4、MainActivity调用方式

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity); UpdateManager manager = new UpdateManager(MainActivity.this);
// 检查软件更新
manager.checkUpdate();
}

5、eclipse-android 开发工具 下载okhttp jar 包:

链接:https://pan.baidu.com/s/1qF-A93AuZf9weWsWQcyWrw 密码:19re

6、案例下载

http://files.cnblogs.com/coolszy/UpdateSoftDemo.rar

android 更新版本的更多相关文章

  1. [转] Android SDK manager 无法获取更新版本列表

      打开这个网址(LINK)就可以看到adt的详细信息. 或者直接在你的eclipse的Help > Install New Software里面add,地址直接输入 https://dl-ss ...

  2. android 检查软件是否有更新版本

    import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import com.yuxin.m ...

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

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

  4. android SDK manager 无法获取更新版本列表【转载】

    http://mirrors.neusoft.edu.cn/eclipse/releases/luna/打开这个网址就可以看到adt的详细信息:  http://developer.android.c ...

  5. android SDK manager 无法获取更新版本的解决办法

    http://mirrors.neusoft.edu.cn/eclipse/releases/luna/打开这个网址就可以看到adt的详细信息:  http://developer.android.c ...

  6. Android历史版本Logo

        Android操作系统是一个由Google和开放手持设备联盟共同开发发展的移动设备操作系统,其最早的一个版本Android 1.0 beta发布于2007年11月5日,至今已经发布了多个更新. ...

  7. Android 各个版本WebView

    转载请注明出处   http://blog.csdn.net/typename/ powered by miechal zhao : miechalzhao@gmail.com 前言: 根据Googl ...

  8. 【Android 应用开发】 Android 各种版本简介 ( Support 支持库版本 | Android Studio 版本 | Gradle 版本 | jcenter 库版本 )

    初学者遇到 Android Studio, 导入工程后, 会出现各种奇葩错误, 如果管理好各个插件, gradle, SDK, SDK Tools, 各种官方依赖库 的版本, 会将错误大大的减少; 这 ...

  9. Android各版本特性

    此篇文章可以利用碎片化时间进行消化和了解,针对Android各个版本特性,并没有把所有列出,只是抽出了比较常用重要的特性作为提示,同时在面试中只要牢记重要的几个点即可,其他特性直接查找官方文档即可. ...

随机推荐

  1. 【转】理解Docker容器网络之Linux Network Namespace

    原文:理解Docker容器网络之Linux Network Namespace 由于2016年年中调换工作的原因,对容器网络的研究中断过一段时间.随着当前项目对Kubernetes应用的深入,我感觉之 ...

  2. 压测引起的 nginx报错 502 no live upstreams while connecting to upstream解决

    对系统的某个接口进行极限压测,随着并发量上升,nginx开始出现502 no live upstreams while connecting to upstream的报错,维持最大并发量一段时间,发现 ...

  3. Python | Pipenv官方推荐的python包管理工具

    原文地址:https://cloud.tencent.com/developer/article/1355672 Pipenv - 官方推荐的的python包管理工具. Pipenv是一款旨在将所有包 ...

  4. # 61条面向对象设计的经验原则-《OOD启思录》Arthur J.Riel

    61条面向对象设计的经验原则-<OOD启思录>Arthur J.Riel 原文 http://blog.csdn.net/cpluser/article/details/129291 61 ...

  5. WebGL学习笔记(三):绘制一个三角形

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Spring cloud微服务安全实战-7-11PinPoint+SpringBoot环境搭建

    微服务的最后一个组件, 调用链监控,一个请求进来以后,经过N多个微服务,例如a调用了b.b又调用了c,那么在这个过程中看到,整个的调用的链路,然后每一段调用所耗费的时间,帮你去分析你的系统如果出现瓶颈 ...

  7. 【Java】Spring之面向方面编程(AOP)(五)

    面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP).OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面.方面实现了跨越多种类型和对象的关注点(例如事务管理)的 ...

  8. ResponseBody和文件上传

    SpringMVC默认使用MappingJacksonHttpMessageConverter对json数据进行转换 <dependency> <groupId>com.fas ...

  9. [LeetCode] 251. Flatten 2D Vector 压平二维向量

    Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...

  10. Android属性动画-简单实例

    1.ValueAnimator //在2000毫秒内,将值从0过渡到1的动画 ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); anim.setD ...