android 更新版本
思路:
在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 更新版本的更多相关文章
- [转] Android SDK manager 无法获取更新版本列表
打开这个网址(LINK)就可以看到adt的详细信息. 或者直接在你的eclipse的Help > Install New Software里面add,地址直接输入 https://dl-ss ...
- android 检查软件是否有更新版本
import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import com.yuxin.m ...
- Android 6.0 7.0 8.0 一个简单的app内更新版本-okgo app版本更新
登陆时splash初始页调用接口检查app版本.如有更新,使用okGo的文件下载,保存到指定位置,调用Android安装apk. <!-- Android 8.0 (Android O)为了针对 ...
- android SDK manager 无法获取更新版本列表【转载】
http://mirrors.neusoft.edu.cn/eclipse/releases/luna/打开这个网址就可以看到adt的详细信息: http://developer.android.c ...
- android SDK manager 无法获取更新版本的解决办法
http://mirrors.neusoft.edu.cn/eclipse/releases/luna/打开这个网址就可以看到adt的详细信息: http://developer.android.c ...
- Android历史版本Logo
Android操作系统是一个由Google和开放手持设备联盟共同开发发展的移动设备操作系统,其最早的一个版本Android 1.0 beta发布于2007年11月5日,至今已经发布了多个更新. ...
- Android 各个版本WebView
转载请注明出处 http://blog.csdn.net/typename/ powered by miechal zhao : miechalzhao@gmail.com 前言: 根据Googl ...
- 【Android 应用开发】 Android 各种版本简介 ( Support 支持库版本 | Android Studio 版本 | Gradle 版本 | jcenter 库版本 )
初学者遇到 Android Studio, 导入工程后, 会出现各种奇葩错误, 如果管理好各个插件, gradle, SDK, SDK Tools, 各种官方依赖库 的版本, 会将错误大大的减少; 这 ...
- Android各版本特性
此篇文章可以利用碎片化时间进行消化和了解,针对Android各个版本特性,并没有把所有列出,只是抽出了比较常用重要的特性作为提示,同时在面试中只要牢记重要的几个点即可,其他特性直接查找官方文档即可. ...
随机推荐
- 范仁义html+css课程---4、文本标签
范仁义html+css课程---4.文本标签 一.总结 一句话总结: 文本标签大致掌握一下,做到它站在你对面的时候最好认得,认不得也没关系,直接百度 1.ins标签.u标签和del标签 作用? ins ...
- vs2015编译OBS-Studio
编译之前的准备: 系统win10 QT5.7.0 VS2015 CMake 3.13.4 obs vs2015环境依赖包:dependencies2015 obs-studio 24.0 ====== ...
- merge同时包含增、改、删
我们都知道oracle merge可以用来增和改,很少用它来删除.但是有时候我们仍然需要该特性,以提高性能,典型的场景就是将业务库逻辑删除的记录同步到查询库的时候,做真正的物理删除,这个时候merge ...
- Python numpy 中常用的数据运算
Numpy 精通面向数组编程和思维方式是成为Python科学计算大牛的一大关键步骤.——<利用Python进行数据分析> Numpy(Numerical Python)是Python科学计 ...
- Redis 操作帮助类
首先从Nuget中添加StackExchange.Redis包 1.Redis连接对象管理帮助类 using Mvc.Base; using Mvc.Base.Log; using StackExch ...
- Python dict 存放函数
Python 字典,可以直接存放函数,并执行正常. #!/usr/bin/python3 dict1 = dict() def test_fun(): print("test dict&qu ...
- k8s记录-ubuntu安装docker
sudo apt-get purge docker-ce sudo rm -rf /var/lib/dockerdocker-ce:https://download.docker.com/linux/ ...
- DevOps - DevOps精要 - 变革
特别说明 本文是已读书籍的学习笔记和内容摘要,原文内容有少部分改动,并添加一些相关信息,但总体不影响原文表达. <DevOps入门与实践> :本书结合实例详细介绍了在开发现场引入DevOp ...
- POJ 1941 The Sierpinski Fractal
总时间限制: 1000ms 内存限制: 65536kB 描述 Consider a regular triangular area, divide it into four equal triangl ...
- [转帖]Linux教程(12)- linux输入输出重定向
Linux教程(12)- linux输入输出重定向 2018-08-21 22:57:02 钱婷婷 阅读数 49更多 分类专栏: Linux教程与操作 Linux教程与使用 版权声明:本文为博主原 ...