android launcher开发中过滤不能启动的package(app)

来源:互联网 发布:json对象转化成数组 编辑:程序博客网 时间:2024/06/04 01:34

在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;    }


getLaunchIntentForPackage()方法是用来获取当前包名可启动的LaunchIntent,直观的来说就是返回结果如果为空点应用图标没反应,不为空则启动app。
阅读全文
0 0
原创粉丝点击