ApplicationInfo的进一步学习

无简介

AndroidManifest.xml采用xml文件格式描述,使用xml标签的形式描述每个属性,AndroidManifest.xml的解析也遵循xml解析的规律,对AndroidManifest.xml的解析主要用到PackageManager,PackageInfo,ApplicationInfo三个类,PackageInfo描述了应用级的信息,包括应用的版本号,版本名称,对应AndroidManifest.xml最外层的信息,ApplicationInfo描述了标签之间的信息,包括声明的meta-data和activity信息。下面我做了一个小demo来测试下如何获得里面的值: 首先是要获得的Manifest的文件: [sourcecode language=“java”] [/sourcecode] 然后是主要的Activity:MainActivity [sourcecode language=“java”] package com.example.packagemanagertest; import java.util.List; import android.app.Activity; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.util.Log; public class MainActivity extends Activity { private String TAG = “Test”; private PackageManager pm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pm = getPackageManager(); ApplicationTool tool=new ApplicationTool(this); String str=tool.getDataDir(); System.out.println(str); System.out.println(tool.getIcon()); System.out.println(tool.getProcessName()); System.out.println(tool.getTargetSdkVersion()); System.out.println(tool.getTheme()); System.out.println(tool.getVersionCode()); System.out.println(tool.getVersionName()); String[] strs = tool.getPermissions(); for (String string : strs) { System.out.println(string); } List list1 = pm.getInstalledApplications(128); if (list1.size() != 0) { for (ApplicationInfo info : list1) { if (“com.example.packagemanagertest”.equals(info.packageName)) { // 配置文件中的android:backupAgent属性值,用于备份 String backupAgentName = info.backupAgentName; Log.i(TAG, “【配置文件中的android:backupAgent属性值,用于备份–backupAgentName: 】” + backupAgentName); // 获取继承Application类的对象,维护全局的Application状态 // 但一般都不用继承的方式,可以通过Context.getApplicationContext()方法得到 String className = info.className; Log.i(TAG, “【获取继承自Application类的对象–className: 】” + className); // 包名 String packageName = info.packageName; Log.i(TAG, “【应用的包名–packageName: 】” + packageName); // android:manageSpaceActivity标签的值 // 该标签代表了指定一个activity来处理用户的空间数据。而不是通过设置里的一个按钮来操作 String activityName = info.manageSpaceActivityName; Log.i(TAG, "【android:manageSpaceActivity标签的值–manageSpaceActivityName:】 " + activityName); // 应用所在的进程 String processName = info.processName; Log.i(TAG, "【应用所在的进程–processName:】 " + processName); // 权限 String permisson = info.permission; Log.i(TAG, “【权限–permisson: 】” + permisson); // 通过其他方法获得权限列表 try { String[] permisson2 = getPackageManager().getPackageInfo(packageName, PackageManager.GET_PERMISSIONS).requestedPermissions; for (int i = 0; i < permisson2.length; i++) { Log.i(TAG, “【权限列表–: 】” + permisson2[i]); } } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 创建对象时,传入的是GET_SHARED_LIBRARY_FILES该属性才有值 String[] files = info.sharedLibraryFiles; Log.i(TAG, “【如果getPackageManager().getInstalledApplications(128)中传入的值为GET_SHARED_LIBRARY_FILES该属性才有值–sharedLibraryFiles: 】” + files); // 存放数据的路径 String dataPath = info.dataDir; Log.i(TAG, “【存放数据的路径–dataDir: 】” + dataPath); // 本地路径 String nativePath = info.nativeLibraryDir; Log.i(TAG, “【本地路径–nativeLibraryDir:】” + nativePath); // 公共资源路径 String punlicSourcePath = info.publicSourceDir; Log.i(TAG, “【公共资源路径–publicSourceDir: 】” + punlicSourcePath); // 资源路径 String sourcePath = info.sourceDir; Log.i(TAG, “【资源路径–sourcePath: 】” + sourcePath); // 内同的activity的task名称 String taskAffinity = info.taskAffinity; Log.i(TAG, “【taskAffinity: 】” + taskAffinity); // 如果是false,代表application里的所有组件都禁用 boolean enable = info.enabled; Log.i(TAG, “【false,代表application里的所有组件都禁用–enable: 】” + enable); // 表述资源文件的标识 int descriRes = info.descriptionRes; Log.i(TAG, “【表述资源文件的标识–descriptionRes: 】” + descriRes); int flag = info.flags; Log.i(TAG, “【flag: 】” + flag); // 指定smallest screen width的值,超过这个值,就要开启屏幕兼容 int compatibleWidth = info.compatibleWidthLimitDp;// android:compatibleWidthLimitDp属性 Log.i(TAG, “【超过这个值,就要开启屏幕兼容–compatibleWidthLimitDp: 】” + compatibleWidth); // 同上,只是这时候用户无法禁止屏幕兼容模式,说明是强制启动屏幕兼容 int largestWidth = info.largestWidthLimitDp;// android:largestWidthLimitDp属性 Log.i(TAG, “【强制启动屏幕兼容–largestWidthLimitDp: 】” + largestWidth); // 所需屏幕空间的最短尺寸, int samllestWidth = info.requiresSmallestWidthDp;// android:requiresSmallestWidthDp属性 Log.i(TAG, “【屏幕空间的最短尺寸,–requiresSmallestWidthDp: 】” + samllestWidth); // 应用所需的最小sdk版本 int sdkVersion = info.targetSdkVersion; Log.i(TAG, “【最小sdk版本–targetSdkVersion: 】” + sdkVersion); int theme = info.theme; Log.i(TAG, “【android:theme标签–theme: 】” + theme);// android:theme= int uid = info.uid; Log.i(TAG, "【uid: " + uid); // 配置文件中的uiOptions属性的值 int uiOptions = info.uiOptions; Log.i(TAG, “【uiOptions属性的值–uiOptions: 】” + uiOptions); } } } } } [/sourcecode] 之后是一个提取出来的工具类:ApplicationTool [sourcecode language=“java”] package com.example.packagemanagertest; import java.util.List; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; /** * @Title: ApplicationTool.java * @Package com.example.packagemanagertest * @Description: * @author wudkj.com * @date 2015-4-19 上午12:41:16 * @version V1.0 */ public class ApplicationTool { private PackageInfo packageInfo; private PackageManager pkgmanager; private String packageName; private Context mContext; private ApplicationInfo info = null; public ApplicationTool(Context mContext) { this.mContext=mContext; pkgmanager = mContext.getPackageManager(); packageName = mContext.getPackageName(); try { packageInfo = pkgmanager.getPackageInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES); } catch (NameNotFoundException e) { e.printStackTrace(); } } /** * @return 版本号 */ public int getVersionCode() { return packageInfo.versionCode; } /** * @return 版本名称 */ public String getVersionName() { return packageInfo.versionName; } /** * @return 当前程序的权限列表 */ public String[] getPermissions() { if (info == null) { List list1 = pkgmanager.getInstalledApplications(128); if (list1.size() != 0) { for (ApplicationInfo infoTmp : list1) { if (infoTmp == null) { return null; } if (packageName.equals(infoTmp.packageName)) { info = infoTmp; try { return mContext.getPackageManager().getPackageInfo(info.packageName, PackageManager.GET_PERMISSIONS).requestedPermissions; } catch (NameNotFoundException e) { e.printStackTrace(); return null; } } } } } else { try { return mContext.getPackageManager().getPackageInfo(info.packageName, PackageManager.GET_PERMISSIONS).requestedPermissions; } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } return null; } /** * @return 存放数据的路径 */ public String getDataDir() { if (info == null) { List list1 = pkgmanager.getInstalledApplications(128); if (list1.size() != 0) { for (ApplicationInfo infoTmp : list1) { if (infoTmp == null) { return “”; } if (packageName.equals(infoTmp.packageName)) { info = infoTmp; return info.dataDir; } } } } else { return info.dataDir; } return “”; } /** * @return 最高sdk版本 */ public int getTargetSdkVersion() { if (info == null) { List list1 = pkgmanager.getInstalledApplications(128); if (list1.size() != 0) { for (ApplicationInfo infoTmp : list1) { if (packageName.equals(infoTmp.packageName)) { info = infoTmp; return info.targetSdkVersion; } } } } else { return info.targetSdkVersion; } return -1; } /** * @return 程序图标 */ public int getIcon() { if (info == null) { List list1 = pkgmanager.getInstalledApplications(128); if (list1.size() != 0) { for (ApplicationInfo infoTmp : list1) { if (packageName.equals(infoTmp.packageName)) { info = infoTmp; return info.icon; } } } } else { return info.icon; } return -1; } /** * @return 程序的主题 */ public int getTheme() { if (info == null) { List list1 = pkgmanager.getInstalledApplications(128); if (list1.size() != 0) { for (ApplicationInfo infoTmp : list1) { if (packageName.equals(infoTmp.packageName)) { info = infoTmp; return info.theme; } } } } else { return info.theme; } return -1; } /** * @return 程序的进程名称 */ public String getProcessName() { if (info == null) { List list1 = pkgmanager.getInstalledApplications(128); if (list1.size() != 0) { for (ApplicationInfo infoTmp : list1) { if (packageName.equals(infoTmp.packageName)) { info = infoTmp; return info.processName; } } } } else { return info.processName; } return “”; } } [/sourcecode] 下面是运行工具类获得的数据: [sourcecode language=“java”] 04-19 01:06:27.477: I/System.out(11502): /data/data/com.example.packagemanagertest 04-19 01:06:27.477: I/System.out(11502): 2130837504 04-19 01:06:27.477: I/System.out(11502): com.example.packagemanagertest 04-19 01:06:27.477: I/System.out(11502): 18 04-19 01:06:27.477: I/System.out(11502): 2131099649 04-19 01:06:27.477: I/System.out(11502): 1 04-19 01:06:27.477: I/System.out(11502): 1.0 04-19 01:06:27.477: I/System.out(11502): android.permission.READ_SMS 04-19 01:06:27.477: I/System.out(11502): android.permission.INTERNET 04-19 01:06:27.477: I/System.out(11502): android.permission.NFC [/sourcecode] 然后是下面log类型获得的数据: [sourcecode language=“java”] 04-19 01:06:27.507: I/Test(11502): 【配置文件中的android:backupAgent属性值,用于备份–backupAgentName: 】null 04-19 01:06:27.507: I/Test(11502): 【获取继承自Application类的对象–className: 】com.example.packagemanagertest.TestApplication 04-19 01:06:27.507: I/Test(11502): 【应用的包名–packageName: 】com.example.packagemanagertest 04-19 01:06:27.507: I/Test(11502): 【android:manageSpaceActivity标签的值–manageSpaceActivityName:】 com.example.packagemanagertest.MainActivity 04-19 01:06:27.507: I/Test(11502): 【应用所在的进程–processName:】 com.example.packagemanagertest 04-19 01:06:27.517: I/Test(11502): 【权限–permisson: 】null 04-19 01:06:27.517: I/Test(11502): 【权限列表–: 】android.permission.READ_SMS 04-19 01:06:27.517: I/Test(11502): 【权限列表–: 】android.permission.INTERNET 04-19 01:06:27.517: I/Test(11502): 【权限列表–: 】android.permission.NFC 04-19 01:06:27.517: I/Test(11502): 【如果getPackageManager().getInstalledApplications(128)中传入的值为GET_SHARED_LIBRARY_FILES该属性才有值–sharedLibraryFiles: 】null 04-19 01:06:27.517: I/Test(11502): 【存放数据的路径–dataDir: 】/data/data/com.example.packagemanagertest 04-19 01:06:27.517: I/Test(11502): 【本地路径–nativeLibraryDir:】/data/app-lib/com.example.packagemanagertest-1 04-19 01:06:27.517: I/Test(11502): 【公共资源路径–publicSourceDir: 】/data/app/com.example.packagemanagertest-1.apk 04-19 01:06:27.517: I/Test(11502): 【资源路径–sourcePath: 】/data/app/com.example.packagemanagertest-1.apk 04-19 01:06:27.517: I/Test(11502): 【taskAffinity: 】com.example.packagemanagertest 04-19 01:06:27.517: I/Test(11502): 【false,代表application里的所有组件都禁用–enable: 】true 04-19 01:06:27.517: I/Test(11502): 【表述资源文件的标识–descriptionRes: 】0 04-19 01:06:27.517: I/Test(11502): 【flag: 】8961606 04-19 01:06:27.517: I/Test(11502): 【超过这个值,就要开启屏幕兼容–compatibleWidthLimitDp: 】0 04-19 01:06:27.517: I/Test(11502): 【强制启动屏幕兼容–largestWidthLimitDp: 】0 04-19 01:06:27.517: I/Test(11502): 【屏幕空间的最短尺寸,–requiresSmallestWidthDp: 】0 04-19 01:06:27.517: I/Test(11502): 【最小sdk版本–targetSdkVersion: 】18 04-19 01:06:27.517: I/Test(11502): 【android:theme标签–theme: 】2131099649 04-19 01:06:27.517: I/Test(11502): 【uid: 10080 04-19 01:06:27.517: I/Test(11502): 【uiOptions属性的值–uiOptions: 】0 [/sourcecode] 有点乱,不过有源码,地址:http://pan.baidu.com/s/1eQivVVG

-------------本文结束  感谢您的阅读-------------
下次一定