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

在launcher的开发中肯定会有一个页面展示全部的app,但是android系统中安装的apk文件又不是所有的都可以直接打开(比如安装的主题包等)。所以在展示app 列表的时候肯定就涉及到一些app的过滤问题

首先 - 获取手机上所有安装的应用程序包

/**
     * 获取所有的安装的应用程序信息。
     * @param context 上下文
     * @return
     */
    public static List getAppInfos(Context context){
        PackageManager pm = context.getPackageManager();
        //所有的安装在系统上的应用程序包信息。
        List packInfos = pm.getInstalledPackages(0);
        List appInfos = new ArrayList();
        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。

你可能感兴趣的:([android技术])