(或者是“包裹名称”吗?)
从一个应用程序切换到另一个应用程序的一种方法是获取该应用程序的启动意图,这可以使用(给定一些context
)来完成:
PackageManager manager = context.getPackageManager();
Intent intent = manager.getLaunchIntentForPackage(packageName);
请注意,参数的名称称为packageName
,即使方法名称也提到了“包”。但是,这不是软件包的名称!这是我们应该在这里使用的应用程序ID!
例如,如果我有一个调试构建类型,而不是发布应用程序ID com.example
,则有一个调试后缀,例如它是com.example.debug
,我必须使用"com.example.debug"
作为getLaunchIntentForPackage
的参数。但是应用程序的程序包名称空间保持不变(by default):它仍然是com.example
!如果我没有安装非调试应用程序,则由于未安装应用程序ID getLaunchIntentForPackage
,null
方法将返回com.example
。
那我在这里看什么?我认为com.example
是我的软件包名称,而com.example.debug
是我的应用程序ID。但是,为什么PackageManager#getLaunchIntentForPackage方法提到“程序包”和“程序包名称”,却又认为应该提到“应用程序ID”呢?
这只是Android SDK中名称错误的方法,还是我误会了什么?
我的问题基于以下信息。
每个Android应用程序都有一个唯一的应用程序ID,看起来像Java包名称,例如 com.example.myapp 。此ID在设备和Google Play商店中唯一标识您的应用。如果您要上传新版本的应用,则应用ID(和certificate you sign it with)必须与原始APK相同。如果更改应用ID,Google Play商店会将APK视为完全不同的APK应用程式。因此,一旦发布您的应用程序,就永远不要更改应用程序ID 。
[...]
在Android Studio中创建新项目时,
applicationId
与您在设置过程中选择的Java样式包名称完全匹配。但是,应用程序ID和程序包名称在此之后是彼此独立的。您可以更改代码的程序包名称(您的代码名称空间),它不会影响应用程序ID,反之亦然(不过,再次,发布应用程序后,您不应更改应用程序ID)。但是,更改程序包名称还会带来其他后果,因此请参见关于modifying the package name的部分。
因此,应用程序ID可以唯一标识您在Play商店中的应用程序。程序包名称是应用程序代码库中子程序包和类的名称空间。到目前为止一切顺利,我明白了。
但是,在本文档页面的末尾,我们有以下更令人困惑的亮点:
还有一点要知道:尽管清单
package
和GradleapplicationId
的名称可能不同,但是构建工具会将应用程序ID复制到APK的最终清单文件在构建的末尾。因此,如果在构建后检查AndroidManifest.xml
文件,请不要惊讶package
属性已更改。package
属性是Google Play商店和Android平台实际用来标识您的应用的位置;因此,一旦构建使用原始值(为R
类命名空间并解析清单类名称),它将丢弃该值并将其替换为应用程序ID。
所以我们在一页上有多个矛盾!
从这一亮点开始,至少有关构建工具被应用程序覆盖程序包名称的声明似乎是不正确的,因为:
在应用程序com.example.MainActivity
中为活动com.example.debug
创建意图时,我必须指定com.example.debug
作为应用程序ID,并指定com.example.MainActivity
作为组件名称。在运行时,组件名称尚未将其程序包名称更改为应用程序ID,因此似乎构建工具未更改程序包名称空间吗?
...某人可以使用各种示例创建一个不错的答案,这些示例显示应用程序ID和程序包(名称)何时相同或不相同,以及Android系统和Google Play实际在何处使用。还请考虑一个具有库依赖关系的示例:据我所知,库的程序包名称空间没有改变,但是它以您的应用程序ID运行,对吗?
答案 0 :(得分:2)
我们在这里讨论的是android:package
中的<manifest>
属性。它以前被称为“程序包名称”,在某些较早的文档中仍被称为“程序包名称”。即使它看起来很像,它也不是Java包名称,并且与源代码中的Java包名称无关。
最近将此属性称为“应用程序ID”,尤其是在与Firebase,Play商店等相关的文档中。
是同一回事。 “程序包名称”是“应用程序ID”。
请参阅https://developer.android.com/guide/topics/manifest/manifest-element.html#package
注意:
在一个地方,事情可能会引起混乱,这就是清单中组件名称的简写形式。例如:
<activity
android:name=".ui.activities.MainActivity">
</activity>
在这种情况下,android:name
属性指定“ Activity
的标准Java类名称”。但是,如果名称以句点开头(如本例所示),则应用程序的“程序包名称”(来自android:package
标签的<manifest>
属性)将被添加到要形成的类的名称之前Activity
的标准Java类名称。
如果您遇到android:package
属性针对不同的构建版本而更改的情况(例如,在包名称中使用debug
的示例中),则请勿将速记符号用于清单中的组件名称!您应始终使用完全限定名称,如下所示:
<activity
android:name="com.mycompany.mypackage.ui.activities.MainActivity">
</activity>