我用获取所有的应用列表的方法拉取了所有的系统应用,但是处于同一模块功能的应用也被显示出来了,比如电话功能这个模块,在布局上同时还显示电话管理,电话和短信存储等功能,怎么样过滤掉这些子功能只显示主模块

public static ArrayList getAllAppInfo(Context context,boolean systemApp) {
ArrayList appBeanList = new ArrayList<>();
AppInfo bean = null;

    PackageManager packageManager = context.getPackageManager();
    List<PackageInfo> list = packageManager.getInstalledPackages(0);
    for (PackageInfo p : list) {
        bean = new AppInfo();
        bean.setIconId(p.applicationInfo.loadIcon(packageManager));
        bean.setIconName(packageManager.getApplicationLabel(p.applicationInfo).toString());
        bean.setClassName(p.applicationInfo.className);
        bean.setActivityName(p.applicationInfo.manageSpaceActivityName);

// Log.d("angelo", "angelo label " + p.applicationInfo.labelRes);
// if(p.applicationInfo.labelRes != 0) {
// bean.setPackageName(context.getResources().getString(p.applicationInfo.labelRes));
// }

        String applicationName =
                (String) packageManager.getApplicationLabel(p.applicationInfo);
        bean.setPackageName(applicationName);
        int flags = p.applicationInfo.flags;
        if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0&&systemApp) {
            bean.setSystemApp(true);
        } else {
            appBeanList.add(bean);
        }
    }
    return appBeanList;
}

可以根据包名去重

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/744813
  • 这篇博客也不错, 你可以看下编写程序,显示如下图界面(包含5个按钮),用户点击不同按钮时,分别显示不同对话框(对话框内的内容可自己编写)。请提交作业时提交运行结果截图和按钮触发后执行的代码。
  • 除此之外, 这篇博客: 安卓应用市场分类排名算法一般是怎样的?中的 想要了解运营,了解一下应用市场上应用是怎么样排名也是很有必要的。下面这都是从网看到,觉得比较靠谱点的。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 各家安卓商店的算法和规则不一样,单个商店pc端和移动端的排名算法也存在着差异,而且这些规则也一直在变,但是核心的东西没有变(下载量、活跃度、好评率、留存率等),只是权重一直在调整。应用资质,是否是官方版?是否是优质应用?是否安全、无病毒、无木马?是否MTC认证、无广告?关键词,也挺重要的;版本更新,持续更新情况

    • 这个听说是谷歌应用市场的排名规则

      • 1、 Downloads (下载量)

      • 2、 App quality (应用质量,保留率)

      • 3、Frequency of interaction with the app (使用频率)

      • 4、Uninstalls (卸载量)

      • 5、Number and quality of ratings and comments (打5星,好评数)

      • 6、Keyword density (关键词密度)

      • 7、Social ‘proof’(社会认同)

      • 8、Number of backlinks (反向链接数)

      • 9、关键词搜索发现应用占的比例很高


    重申一次,上面不一定就对了,每个应用市场的规则,但这些至少可以给需要的人多一些参考。

  • 您还可以看一下 徐朋老师的2021年软考系统集成项目管理工程师基础知识(下)软考视频教程课程中的 法和法律、诉讼时效、法律体系小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    为了过滤掉子功能应用,只显示主模块的应用,可以按照以下步骤实现:

    1. 获取系统中所有应用的列表。

    首先,需要使用适当的方法获取系统中所有应用的列表。具体的方法取决于你的应用开发环境和技术栈。例如,在Android开发中,可以使用PackageManager类的getInstalledApplications()方法获取已安装应用的列表。

    示例代码(Java/Android):

    PackageManager pm = getPackageManager();
    List<ApplicationInfo> applications = pm.getInstalledApplications(0);
    
    1. 过滤掉子功能应用。

    对获取的应用列表进行遍历,判断应用是否为主模块的应用。具体判断的规则可能因应用类型和需求而有所不同。根据你给出的问题描述,假设主模块的应用与子功能应用的名称或包名有所区别,可以根据这些信息进行过滤。

    示例代码(Java/Android):

    List<ApplicationInfo> mainModuleApplications = new ArrayList<>();
    for (ApplicationInfo application : applications) {
        if (isMainModuleApplication(application)) {
            mainModuleApplications.add(application);
        }
    }
    

    其中,isMainModuleApplication()方法根据主模块应用与子功能应用的区别进行逻辑判断,返回true表示是主模块应用,返回false表示是子功能应用。

    1. 显示主模块应用列表。

    将过滤后的主模块应用列表展示给用户。具体的展示方式取决于你的应用设计和需求。可以使用列表控件或其他合适的界面元素进行展示。

    示例代码(Java/Android):

    // 在适当的界面布局中添加一个列表控件(例如ListView或RecyclerView)
    ListView mainModuleAppListView = findViewById(R.id.mainModuleAppListView);
    
    // 创建一个Adapter并设置给列表控件,用于显示主模块应用列表
    MainModuleAppAdapter adapter = new MainModuleAppAdapter(mainModuleApplications);
    mainModuleAppListView.setAdapter(adapter);
    

    其中,MainModuleAppAdapter是一个自定义的Adapter,继承自BaseAdapter或RecyclerView.Adapter,用于将主模块应用列表中的数据绑定到列表控件的每一项上。

    综上所述,以上是实现过滤掉子功能应用、只显示主模块应用的一种解决方案。具体的实现细节和代码可能因你的应用开发环境和技术栈而有所不同,需要根据实际情况进行调整和完善。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^