它定义在AndroidManifest.xml文件中,具体如下:
android:versionName: 表示该软件的版本名字,即我们常说的版本号,由三部分组成<major>.<minor>.<point>,该值是个字符串,可以显示给用户。
前文中提到versionCode是版本升级用的,大概流程为通过app的包名,获取当前手机中安装的该app的版本号,然后再获取服务端的versionCode进之行对比,发现比本地的版本号大则可提示用户升级。
获取本地app版本号的方式:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.androidtest"
android:versionCode="1"
android:versionName="1.0" >
android:versionCode: 表示该软件的版本号,主要是用于版本升级所用,该值不显示给用户。它必须是一个int型的整数,第一个版本定义为1,以后递增,即它的大小代表该软件版本升级过多少次,这样判断该值就能确认是否需要升级。
android:versionName: 表示该软件的版本名字,即我们常说的版本号,由三部分组成<major>.<minor>.<point>,该值是个字符串,可以显示给用户。
前文中提到versionCode是版本升级用的,大概流程为通过app的包名,获取当前手机中安装的该app的版本号,然后再获取服务端的versionCode进之行对比,发现比本地的版本号大则可提示用户升级。
获取本地app版本号的方式:
versionCode = getPackageManager().getPackageInfo(packageName, 0).versionCode;
API接口getPackageInfo方法的具体实现如下:
public PackageInfo getPackageInfo(String packageName, int flags) {
synchronized (mPackages) {
PackageParser.Package p = mPackages.get(packageName);
if(mUpdatePackageList.contains(packageName)){
int maxRetries = 10;
while (maxRetries-- >= 0) {
Log.v(TAG, "Package is updating, getPackageInfo: " + packageName);
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
if(!mUpdatePackageList.contains(packageName))
break;
}
}
if (Config.LOGV) Log.v(
TAG, "getPackageInfo " + packageName
+ ": " + p);
if (p != null) {
<span style="color:#FF0000;"> return generatePackageInfo(p, flags);</span>
}
if((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) {
<span style="color:#FF0000;">return generatePackageInfoFromSettingsLP(packageName, flags);</span>
}
}
return null;
}
若要限制app自动升级,可以通过包名修改对应app的版本号,只需在返回PackageInfo对象之前,修改它的versionCode值即可,具体实现如下
public PackageInfo getPackageInfo(String packageName, int flags) {
String[] pName = new String[]{"com.example.androidtest"};<span><span>//用于存储需要限制升级apk的包名</span></span>
Integer[] pVersionCode = new Integer[]{2147483647};<span><span>//最新的版本号,这里比较狠,直接将版本号设置为极限值</span></span>
HashMap<String, Integer> packageNameMap = new HashMap<String, Integer>();
for (int i = 0; i < pName.length; i++) {
packageNameMap.put(pName[i], pVersionCode[i]);
}
synchronized (mPackages) {
PackageInfo infoTemp = null;
PackageParser.Package p = mPackages.get(packageName);
if(mUpdatePackageList.contains(packageName)){
int maxRetries = 10;
while (maxRetries-- >= 0) {
Log.v(TAG, "Package is updating, getPackageInfo: " + packageName);
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
if(!mUpdatePackageList.contains(packageName))
break;
}
}
if (Config.LOGV) Log.v(
TAG, "getPackageInfo " + packageName
+ ": " + p);
if (p != null) {
<span>//如果是要限制升级的app,则修改其返回的版本号的值</span>
if(packageNameMap.containsKey(packageName)){
infoTemp = generatePackageInfo(p, flags);
Log.i(TAG,"getPackageInfo packageName : " +packageName + "; versionCode : "+ infoTemp.versionCode);
infoTemp.versionCode = packageNameMap.get(packageName);
return infoTemp;
} else {
return generatePackageInfo(p, flags);
}
}
if((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) {
<span>//如果是要限制升级的app,则修改其返回的版本号的值</span>
if(packageNameMap.containsKey(packageName)){
infoTemp = generatePackageInfoFromSettingsLP(packageName, flags);
Log.i(TAG,"getPackageInfo packageName : " +packageName + "; versionCode : "+ infoTemp.versionCode);
infoTemp.versionCode = packageNameMap.get(packageName);
return infoTemp;
} else {
return generatePackageInfoFromSettingsLP(packageName, flags);
}
}
}
return null;
}