如何在应用启动时检查版本更新对应用进行升级,解决的方案有多种。本文将阐述利用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