[mobilesafe] 09_程序管理器显示的数据——获取系统程序和用户程序信息

Android 4.0

程序管理器显示的数据—— 获取系统程序和用户程序信息

技术点:1、应用程序和包名区别
应用程序ApplicationInfo是PackageInfo的子集
PackageManager.getInstalledApplications():获取到的是清单文件中application节点中的数据
PageageManager.getInstalledPackages():获取到的是清单文件中所有的数据

Android下两个重要的管理者
//ActivityManager 相当于windows下的进程管理器-Activity管理者
//PackageManager 相当于windows下的程序管理器-包管理者
// packageManager.getApplicationInfo(packageName, flags); //获取应用程序信息
// packageManager.getApplicationIcon(info);//获取应用程序图标
// packageManager.getApplicationLabel(info)//获取应用程序名称
2、系统应用信息的表示方式:一个int的前28位,每一位代表一个功能

应用:如果应用的状态过多,可以这样定义,如:一个电视频道的状态,游戏的状态机(满足很多条件才能做某件事)

3、ApplicationInfo中定义的常量,用一个int值来表示该应用的各种信息,
ApplicationInfo applicationInfo = packageInfo.applicationInfo;  
public static final int FLAG_SYSTEM = 1<<0;  //if set, this application is installed in the * device's system image. 
public static final int FLAG_DEBUGGABLE = 1<<1; 
public static final int FLAG_HAS_CODE = 1<<2; 
......
public static final int FLAG_CANT_SAVE_STATE = 1<<28;     
int flags = packageInfo.applicationInfo.flags;  //Flags associated with the application.
flags是该应用程序信息的标识,一个int来表示,每一位代表一个信息,
所以,要想知道某一位是否设置了,只需要将该flags和某一位进行与操作,
如果为0,说明该位没有设置,否则,表示该位设置了。
(ApplicationInfo.FLAG_SYSTEM & flags) != 0  

应用:如上面的手机频道项目,一个频道有n多个属性,该频道是否免费,是否优惠,是否在套餐中,是否18岁以上才能看等10几个属性,可以这样定义,
private int isFree = 1<<0;
private int isFavorable 1<<1;
private int isInCombo 1<<2;
......
要想判断一个频道是否具备某些属性,只需要将该频道的flag和某一个属性进行与操作,
如果结果不等于0,说明具备该属性。

重要:对于一些状态较多的,可以借鉴这种方式定义状态
4、Container error表示模拟器不支持的错误:低版本的模拟器不支持,只有android4.1和intel的吗,模拟器支持,真机支持
android:installLocation="preferExternal"更倾向于外部sdcard卡,
核心代码:
package cn.zengfansheng.mobilesafe.engine;

import java.util.ArrayList;
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.graphics.drawable.Drawable;
import cn.zengfansheng.mobilesafe.domain.AppInfo;

/**
 * 3、获取系统应用信息的服务类——包管理者的应用
 * @author hacket
 */

public class AppInfoProvider {

    /**
     * 1、获取系统中所有应用的信息
     * @param context 上下文
     * @return List<AppInfo> 里面是应用的所有信息
     */

    public static List<AppInfo> getAppInfos(Context context) {

        List<AppInfo> appInfos = new ArrayList<AppInfo>();
        // context.getApplicationInfo();
        // context.getPackageManager();
        //1、获取包管理者
        PackageManager packageManager = context.getPackageManager();
       
        // packageManager.getApplicationInfo(packageName, flags); //获取应用程序信息
        // packageManager.getApplicationIcon(info);//获取应用程序图标
        // packageManager.getApplicationLabel(info)//获取应用程序名称

        //2、获取安装的应用的包的信息
        List<PackageInfo> installedPackages = packageManager.getInstalledPackages(0);//参数:可选
        for (PackageInfo packageInfo : installedPackages) {
           
            AppInfo appInfo = new AppInfo();

            // packageInfo.applicationInfo.icon;//应用程序的图标
            // packageInfo.applicationInfo.labelRes;//应用程序的名称
            // 2-1图标
            Drawable appIcon = packageInfo.applicationInfo.loadIcon(packageManager);
            appInfo.setAppIcon(appIcon);

            // 2-2 程序名
            CharSequence appLabel = packageInfo.applicationInfo.loadLabel(packageManager);
            appInfo.setAppName(appLabel.toString());

            // 2-3 包名
            String appPackageName = packageInfo.applicationInfo.packageName;
            // String appPackageName = packageInfo.packageName;
            appInfo.setAppPackageName(appPackageName);

            // 2-4 是否是用户程序还是系统程序-重要的
            // ApplicationInfo applicationInfo = packageInfo.applicationInfo;

            int flags = packageInfo.applicationInfo.flags;
            if ((ApplicationInfo.FLAG_SYSTEM & flags) != 0) {// 不等于0,说明是系统程序
                appInfo.setIsUserApp(false);
            } else {// 等于0,
                appInfo.setIsUserApp(true);
            }
           
            // 2-5 是否安装在rom,还是安装在sdcard
            if ((ApplicationInfo.FLAG_EXTERNAL_STORAGE & flags) != 0) {// 在外部存储卡
                appInfo.setIsInRom(false);
            } else {
                appInfo.setIsInRom(true);
            }
            appInfos.add(appInfo);
        }
        return appInfos;
    }
}
结果: