2013-06-21 67 views
6

我有这样的代码来获得对系统的所有应用程序的列表:两个不同的应用程序可以有相同的packageName吗?

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

回答

11

这可能吗?

当然。

这是“引起的意图

没有‘失败’,至少不是我的‘失败’的定义。

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

这是因为你要查询活动,不应用。应用程序可以有零个,一个,两个或一百万个活动,它们将响应一个ACTION_MAINIntent

+0

经验教训。谢谢! ;) – user2383054

5

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

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

您可以尝试使用getInstalledApplications方法。它会返回已安装的设备

+0

感谢您的信息;) – user2383054

4

每个应用程序都必须有一个潮头包名称上的所有应用程序包的列表。引用the API guide:“软件包名称作为应用程序的唯一标识符”和“发布应用程序后,您不能更改软件包名称。软件包名称定义了您的应用程序的标识,因此如果您更改它,那么它是被认为是不同的应用程序,以前版本的用户无法更新到新版本。“

。注意,在一个单一的清单具有多个ACTION_MAIN条目是完全有效的,因为它们代表可选的进入点中的应用。有关更多信息,请参阅this question

+0

感谢您的回答! ;) – user2383054

0

包名称的作用类似于文件夹结构。我相信,当你进入设备或模拟器的data-> data文件夹时,你可以看到它。

我们需要针对不同应用的不同的文件夹?

我会说最好是这样。由于我不希望你的文件使用相同的名称来覆盖对方,并且发生意外的行为或崩溃。如果您确定这两个应用程序在类名称中没有冲突,我相信它是一样的。

0

NO,

警告:一旦你发布你的应用程序,你不能改变的包名。软件包名称定义了您的应用程序的标识,因此如果您更改它,则认为它是不同的应用程序,并且以前版本的用户无法更新到新版本。

Docs

但也有在不同活动不同的使用意图过滤器不同的切入点。

<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属性)。

相关问题