apk打包之前根据自己的需要,进行版本号、版本名称设置。android studio 设置是于build.gradle文件的中设置。
defaultConfig
......
versionCode 1
versionName "1.0"
......
}在Activity中可以直接调用getPackageManager()方法来获取PackageManager对象,这是Context的子类ContextWrapper中的getPackageManager()方法。
源码:
@Override
public PackageManager getPackageManager() {
return mBase.getPackageManager();
}PackageManager类中的getPackageInfo(String packageName, int flags)方法可以获取指定包名应用的PackageInfo信息。
第一个参数是APP的包名,如果不存在则会抛出NameNotFoundException异常。举个例子,获取QQ的Version信息:
PackageInfo packageInfo = packageManager.getPackageInfo("com.tencent.mobileqq", 0);第二个参数是falg标志,可以按需返回想要获取的信息,可以多个标志位或操作|。如果全部返回那么可能信息量太大Binder传递不了会奔溃。部分标志位如下,更多的可以查看源码:
/**
* {@link PackageInfo} flag: return information about
* activities in the package in {@link PackageInfo#activities}.
*/
public static final int GET_ACTIVITIES = 0x00000001;
/**
* {@link PackageInfo} flag: return information about
* intent receivers in the package in
* {@link PackageInfo#receivers}.
*/
public static final int GET_RECEIVERS = 0x00000002;
/**
* {@link PackageInfo} flag: return information about
* services in the package in {@link PackageInfo#services}.
*/
public static final int GET_SERVICES = 0x00000004;
/**
* {@link PackageInfo} flag: return information about
* content providers in the package in
* {@link PackageInfo#providers}.
*/
public static final int GET_PROVIDERS = 0x00000008;举个例子:
try {
PackageInfo packageInfo = packageManager.getPackageInfo(this.getPackageName(),
PackageManager.GET_ACTIVITIES|GET_RECEIVERS );
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}注:有没有发现PackageManager似曾相识,checkSelfPermission申请权限的时候返回的状态码PERMISSION_GRANTED和PERMISSION_DENIED也定义在这个类中:
/**
* Permission check result: this is returned by {@link #checkPermission}
* if the permission has been granted to the given package.
*/
public static final int PERMISSION_GRANTED = 0;
/**
* Permission check result: this is returned by {@link #checkPermission}
* if the permission has not been granted to the given package.
*/
public static final int PERMISSION_DENIED = -1;PackageInfo类中有很多应用的信息可以直接访问:
public class PackageInfo implements Parcelable {
/**
* The name of this package. From the <manifest> tag's "name"
* attribute.
*/
public String packageName;
/**
* The names of any installed split APKs for this package.
*/
public String[] splitNames;
@Deprecated
public int versionCode;
public int versionCodeMajor;
... ...
}附:获取应用版本号和版本名的工具方法
public class APKVersionCodeUtils {
/**
* 获取当前本地apk的版本
*
* @param mContext
* @return
*/
public static int getVersionCode(Context mContext) {
int versionCode = 0;
try {
//获取软件版本号,对应build.gradle下的versionCode
versionCode = mContext.getPackageManager().
getPackageInfo(mContext.getPackageName(), 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return versionCode;
}
/**
* 获取版本号名称
*
* @param context 上下文
* @return
*/
public static String getVerName(Context context) {
String verName = "";
try {
verName = context.getPackageManager().
getPackageInfo(context.getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return verName;
}
}参考博客:
《Android中获取应用程序(包)的信息-----PackageManager的使用》
《Android获取应用程序信息——PackageManager的基本使用》
《有坑!Android新版QQ获取packageInfo引发异常崩溃》
《PackageManager.getInstalledPackages之flags浅谈》

