1

在 android 中,我列出了已安装的应用程序列表并存储在我的私人数据库中。在某些应用程序具有相同名称的情况下,例如有 4 个名为 Maps 的应用程序,如果一个应用程序得到更新,则私有数据库中的其他 3 个应用程序记录将得到更新。如何区分这些应用程序?我使用以下代码来获取已安装的应用程序列表。

PackageManager pm = this.getPackageManager();
    Intent intent = new Intent(Intent.ACTION_MAIN, null);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);

    List<ResolveInfo> list = pm.queryIntentActivities(intent,
            PackageManager.PERMISSION_GRANTED);
    ArrayList<String> applist = new ArrayList<String>();
    ArrayList<String> packlist = new ArrayList<String>();

    for (ResolveInfo rInfo : list) {
        packlist.add(rInfo.activityInfo.packageName);
        applist.add(rInfo.activityInfo.applicationInfo.loadLabel(pm)
                .toString());
    }
4

3 回答 3

0

我想补充一点这里没有提到的澄清。

尽管不能有两个应用程序具有相同的包名称,但用户可以在启动器应用程序中看到一个应用程序中的多个启动器活动。是的,正如您所注意到的,标准的“地图”应用程序(“com.google.android.apps.maps”包)有几个启动器活动,如“本地”、“导航”、“地图”。这些“应用程序”(或开发人员术语中的活动)是否在一个应用程序包中实现对用户来说并不重要。

活动名称(“com.google.android.maps.MapsActivity”,您可以通过 检索此字符串rInfo.activityInfo.name)本身也不是唯一的,因为任何人都可以创建具有唯一包名称的应用程序和位于 java 包 com.google.android 中的活动.maps 称为 MapsActivity。

因此,如果您想找到所有这些启动器活动的唯一标识符,您应该使用应用程序包名称(“com.google.android.apps.maps”)和活动名称(“com.google.android.maps”)的组合。地图活动”)。

于 2013-05-28T12:13:50.757 回答
0

您不应该通过名称来区分两个应用程序。有些应用程序甚至没有与之关联的名称(即它们是空的)。区分两个应用程序的唯一可靠方法是通过它们的包名(这也被操作系统大量使用)。

另请注意,虽然包名称始终相同,但如果应用程序完全卸载然后重新安装,应用程序的 UID 可能会发生变化。

于 2012-05-16T06:46:30.947 回答
0

使用安装路径作为唯一标识符(它们不会安装在同一个目录中)。

另一方面,如果您有时间,请阅读这篇文章。包的配置包含 UID。链接来自这个答案。

于 2012-05-16T06:45:25.823 回答