如何获取所有安装的应用程序信息
发布于: 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 加入
我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。











评论