Android实现app内部自动检测版本更新、自动安装及数据库更新升级
前言:做一个有梦想的程序猿! |
---|
因为有的app应用不需要上线在应用市场,只需要在内部使用,所以就需要实现app内部检测最新版本功能,最近正好做了这个功能,所以把它分享出来:
1、apk更新流程
- 登录成功后请求服务器接口获取最新版本及更新内容(请求使用的xutils3框架)
- 获取本地app应用内版本versionCode与最新版本比较,若小于最新版本则弹框提示更新
- 更新下载apk并自动安装,进入主页面删除旧的apk包
- 程序启动初始化升级本地数据库
以上便是全部流程,步骤很简单,接下来就是代码实现
2、获取本地app内部版本工具类
package com.gtlxkj.cn.util;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Environment;
public class VersionUtils {
/**
* 检查是否存在SDCard
*
* @return
*/
public static boolean hasSdcard() {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
return true;
} else {
return false;
}
}
/**
* 2 * 获取版本
*/
public static int getVersion(Context context) {
try {
PackageManager manager = context.getPackageManager();
PackageInfo info = manager.getPackageInfo(context.getPackageName(),0);
int versioncode = info.versionCode;
return versioncode;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
/**
* 2 * 获取版本名称
*/
public static String getVersionName(Context context) {
try {
PackageManager manager = context.getPackageManager();
PackageInfo info = manager.getPackageInfo(context.getPackageName(),0);
String version = info.versionName;
return version;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}
3、请求服务器获取版本数据及新旧版本比对
/**
* 主页Activity
*
*/
@ContentView(R.layout.activity_home)
public class HomeActivity extends BaseActivity implements View.OnClickListener {
@ViewInject(R.id.btn_upload)
private Button btn_upload;
@ViewInject(R.id.update_apk)
private TextView update_apk;
private Context context = HomeActivity.this;
private VersionDialog dialog;
private boolean flag;//是否检测版本初始化
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("HomeActivity", "onCreate");
initListener();
Utils.deleteLocal(new File(ConfigurationUtil.APK_PATH_ABSOULT+"GTLXKJ.apk"));//删除旧的apk
flag=true;
// 获取本版本号,是否更新
getVersion(VersionUtils.getVersion(this));
}
//初始点击事件
private void initListener(){
Log.i("HomeActivity", "initListener");
update_apk.setOnClickListener(this);
update_apk.setText("版本号 V"+Tools.getVersionName(this));
}
/**
* 点击事件
* @param view
*/
public void onClick(View v) {
Log.i("HomeActivity", "onClick");
switch(v.getId()){
case R.id.update_apk:
flag=false;
getVersion(Tools.getVersion(this));
break;
}
}
//版本更新弹出框
public void showUploadApkDialog(String content,String versionName) {
Log.i("HomeActivity", "showUploadTaskDialog");
dialog = new VersionDialog(this,R.style.mystyle,this,R.layout.version__update_dialog,content,versionName);
dialog.show();
}
// 获取更新版本号
private void getVersion(final int vision) {
if (!NetWorkUtil.isNetworkAvalible(context)) {
Toast.makeText(HomeActivity.this,"请检查网络",Toast.LENGTH_SHORT).show();
return;
}
RequestParams params = new RequestParams(ConfigurationUtil.WEBVERSION);
x.http().get(params, new Callback.ProgressCallback<String>() {
@Override
public void onSuccess(String result) {
Log.i("onSuccess", "onSuccess");
try{
JSONObject object = new JSONObject(result);
//返回状态
String status = object.optString("code");
//返回的更新内容
String content = object.optString("content");
//返回的版本号
String versionName = object.optString("msg");
//返回版本
String nversion = object.optString("data");
if("1".equals(status)){
int newversion = Integer.parseInt(nversion);
if (newversion != vision) {//新旧版本比较
if (vision < newversion) {//旧版本低于新版本则更新
System.out.println("新版本:v"+newversion + " 旧版本v"+ vision);
// 版本号不同
showUploadApkDialog(content,versionName);
}
}else if(!flag){
Toast.makeText(HomeActivity.this,"已经是最新版本",Toast.LENGTH_SHORT).show();
}
}
}catch(Exception e){
e.printStackTrace();
Log.e("onSuccess", "Error");
}
}
@Override
public void onCancelled(CancelledException arg0) {
Log.i("onCancelled", "onCancelled");
}
@Override
public void onError(Throwable arg0, boolean arg1) {
Log.e("onError", "onError");