Android属性之versionCode和versionName

         它定义在AndroidManifest.xml文件中,具体如下:

<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;
    }




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值