在launcher的开发中肯定会有一个页面展示全部的app,但是android系统中安装的apk文件又不是所有的都可以直接打开(比如安装的主题包等)。所以在展示app 列表的时候肯定就涉及到一些app的过滤问题
首先 - 获取手机上所有安装的应用程序包
/**
* 获取所有的安装的应用程序信息。
* @param context 上下文
* @return
*/
public static List<AppInfo> getAppInfos(Context context){
PackageManager pm = context.getPackageManager();
//所有的安装在系统上的应用程序包信息。
List<PackageInfo> packInfos = pm.getInstalledPackages(0);
List<AppInfo> appInfos = new ArrayList<AppInfo>();
for(PackageInfo packInfo : packInfos){
boolean notActiveApp = NotActiveApp(context, packInfo.packageName);
if (notActiveApp)
continue;
AppInfo appInfo = new AppInfo();
//packInfo 相当于一个应用程序apk包的清单文件
String packname = packInfo.packageName;
Drawable icon = packInfo.applicationInfo.loadIcon(pm);
String name = packInfo.applicationInfo.loadLabel(pm).toString();
//应用程序信息的标记 相当于用户提交的答卷
int flags = packInfo.applicationInfo.flags;
//操作系统分配给应用系统的一个固定的编号。一旦应用程序被装到手机 id就固定不变了。
int uid = packInfo.applicationInfo.uid;
appInfo.setUid(uid);
if((flags& ApplicationInfo.FLAG_SYSTEM)==0){//用户程序
appInfo.setUserApp(true);
}else{//系统程序
appInfo.setUserApp(false);
}
if((flags&ApplicationInfo.FLAG_EXTERNAL_STORAGE)==0){//手机的内存
appInfo.setInRom(true);
}else{//手机外存储设备
appInfo.setInRom(false);
}
appInfo.setPackname(packname);
appInfo.setIcon(icon);
appInfo.setName(name);
appInfos.add(appInfo);
}
return appInfos;
}
这里用到了PackageMannager包管理类,调用getInstalledPackages(0)获取到了手机中所有的已安装的包集合
ApplicationInfo.FLAG_SYSTEM用来判别当前包是不是系统应用
过滤 - 过滤不能启动的类
app的启动可以通过Intent来启动,判断app能否直接启动用以下方法
/**
* 判断app能不能主动启动 否就隐藏
* */
public static boolean NotActiveApp(Context context, String packageName){
Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
if (intent == null)
return true;
return false;
}