两个不同的应用程序可以有相同的包名吗?

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中的结果显示许多重复的PackageNames。这可能吗?这是由于意图的“失败”还是因为许多应用程序PackageName具有相同的名称?

5个回答

14

这是可能的吗?

当然可以。

因为意图的“失败”引起的吗?

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

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

不是。

这是因为你查询的是活动(activities),而不是应用程序(applications)。一个应用程序可以有零个、一个、两个或者无数个活动,它们将响应一个ACTION_MAIN Intent


8
不,每个应用程序都应该有一个唯一的包名。如果您安装了一个具有已在另一个已安装应用程序中使用的包名的应用程序,则它将替换它。
因此应该有其他原因。一个猜测是 queryIntentActivities 检索可以执行给定意图的所有活动。因此,它可能会返回具有相同包名称的活动信息。
您可以尝试使用 getInstalledApplications 方法。它将返回在设备上安装的所有应用程序包的列表。

7
每个应用程序必须有一个唯一的包名。引用自API指南:“包名作为应用程序的唯一标识符”,“一旦您发布了应用程序,就不能更改包名。包名定义了您的应用程序的身份,因此如果您更改它,则被视为不同的应用程序,之前版本的用户无法更新到新版本。”
请注意,在单个清单中具有多个ACTION_MAIN条目是完全有效的,因为它们代表应用程序的替代入口点。有关更多信息,请参见此问题

0

不可以。

注意:一旦您发布了应用程序,就无法更改软件包名称。软件包名称定义了您的应用程序身份,因此如果更改它,则被视为不同的应用程序,先前版本的用户无法更新到新版本。

文档

但是您可以使用不同的 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命名空间。

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


0

包名类似于文件夹结构。我认为当您进入设备或模拟器中的data-> data文件夹时,您可以看到它。

我们需要为不同的应用程序创建不同的文件夹吗?

我的意见是最好如此。因为我不希望您具有相同名称的文件相互覆盖,并导致意外行为或崩溃。如果您确定两个应用程序没有类名冲突,那么我认为它们可以相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接