思路

在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. 关于SpringCloud、SpringBoot简单讲解

     什么是Spring Boot 用我的话来理解,Spring Boot就是整合了框架的框架,它让一切依赖都变得有序简单,你不用操心A.jar是什么版本,又依赖哪些版本的jar,它默认配置了很多框架的使 ...

  2. Spark2.x(五十五):在spark structured streaming下sink file(parquet,csv等),正常运行一段时间后:清理掉checkpoint,重新启动app,无法sink记录(file)到hdfs。

    场景: 在spark structured streaming读取kafka上的topic,然后将统计结果写入到hdfs,hdfs保存目录按照month,day,hour进行分区: 1)程序放到spa ...

  3. Java基础 try...catch(多个异常) 多个异常采取同样的解决措施

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  4. asp.net core mvc 读取appsettings.config中文乱码问题

    asp.net core mvc 读取appsettings.config中文乱码问题的解决方法如下: 用记事本打开appsettings.config,另存为的时候,编码设置为 “UTF-8”,

  5. Oracle11g R2客户端安装图文详解过程

    转: Oracle11g R2客户端安装图文详解过程 2018-06-17 13:30:26 大话JAVA的那些事 阅读数 4129更多 分类专栏: Oracle   版权声明:本文为博主原创文章,遵 ...

  6. matlab学习笔记10_2 一般操作符

    一起来学matlab-matlab学习笔记10 10_2一般操作符和数据显示格式 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德 ...

  7. 转 zabbix debug and zabbix使用percona插件监控mysql

    ########## https://www.cnblogs.com/keithtt/p/8542987.html zabbix使用percona插件监控mysql   1.添加percona仓库. ...

  8. [LeetCode] 242. Valid Anagram 验证变位词

    Given two strings s and t , write a function to determine if t is an anagram of s. Example 1: Input: ...

  9. javaScript的高级函数

    1.map() map()方法返回一个新数组,新数组是原始数组调用函数之后处理后的值. map()方法按照原始数组元素顺序依次处理元素. map不会对空数组进行检测. map不会改变原始数组 . 参数 ...

  10. Logstash+ Kafka基于AOP 实时同步日志到es

    Logstash是一个开源数据收集引擎,具有实时管道功能.Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地,logstash丰富的插件(logstash-in ...