Android 几个ApplicationInfo Info系列类的总结

本文介绍了Android中的包管理机制,包括PackageItemInfo及其子类如ApplicationInfo、ResolveInfo等的作用和区别,并展示了如何使用PackageManager获取安装的应用信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们来看一下PackageItemInfo,它是包含了一些信息的基类,它的直接子类有:ApplicationInfo、ComponentInfo、InstrumentationInfo、PermissionGroupInfo、PermissionInfo。它的间接子类有:ActivityInfo、ProviderInfo、ServiceInfo。这个类包含的信息对于所有包中项目是平等的。这些Package items是被Package manager所持有的。这个类提供了属性的非常普通的基本设置:label、icon和meta-data。这个类的意图不是被自己调用。它在这只是简单地分享被package manager返回的所有items之间的普通定义。比如,它自己并不实现Parcelable接口,但却帮助实现了Parcelable的子类提供了方便的方法。

  ApplicationInfo是从一个特定的应用得到的信息。这些信息是从相对应的Androdimanifest.xml的< application>标签中收集到的。

  ResolveInfo这个类是通过解析一个与IntentFilter相对应的intent得到的信息。它部分地对应于从AndroidManifest.xml的< intent>标签收集到的信息。

  PackageManager这个类是用来返回各种的关联了当前已装入设备了的应用的包的信息。你可以通过getPacageManager来得到这个类。

  ApplicationInfo与ResolveInfo比较:前者能够得到Icon、Label、meta-data、description。后者只能得到Icon、Label。

  下面讲一下这几个类综合在一起的具体应用:

  通过调用PackageManager的方法可以得到两种不同的信息:

  首先要得到manager:

  PackageManager manager = getPackageManager();

  方法一:

  List< ApplicationInfo> appList = manager.getInstalledApplications(PackageManager.GET.UNINSTALLED_PAKAGES);

  它是通过解析AndroidManifest.xml的< application>标签中得到的,所以它能得到所有的app。

  方法二:

  Intent intent = new Intent(Intent.A CTION_MAIN,null);

  intent.addCategory(Intent.CATEGORY_LAUNCHER);

  List< ResolveInfo> appList = manager.queryIntentActivities(intent,0);

  它是通过解析< Intent-filter>标签得到有

  < action android:name=”android.intent.action.MAIN”/>

  < action android:name=”android.intent.category.LAUNCHER”/>

  这样的app,所以得到的要比第一种方法少(前者比它多那种service、previder等app)。


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class APKTestActivity extends Activity {  
  2.   
  3.     /** Called when the activity is first created. */  
  4.     @Override  
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.   
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.         List<PackageInfo> apps = new ArrayList<PackageInfo>();  
  10.   
  11.         PackageManager packageManager = this.getPackageManager();  
  12.         List<PackageInfo> pkgLists = packageManager.getInstalledPackages(0);  
  13.         for (PackageInfo packageInfo : pkgLists) {  
  14.             ApplicationInfo applicationInfo = packageInfo.applicationInfo;  
  15.             if ((applicationInfo.flags & applicationInfo.FLAG_SYSTEM) <= 0) {// is  
  16.                 // customer  
  17.                 apps.add(packageInfo);  
  18.                 Log.d("pin""applicationInfo.packageName->" + applicationInfo.packageName);  
  19.             }  
  20.         }  
  21.         Log.d("pin""apps.size()->" + apps.size());  
  22.   
  23.         List<ResolveInfo> ResolveInfoLists = getResolveInfoLists();  
  24.         Log.d("pin""ResolveInfoLists .size()->" + ResolveInfoLists.size());  
  25.   
  26.         for (ResolveInfo resolveInfo : ResolveInfoLists) {  
  27.   
  28.             Log.d("pin""resolveInfo.activityInfo.packageName->" + resolveInfo.activityInfo.packageName);  
  29.         }  
  30.     }  
  31.   
  32.     /** 
  33.      * @Title: getResolveInfoLists 
  34.      * @Description: 它是通过解析< Intent-filter>标签得到有   < action 
  35.      *               android:name=”android.intent.action.MAIN”/>   < action 
  36.      *               android:name=”android.intent.category.LAUNCHER”/> 
  37.      * @param : 
  38.      * @return List<ResolveInfo> 
  39.      * @throws 
  40.      */  
  41.     private List<ResolveInfo> getResolveInfoLists() {  
  42.   
  43.         // TODO Auto-generated method stub  
  44.         PackageManager packageManager = this.getPackageManager();  
  45.   
  46.         Intent intent = new Intent(Intent.ACTION_MAIN);  
  47.         intent.addCategory(Intent.CATEGORY_LAUNCHER);  
  48.   
  49.         return packageManager.queryIntentActivities(intent, 0);  
  50.     }  
  51.   
  52. }  
### 关于Android Studio虚拟机中预装软件数量有限的原因 Android Studio 的虚拟设备(AVD,Android Virtual Device)设计初衷是为了提供一个轻量级、高效的开发测试环境。因此,在虚拟环境中仅包含了必要的核心组件和基础应用程序,而未包含大量额外的应用程序或功能模块[^1]。 这种精简的设计有以下几个主要原因: 1. **性能优化** 虚拟设备运行在开发者主机上,其资源受限于物理硬件的能力。如果预装过多的软件,则会显著增加内存占用以及 CPU 和存储的需求,从而降低模拟器的整体性能表现[^2]。 2. **灵活性需求** 开发者可能针对不同场景定制化自己的测试环境。例如某些项目需要特定版本的操作系统或者特殊权限设置,而这些都依赖于干净的基础镜像来实现自定义配置[^3]。 3. **兼容性和稳定性保障** 减少不必要的第三方应用可以有效避免潜在冲突问题发生,确保整个平台更加稳定可靠地服务于主要目标——即移动应用开发与调试工作流之中. 4. **真实体验还原** 实际用户使用的真机通常也会保持相对简洁的状态,并不会一开始就携带太多内置程序;通过这种方式可以让开发者更贴近实际部署后的用户体验效果进行评估. 综上所述,为了满足高效能运作、高度可调整性以及维持良好操作状态等方面考虑,决定了 Android Studio 中所提供的 AVDs 只保留最基本的功能集合而不加载多余的默认安装件。 ```java // 示例代码展示如何启动Android Emulator并检查已安装包名列表 import android.content.pm.PackageManager; public class InstalledAppsChecker { public static void main(String[] args){ PackageManager pm = getPackageManager(); // 获取Package管理实例 List<ApplicationInfo> appsList = pm.getInstalledApplications(PackageManager.GET_META_DATA); System.out.println("Total installed packages:" + appsList.size()); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值