Android 自动检测版本并升级

如何在应用启动时检查版本更新对应用进行升级,解决的方案有多种。本文将阐述利用Android 自带的DownloadManager进行下载apk文件,已经下载成功后自动安装。DownloadManager在后台下载文件时会有进度条的,所以省去了开发进度条的麻烦。

思路:在AndroidManifest.xml文件中定义了versionCode以及versionName,称为旧的,如果使用AndroidStudio开发的话,这些东西都移到了build.gradle文件中。而在服务器端,也要配置(通常在配置文件中)一个版本号以及对应的版本名称,称为最新的,此外还必须配置一个apk文件的下载路径Url,当然还可以配置一些升级或更新的内容。然后在应用启动时,从服务器获取该最新的信息,可以用一个对象封装这些信息。然后对比新旧版本号,若新版本号大于旧版本号,则弹出对话框让用户进行确认升级,确认后用DownloadMananger进行下载获取的Url。DownloadManager在下载完成后会发一个通知给android系统,所以需要定义一个BroadcastReceiver来接收该通知,在onReceive()方法中将该apk进行安装。这样就实现了该功能。

有些设备是没有SD卡的,所以需要妥善设置apk的下载存放位置。

1.为了完成上述工作,定义如下一个辅助类.

ApplicationHelper.java

package com.jykj.departure.util;

import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Environment;
import android.provider.Settings;
import android.telephony.TelephonyManager;

import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

public class ApplicationHelper {
   
    public static final CharSequence TOAST_NO_NET = "很遗憾,木有网络";

    //判断某个文件是否为apk文件
    public static boolean isApkFile(String fileName){
        fileName = fileName.toLowerCase();
        int idx = fileName.lastIndexOf(".apk");
        return  idx >=0;
    }
    /**
     * 获得AndroidManifest.xml中的versionCode
     * 
     * @param context 上下文
     * @return int
     */
    public static int getLocalVersionCode(Context context) {
        try {
            PackageInfo pi = context.getPackageManager().getPackageInfo(
                    context.getPackageName(), 0);
            return pi.versionCode;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 获得AndroidManifest.xml中的versionName
     * 
     * @param context 上下文
     * @return str
     */
    public static String getLocalVersionName(Context context) {
        try {
            PackageInfo pi = context.getPackageManager().getPackageInfo(
                    context.getPackageName(), 0);
            return pi.versionName;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 安装apk文件
     *
     * @param context 上下文
     * @param uri uri
     */
    public static void installApk(Context context, Uri uri) {
        Intent installIntent = new Intent(Intent.ACTION_VIEW);
        installIntent.setDataAndType(uri,
                "application/vnd.android.package-archive");
        installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(installIntent);
    }

    /**
     * 卸载apk程序
     *
     * @param context 上下文
     * @param uri uri
     */
    public static void uninstallApk(Context context, Uri uri, String packageName) {
        Uri packageURI = Uri.parse("package:" + packageName);
        Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
        context.startActivity(uninstallIntent);

    }

    /**
     * 判断是否有网络连接
     * 
     * @param context 上下文
     * @return bool
     */
    public static boolean isNetworkConnected(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mNetworkInfo = mConnectivityManager
                    .getActiveNetworkInfo();
            if (mNetworkInfo != null && mNetworkInfo.isConnected()
                    && mNetworkInfo.getState() == NetworkInfo.State.CONNECTED) {
                return mNetworkInfo.isAvailable();
            }
        }
        return false;
    }
}

2.从服务器获取的信息的封装类

Apkinfo.java

package com.sudoku.jack.sudoku.model;

import java.io.Serializable;

public class Apkinfo implements Serializable{
   
    private String versionName;
    private int versionCode;
    private String apkName;
    private String upgradeContent;
    private String apkURL;
    public String getVersionName() {
        return versionName;
    }
    public void setVersionName(String versionName) {
        this.versionName = versionName;
    }
    public int getVersionCode() {
        return versionCode;
    }
    public void setVersionCode(int versionCode) {
        this.versionCode = versionCode;
    }

    /**
     * @return 如 Express-v1.0.3.apk
     */
    public String getApkName() {
        return apkName;
    }
    public void setApkName(String apkName) {
        this.apkName = apkName;
    }
    public String getUpgradeContent() {
        return upgradeContent;
    }
    public void setUpgradeCont
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值