#Android源码#ApplicationInfo中flags的设计

介绍

ApplicationInfoandroid.content.pm包下的一个实体类,用于封装应用的信息,flags是其中的一个成员变量public int flags = 0;,用于保存应用的标志信息。

设计

ApplicationInfo实体类的设计很棒!用一个public int flags = 0;保存所有的标志信息,省了定义许多Boolean变量的代码。

对一个int值(32位)1(二进制形式为00000000 00000000 00000000 0000001)进行左移,第1位为符号位,第2位到第32位的每一位都代表一个标志位。比如

//是否为系统应用的标志位
public static final int FLAG_SYSTEM = 1<<0;
//是否安装在外置内存的标志位
public static final int FLAG_EXTERNAL_STORAGE = 1<<18;

这些值的经过位或(|)后赋值给flags,这样flags就保存了所有的标志信息,是不是很棒!

当我们需要获取某一标志位时,只需要做如下操作:

//以获取 FLAG_SYSTEM标志位为例,先位与(&)再比较
if((flags&FLAG_SYSTEM)==FLAG_SYSTEM){
    //标志位为true
}

应用

SoftwareInfo.java

public class SoftwareInfo {
    public String appName;//应用名
    public String packageName;//包名
    public Drawable icon;//图标
    public long size;//大小
    public boolean isInstallExternal;//是否安装在外存
    public boolean isSystemApp;//是否是系统应用
}

XxActivity.java

//获取所有安装软件的信息
private void getAllPackageInfo(){
    List<SoftwareInfo> mData = new ArrayList<SoftwareInfo>();
    PackageManager pm = getPackageManager();
    List<PackageInfo> installedPackages = pm.getInstalledPackages(0);
    for (PackageInfo packageInfo : installedPackages) {
        SoftwareInfo softInfo = new SoftwareInfo();
        //获取包名
        softInfo.packageName = packageInfo.packageName;
        //获取应用信息实体
        ApplicationInfo applicationInfo = packageInfo.applicationInfo;
        //获取应用名
        softInfo.appName =applicationInfo.loadLabel(pm).toString();
        //获取应用大小
        String dir = applicationInfo.sourceDir;
        softInfo.size = new File(dir).length();
        //获取应用图标
        softInfo.icon= applicationInfo.loadIcon(pm);
        //判断是否安装在外存
         int flags = applicationInfo.flags;
         if((flags&ApplicationInfo.FLAG_EXTERNAL_STORAGE)==ApplicationInfo.FLAG_EXTERNAL_STORAGE){
             softInfo.isInstallExternal=true;
         }
         //判断是否是系统应用
         if((flags&ApplicationInfo.FLAG_SYSTEM)==ApplicationInfo.FLAG_SYSTEM){
             softInfo.isSystemApp=true;
         }
         mData.add(softInfo);
    }
}

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