Android实现app内部自动检测版本更新、自动安装及数据库更新升级

本文详细介绍了如何实现Android应用内部检测版本更新、下载安装最新APK以及数据库升级的全流程。从apk更新流程到请求服务器获取版本数据,再到使用DownloadManager下载并自动安装,同时讲解了AndroidManifest.xml的权限配置、自定义Dialog以及数据库升级方法。
摘要由CSDN通过智能技术生成

前言:做一个有梦想的程序猿!

因为有的app应用不需要上线在应用市场,只需要在内部使用,所以就需要实现app内部检测最新版本功能,最近正好做了这个功能,所以把它分享出来:

1、apk更新流程

  1. 登录成功后请求服务器接口获取最新版本及更新内容(请求使用的xutils3框架)
  2. 获取本地app应用内版本versionCode与最新版本比较,若小于最新版本则弹框提示更新
  3. 更新下载apk并自动安装,进入主页面删除旧的apk包
  4. 程序启动初始化升级本地数据库

以上便是全部流程,步骤很简单,接下来就是代码实现

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"); 
	
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值