【Android源码-PMS】(一)PackageItemInfo类

注:转载请注明来自Nemo, http://blog.csdn.net/nemo__


一、包名
       android.content.pm.PackageItemInfo
     子类(均在android.content.pm包中):ApplicationInfoInstrumentationInfo, PermissionGroupInfo, PermissionInfo, ComponentInfo.


二、概述         
/**
 * Base class containing information common to all package items held by
 * the package manager.  This provides a very common basic set of attributes:
 * a label, icon, and meta-data.  This class is not intended
 * to be used by itself; it is simply here to share common definitions
 * between all items returned by the package manager.  As such, it does not
 * itself implement Parcelable, but does provide convenience methods to assist
 * in the implementation of Parcelable in subclasses.
 */
       PackageItemInfo, 代表一个应用包内所有组件项和通用信息的基类。该类提供最基本的属性集,如: label, icon, meta-data等。一般不会直接使用该类,它设计之初就是为了包内其它基本组件项提供统一的基本定义。它没有实现接口Parcelable, 但它提供了传Parcel型的构造函数,以writeToParcel()方法给它的子类来实现PackageItemInfo内部这部分的成员的Parcel化。
  
      
三、主要成员    
public String name;
该组件项的公共名称,从"android:name"属性得到。

public String packageName;
该组件项所在的包的包名。

public int labelRes;
指定该组件项的标签,string型的资源id,从"android:label"属性得到,如不设置则为0.

public CharSequence nonLocalizedLabel;

public int icon;
指定该组件项的图标,drawable型的资源id,从"android:icon"属性得到,如不设置则为0.

public int banner;
指定该组件项的横幅,drawable型的资源id,从"android:banner"属性得到,如不设置则为0.

public int logo;
指定该组件项的logo,drawable型的资源id,比应用图标要大,ActionBar可以设置是否显示logo, 从"android:banner"属性得到,如不设置则为0.

public Bundle metaData;
对应AndroidManifest中的标签。 只有 , 标签中可能包含子标签。

public int showUserIcon;
默认值为 UserHandle.USER_NULL,还可以是UserHandle. USER_OWNER。只有实例的引用来访问。


四、主要方法    
1. 构造方法: 
public PackageItemInfo(),
public PackageItemInfo(PackageItemInfo orig),
protected PackageItemInfo(Parcel source)

2. public CharSequence loadLabel(PackageManager pm)
返回该组件项的标签,优先级依次为:nonLocalizedLabel, labelRes, name, packageName.

3. public Drawable loadIcon(PackageManager pm)
返回该组件项的图标,通过ApplicationPackageManager的loadItemIcon()方法获取icon对应的Drawable.

4. public Drawable loadBanner(PackageManager pm)
返回该组件项的横幅,通过ApplicationPackageManager的getDrawable()方法获取banner对应的Drawable, 如果banner为0, 返回loadDefaultBanner()的结果.

5. public Drawable loadLogo(PackageManager pm)
返回该组件项的大图标,通过ApplicationPackageManager的getDrawable()方法获取logo对应的Drawable, 如果logo为0, 返回loadDefaultLogo()的结果.

6. public Drawable loadDefaultIcon(PackageManager pm)
返回该组件的默认图标,通过ApplicationPackageManager的getDefaultActivityIcon()方法, 返回的结果是com.android.internal.R.drawable.sym_def_app_icon对应的Drawable.

7. protected Drawable loadDefaultBanner(PackageManager pm)
返回null.

8. protected Drawable loadDefaultLogo(PackageManager pm)
返回null.

9. public XmlResourceParser loadXmlMetaData(PackageManager pm, String name)
找到metaData中对应为name的资源id通过ApplicationPackageManager的getXml()方法, 返回该id对应的XmlResourceParser.

10. protected ApplicationInfo getApplicationInfo()
返回null.

11. public void writeToParcel(Parcel dest, int parcelableFlags)
PackageItemInfo的子类Parcel化提供基类部分的成员的写入。


五、调用情况
1. PackageParser.parsePackageItemInfo()
      parsePackageItemInfo( )是PackageParser的私有方法,也是唯一的参数有PackageItemInfo的方法,它在PackageParser中三个地方被调用,分别用于解析标签 生成 PermissionGroupInfo, 解析 生成PermissionInfo, 解析生成PermissionInfo.

2. PackageParser.parseBaseApplication()
        parseBaseApplication()是PackageParser的私有方法,用于解析标签生成ApplicationInfo, 只在PackageParser中被私有方法parseBaseApk(), 我们知PMS中scanPackageLI()最后会走到这里,也就是开机扫描所有安装apk时会解析manifest。

        可以看到 PackageItemInfo类本身并没有被直接使用,更多的是它的子类、间接子类,不过它定义了组件的共同特征,为研究其它组件信息提供基础,组件信息均是public的,外部直接用该类实例来引用赋值。它的主要子类是ComponentInfo, ApplicationInfo在后面会继续研究,其它三个子类会大致过一遍。

你可能感兴趣的:(Android源码)