3

我正在尝试使用这种方法在我的设备中获取每个可启动的应用程序:

apps = new ArrayList<>();
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> availableActivities = manager.queryIntentActivities(intent, 0);
for(ResolveInfo ri:availableActivities){
    AppDetail app = new AppDetail();
    app.label = ri.loadLabel(manager);
    app.name = ri.activityInfo.packageName;
    app.icon = ri.activityInfo.loadIcon(manager);
    apps.add(app);
}

我尝试打印这些应用程序的标签和包名,发现:
联系人 com.sonyericsson.android.socialphonebook
电话 com.sonyericsson.android.socialphonebook
他们有不同的应用程序标签但包名相同。当我尝试打开应用程序时,它们都打开了联系人应用程序。
有什么方法可以区分它们吗?还是我使用了错误的方法来获取应用程序列表?

4

1 回答 1

2

queryIntentActivities检索可以为给定 执行的所有活动intent。因此它可以返回具有相同包名的活动信息。

我相信电话和联系人是同一个联系人应用程序。

可以为同一个程序创建两个不同的图标,一个用于不同的活动。这是有道理的,因为它MAIN/LAUNCHER intent filter本质上告诉 android 该活动是应用程序的启动活动。因此,如果您将此过滤器添加到两个活动,它将为您提供同一个应用程序的两个图标以输入不同的活动。android 的意图过滤器模型中的任何内容都不会强制每个应用程序只有一个启动活动。

于 2018-03-18T08:16:20.077 回答