在App上线后可能后续对程序进行部分更新,版本更新的主要思想是打开app,在联网的情况下,请求服务器,判断服务器上App的版本号是否与手机上的app版本号相同,如果相同则程序正常进行,如果不同弹出对话框,提示用户是否更新app版本,如果更新则更新app,并完成安装。
<– 使用网络功能所需权限 –>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!-- SD卡读写权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

1.获取当前程序的版本名字

/**
     * 获取当前程序的版本名字
     * @return 版本号名字
     */
    public String getVersionName() {
        String versionName = null;
        // PackageManager 可以获取清单文件的所有信息(Gradle)
        PackageManager manager = getPackageManager();
        try {
            // getPackageInfo 获取当前程序的包信息
            PackageInfo packageInfo = manager.getPackageInfo("包名", 0);
            versionName = packageInfo.versionName + "";
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            // can't reach
            return "";
        }
        return versionName;
}

2.请求服务器获取服务器中app的版本信息进行比对,如果不同弹出对话框提示更新。

/**
  * 下载一个新版本
  */
    protected void downloadNewApk() {
        httpUtils = new HttpUtils();
        LogUtils.e("log", "下载新版本");
        LogUtils.e("log", "下载位置:  apk:" + apkUrl);
        // 1.下载路径 2.目标路径
        if (TextUtils.isEmpty(apkUrl)) {
            return;
        }
        String fileName = apkUrl.substring(apkUrl.lastIndexOf("/"));
        target = Environment.getExternalStorageDirectory().getPath() + fileName;//apk下载的位置
        LogUtils.e("log", "下载位置:" + target + "  apk:" + apkUrl);
        httpUtils.download(apkUrl, target, new RequestCallBack<File>() {
            // 下载成功时调用
            @Override
            public void onSuccess(ResponseInfo<File> arg0) {
                Toast.makeText(getApplicationContext(), "下载成功!", Toast.LENGTH_SHORT).show();
                tv_process.setVisibility(View.GONE);
                // 安装新版本
                installApk();
            }

            // 下载失败时调用
            @Override
            public void onFailure(HttpException arg0, String arg1) {
                Toast.makeText(getApplicationContext(), "下载失败!", Toast.LENGTH_SHORT).show();
                tv_process.setVisibility(View.GONE);
            }
            // 下载时调用
            @Override
            public void onLoading(long total, long current, boolean isUploading) {
                super.onLoading(total, current, isUploading);
                tv_process.setVisibility(View.VISIBLE);// 显示控件
                tv_process.setText("当前进度:" + FormatUtils.sizeFormatNum2String(current) + "/" + "总进度:" + FormatUtils
                        .sizeFormatNum2String(total));
            }
        });
    }

3.下载成功后,完成安装

/**
 * 安装应用程序
 */
protected void installApk() {
    // 调用系统的工程去安装 打开系统的apk 安装
    Intent intent = new Intent("android.intent.action.VIEW");
    intent.addCategory("android.intent.category.DEFAULT");
    intent.setDataAndType(Uri.fromFile(new File(target)),
            "application/vnd.android.package-archive");
    startActivityForResult(intent, 0);
}