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