如何获取所有安装的应用程序信息
发布于: 2 小时前
1.知识点
- LauncherApps:该类用于检索当前用户可以启动的 Activity,以及对用户可见的相关管理策略。 
- LauncherApps.getActivityList:获取指定用户的带有 Intent.ACTION_MAIN 和 Intent.CATEGORY_LAUNCHER 配置的 Activity,即表示带有启动能力的应用。 
- UserHandle:android.os.Process.myUserHandle()获取当前进程的用户 
- PackageManager:包管理器 
- PackageManager.getInstalledPackages:获取安装的包,也即会检索出系统所有的应用,即使是无启动能力的应用 
2.原理
- 刚开始使用 getInstalledPackages 检索出所有应用,但是由于加载 icon 占内存过大,带来了 oom 问题 
- 使用 getActivityList 接口可以检索出只具有启动能力的应用,且有 getBadgedIcon 接口,可以指定 icon 的质量,从而避免了 oom 问题。代码如下 
3.代码
- AppInfo.java 
import android.graphics.drawable.Drawable;
/** * 应用程序信息的业务Bean * Created by Administrator on 2016/8/31. */public class AppInfo {
    private Drawable icon; // 应用图标    private String name; // 应用名    private String packname; // 包名    private boolean isRom; // 是否安装在内存    private boolean userApp; // 是否用户应用    private int uid; // 每个应用不同的User Identifier,实现数据共享
    public String getSourceDir() {        return sourceDir;    }
    public void setSourceDir(String sourceDir) {        this.sourceDir = sourceDir;    }
    private String sourceDir; // 应用安装路径
    public int getUid() {        return uid;    }
    public void setUid(int uid) {        this.uid = uid;    }
    public Drawable getIcon() {        return icon;    }
    public void setIcon(Drawable icon) {        this.icon = icon;    }
    public String getName() {        return name;    }
    public void setName(String name) {        this.name = name;    }
    public String getPackname() {        return packname;    }
    public void setPackname(String packname) {        this.packname = packname;    }
    public boolean isRom() {        return isRom;    }
    public void setRom(boolean rom) {        isRom = rom;    }
    public boolean isUserApp() {        return userApp;    }
    public void setUserApp(boolean userApp) {        this.userApp = userApp;    }
    @Override    public String toString() {        return "AppInfo{" +                "icon=" + icon +                ", name='" + name + '\'' +                ", packname='" + packname + '\'' +                ", isRom=" + isRom +                ", userApp=" + userApp +                ", uid=" + uid +                ", sourceDir='" + sourceDir + '\'' +                '}';    }}复制代码
 - AppInfoProvider.java 
/**     * 用于启动其他应用     */    public static void startApplication(Context context, AppInfo appInfo) {        PackageManager pm = context.getPackageManager();        Intent intent = pm.getLaunchIntentForPackage(appInfo.getPackname());        if (null != intent) {            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            context.startActivity(intent);        } else            ToastUtil.showToast(context.getApplicationContext(), "无法启动该应用");    }
    /**     * 获取所有安装的应用程序信息     * @return     */    public static List<AppInfo> getAppInfos(Context context){        List<AppInfo> appInfos = new ArrayList<>();        LauncherApps launcherApps = (LauncherApps) context.getSystemService(Context.LAUNCHER_APPS_SERVICE);        List<LauncherActivityInfo> availableActivities =                launcherApps.getActivityList(null, android.os.Process.myUserHandle());        for (LauncherActivityInfo info : availableActivities){            AppInfo appInfo = new AppInfo();
            appInfo.setIcon(info.getBadgedIcon(DisplayMetrics.DENSITY_HIGH)); // 加载图片资源
            appInfo.setName(info.getLabel().toString()); // 获取应用程序名字,android:lable            appInfo.setPackname(info.getComponentName().getPackageName()); // 获取应用包名            int flags = info.getApplicationInfo().flags; // 获取应用信息的标志位
            if ((flags & ApplicationInfo.FLAG_SYSTEM) == 0){                // 用户程序                appInfo.setUserApp(true);            }else {                // 系统程序                appInfo.setUserApp(false);            }
            if ((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == 0){                // 安装在手机内存                appInfo.setRom(true);            }else {                // 安装在手机外存                appInfo.setRom(false);            }            int uid = info.getApplicationInfo().uid;            appInfo.setUid(uid);
            appInfo.setSourceDir(info.getApplicationInfo().sourceDir);
            appInfos.add(appInfo); // 添加一个应用信息到集合        }        return appInfos;    }复制代码
 划线
评论
复制
发布于: 2 小时前阅读数: 6
版权声明: 本文为 InfoQ 作者【Changing Lin】的原创文章。
原文链接:【http://xie.infoq.cn/article/1f26f247f92b817701cf97dba】。文章转载请联系作者。


Changing Lin
关注
获得机遇的手段远超于固有常规之上~ 2020.04.29 加入
我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。











 
    
评论