我有这个代码来获取系统上所有应用的列表:
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);
}
但instalApps中的结果显示了许多重复的PackageNames。 这可能吗?它导致了意图的“失败”,或者因为许多应用程序packageNames具有相同的名称?
答案 0 :(得分:11)
这可能吗?
不确定
这导致了意图的“失败”
不,至少不是因为我对“失败”的定义。
或者因为许多应用程序packageNames具有相同的名称?
没有
这是因为您正在查询活动,而不是应用程序。一个应用程序可以有一个,一个,两个或一百万个活动来响应ACTION_MAIN
Intent
。
答案 1 :(得分:6)
不,每个应用都应该有一个唯一的包名。如果您安装的应用程序的软件包名称已经在另一个已安装的应用程序中使用,那么它将替换它。
所以应该有其他原因。一个猜测是queryIntentActivities
检索可以为给定意图执行的所有活动。因此它可以返回具有相同包名称的活动信息。
您可以尝试使用getInstalledApplications 方法。它将返回设备上安装的所有应用程序包的列表
答案 2 :(得分:4)
每个应用程序都必须具有uniqe包名称。引用the API guide:“包名称作为应用程序的唯一标识符”和“一旦发布应用程序,就无法更改包名称。包名称定义了应用程序的标识,因此如果您更改它,那么它被认为是一个不同的应用程序,以前版本的用户无法更新到新版本。“
请注意,在单个清单中包含多个ACTION_MAIN条目是完全有效的,因为它们代表应用程序的备用入口点。有关详细信息,请参阅this question。
答案 3 :(得分:0)
包名称的作用类似于文件夹结构。我相信,当你进入设备或模拟器中的data-&gt;数据文件夹时,你可以看到它。
我们是否需要针对不同应用程序的不同文件夹?
我会说最好是这样。因为我不希望您使用相同名称的文件互相覆盖并发生意外行为或崩溃。如果你确定两个应用程序都没有类名冲突,我相信它是相同的。
答案 4 :(得分:0)
NO,
警告:发布应用程序后,无法更改程序包名称。包名称定义了您的应用程序的标识,因此如果您更改它,则它被视为不同的应用程序,而以前版本的用户无法更新到新版本。
但是在不同的不同活动中使用intent-filter有不同的切入点。
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
PACKAGE NAME:应用程序的完整Java语言样式包名称。名称应该是唯一的。名称可能包含大写或小写字母(&#39; A&#39;到&#39; Z&#39;),数字和下划线(&#39; _&#39;)。但是,单个包名称部分可能只以字母开头。 为避免与其他开发人员发生冲突,您应使用Internet域所有权作为程序包名称的基础(反之)。例如,Google发布的应用程序以com.google开头。在发布应用程序时,也不应该使用com.example命名空间。
包名称用作应用程序的唯一标识符。它也是应用程序流程的默认名称(请参阅<application>
元素的process
流程属性)以及活动的默认任务关联(请参阅<activity>
元素的taskAffinity
属性)。