Manifest配置图:

QUERY_ALL_PACKAGES Android 版本_应用

图中,可以看到系统对每个节点信息进行了封装, 提供了各种类来存储对应节点的信息,通过PackageManager就可以获取对应的节点信息。

  • PackageInfo 包含了所有的acitity service信息
    常用的字段
    public String packageName —— 包名
    public ActivityInfo[] activities —— 所有< activity >节点信息
    public ApplicationInfo applicationInfo ——– < applicatio n>节点信息,只有一个
    public ActivityInfo[] receivers ——- 所有< receiver >节点信息,多个
    public ServiceInfo[] services ——- 所有< service >节点信息 ,多个
  • ApplicationInfo
    封装了< application> 与< / application >之间的信息,包含了很多flags字段,比如 FLAG_SYSTEM 系统应用程序, FLAG_EXTERNAL_STORAGE 表示该应用安装在sdcard中,FLAG_UPDATED_SYSTEM_APP 升级系统应用
    举例:
    (ApplicationInfo.FLAG_SYSTEM & applicationInfo.flags) != 0 // 系统程序
    (ApplicationInfo.FLAG_SYSTEM & applicationInfo.flags) <= 0 //第三方程序
    注:当系统程序升级后,也可以成为第三方程序: (ApplicationInfo.FLAG_UPDATED_SYSTEM_APP & applicationInfo.flags) != 0
    (ApplicationInfo.FLAG_EXTERNAL_STORAGE & applicationInfo.flags) != 0 //表示安装在sd卡上的应用
  • ActivityInfo
    封装了< activity> 与< / activity >之间以及< receiver> 与< / receiver >之间的信息,比如name,label,icon,launchmod等信息
  • ServiceInfo
    封装了< service> 与< / service >之间的信息,
  • ResolveInfo
    根据< intent>节点来获取其上一层目录的信息,通常是< activity>、< receiver>、< service>节点信息。
    返回指定< intent>的resolveInfo对象,activity集合或者service集合
    public ActivityInfo activityInfo 获取 ActivityInfo对象,即< activity>或< receiver >节点信息
    public ServiceInfo serviceInfo 获取 ServiceInfo对象,即< service>节点信息
    举例:
    String packagename = info.activityInfo.packageName;
    String name = info.activityInfo.name;
    String lable = info.activityInfo.loadLabel(pm).toString();

以上都会继承PackageItemInfo基类,
常用字段:
public int icon 获得该资源图片在R文件中的值 (对应于android:icon属性)
public int labelRes 获得该label在R文件中的值(对应于android:label属性)
public String name 获得该节点的name值 (对应于android:name属性)
public String packagename 获得该应用程序的包名 (对应于android:packagename属性)
常用方法:
Drawable loadIcon(PackageManager pm) 获得当前应用程序的图像
CharSequence loadLabel(PackageManager pm) 获得当前应用程序的label
所以说 以上类都能直接使用loadIcon(PackageManager pm) 和loadLabel(PackageManager pm) 来获取相应节点的信息


PackageManager
PackageManager 作为管理类,可以对上述不同的Bean对象进行调用,首先,通过getPackageManager返回一个PackageManager的对象来调用各种方法,获取不同Bean对象了.

常用方法:
(1)、public abstract PackageInfo getPackageInfo(String packageName, int flags)根据包名获取对应的PackageInfo,注意,此处的flags标签:
GET_ACTIVITIES
GET_GIDS
GET_CONFIGURATIONS
GET_INSTRUMENTATION
GET_PERMISSIONS
GET_PROVIDERS
GET_RECEIVERS
GET_SERVICES
GET_SIGNATURES
GET_UNINSTALLED_PACKAGES
举例:
packageInfo = packageManager.getPackageInfo(“com.kevin.materialdesigndemo”, PackageManager.GET_ACTIVITIES);
Log.d(TAG, packageInfo.packageName + “\n” + packageInfo.versionName + “\n” )
(2)、public abstract ApplicationInfo getApplicationInfo(String packageName, int flags)
根据指定的包名获取ApplicationInfo信息。flags 是此ApplicationInfo标记,通常可以直接赋予常数0
ApplicationInfo applicationInfo = pm.getApplicationInfo(packagename, 0);
(3)、public abstract ActivityInfo getActivityInfo(ComponentName component,int flags),
根据指定的组件,获取ActivityInfo信息
举例:
Drawable loadIcon = pm.getActivityIcon(new ComponentName(packagename, name));
(4)、public abstract ServiceInfo getServiceInfo(ComponentName component,int flags),根据指定组件获取ServiceInfo
(5)、public abstract ProviderInfo getProviderInfo(ComponentName component,int flags),根据指定组件名称获取ProviderInfo信息
(6)、public abstract List< PackageInfo> getInstalledPackages(int flags);获取所有安装的PackagInfo信息
举例1:
List< PackageInfo> listPack = packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES);
获取所有Package的信息,获得PackageInfo集合,遍历每个PackageInfo可以获取每个Package里的详情信息。由于我们设置的是Activity,所以在对应的PackageInfo中activities中有值。
举例2:
List< PackageInfo> listPack = packageManager.getInstalledPackages(PackageManager.GET_SERVICES);
获取所有Package的信息,获得PackageInfo集合,遍历每个PackageInfo可以获取每个Package里的详情信息。由于我们设置的是Serviece,所以在对应的PackageInfo中Serviece中有值。
举例3:
List< PackageInfo> listPack = packageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
(7)、public abstract List< ApplicationInfo> getInstalledApplications(int flags);
获取安装的ApplicationInfo信息
List< ApplicationInfo> listAppcations = pm
.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
(8)、 public abstract List< ResolveInfo> queryIntentActivities(Intent intent, int flags) 
返回指定intent的resovleInfo的对象,其实就是activity集合
举例1:
final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List< ResolveInfo> allapplist = pm.queryIntentActivities(mainIntent, 0);
举例2:
Intent resolveIntent = new Intent();
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setAction(Intent.ACTION_MAIN);
resolveIntent.setPackage(packagename);
List < ResolveInfo> infos = pm.queryIntentActivities(resolveIntent, 0);
举例3:
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
// 通过查询,获得所有ResolveInfo对象.
List< ResolveInfo> resolveInfos = pm
.queryIntentActivities(mainIntent, PackageManager.MATCH_DEFAULT_ONLY);