写点什么

如何获取所有安装的应用程序信息

用户头像
Changing Lin
关注
发布于: 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
用户头像

Changing Lin

关注

获得机遇的手段远超于固有常规之上~ 2020.04.29 加入

我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。

评论

发布
暂无评论
如何获取所有安装的应用程序信息