【问题标题】:Can two different apps have the same packageName?两个不同的应用程序可以具有相同的包名吗?
【发布时间】:2013-06-18 19:08:07
【问题描述】:

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

    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。 这可能吗?这是因为意图“失败”还是因为许多应用程序包名称具有相同的名称?

【问题讨论】:

    标签: android package packages


    【解决方案1】:

    这可能吗?

    当然。

    这是因为意图“失败”

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

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

    没有。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 感谢您的回答! ;)
        【解决方案4】:

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

        不同的应用程序需要不同的文件夹吗?

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

        【讨论】:

          【解决方案5】:

          没有,

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

          Docs

          但是在不同的Activity中使用intent-filter会有不同的入口点。

           <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 命名空间。

          包名用作应用程序的唯一标识符。它也是应用程序进程的默认名称(参见&lt;application&gt; 元素的process 进程属性)和活动的默认任务关联(参见&lt;activity&gt; 元素的taskAffinity 属性)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-10-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多