10

我有这个代码来获取系统上所有应用程序的列表:

    PackageManager pm = getPackageManager();

    Intent mainIntent = new Intent(Intent.ACTION_MAIN);

    List<ResolveInfo> installedApps = pm.queryIntentActivities( mainIntent, 0);

    for(ResolveInfo elem : installedApps) {
            String PackageName = elem.activityInfo.applicationInfo.packageName;
            Log.i("TAG",PackageName);
    }

但是 installedApps 中的结果显示了许多重复的 PackageName。这可能吗?这是因为意图的“失败”还是因为许多应用程序包名称具有相同的名称?

4

5 回答 5

14

这可能吗?

当然。

这是因为意图的“失败”

不,至少不是我对“失败”的定义。

还是因为许多应用程序包名称具有相同的名称?

不。

这是因为您查询的是活动,而不是应用程序。一个应用程序可以有零个、一个、两个或一百万个活动来响应ACTION_MAIN Intent.

于 2013-06-21T15:28:13.600 回答
7

不,每个应用程序都应该有一个唯一的包名称。如果您安装的应用程序的包名称已在另一个已安装的应用程序中使用,那么它将替换它。

所以应该还有其他原因。一种猜测是queryIntentActivities检索可以针对给定意图执行的所有活动。因此它可以返回具有相同包名的活动信息。

您可以尝试使用getInstalledApplications方法。它将返回设备上安装的所有应用程序包的列表

于 2013-06-21T15:28:48.657 回答
6

每个应用程序都必须有一个唯一的包名。引用API 指南:“包名称作为应用程序的唯一标识符”和“一旦发布应用程序,您就无法更改包名称。包名称定义了您的应用程序的身份,因此如果您更改它,那么它被认为是不同的应用程序,以前版本的用户无法更新到新版本。”

请注意,在单个清单中包含多个 ACTION_MAIN 条目是完全有效的,因为它们代表了应用程序的替代入口点。有关更多信息,请参阅此问题

于 2013-06-21T15:29:59.573 回答
0

包名就像一个文件夹结构。我相信,当您进入设备或模拟器中的 data->data 文件夹时,您可以看到它。

我们是否需要为不同的应用程序使用不同的文件夹?

我会说最好是这样。因为我不希望您的同名文件相互覆盖并产生意外行为或崩溃。如果您确定两个应用程序在类名上没有冲突,我相信它是一样的。

于 2013-06-21T16:03:51.570 回答
0

不,

警告:一旦您发布了应用程序,您就无法更改包名称。包名定义了你的应用程序的身份,所以如果你改变它,那么它被认为是一个不同的应用程序,以前版本的用户不能更新到新版本。

文档

但是在不同的不同活动中使用意图过滤器有不同的入口点。

 <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>

包名称:应用程序的完整 Java 语言样式的包名称。名称应该是唯一的。名称可以包含大写或小写字母(“A”到“Z”)、数字和下划线(“_”)。但是,单个包名称部分只能以字母开头。为避免与其他开发人员发生冲突,您应该使用 Internet 域所有权作为您的包名称的基础(相反)。例如,Google 发布的应用程序以 com.google 开头。发布应用程序时,您也不应该使用 com.example 命名空间。

包名称用作应用程序的唯一标识符。它也是应用程序进程的默认名称(参见<application>元素的processprocess 属性)和活动的默认任务亲和性(参见<activity>元素的taskAffinity属性)。

于 2016-02-12T08:23:16.070 回答