在一个Android应用程序中使用多个软件包的正确方法是什么?

如果有多个包,将所有名称放在manifest标签中是否正确,如下面的示例所示?

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.application"
    package="com.example.pack2"
    package="com.example.pack3"
    android:versionCode="1"
    android:versionName="1.0" >

最佳答案

清单中的Android包和您使用的类的Java包是独立的概念。为了方便起见,它们默认情况下是相同的。但是,它们可以完全不同且无关。

声明活动,服务,内容提供者和广播侦听器时,可以通过以下三种方式中的一种指定组件类名称(假设您的Android软件包为org.example.myapp


类别名称,即MyActivity。操作系统将假定您的类位于与您的Android包同名的Java包中,并将其解析为完全限定的类名,即org.example.myapp.MyActivity。请注意,这种形式等效于.MainActivity,这是一个...
相对类别名称,即.ui.MyActivity。操作系统将假定您的类位于与Java包同名的Java包内的Java包中,并将其解析为完全限定的类名,即org.example.myapp.ui.MyActivity。注意前导.,这一点很重要!否则你会陷入...
完全合格,即com.android.example.myapp.MyActivity。操作系统将使用它作为需要加载的类的确切名称,而将忽略Android包的名称。


Android软件包名称和Java软件包名称之间的混淆是由于对两个独立的概念使用了相同的术语。 ComponentName的文档并没有使它更容易,因为它将其两个组件称为packageclass,而它们实际上是Android packageJava class(可以接受上述三个变体中的任何一个)。

有了更长的序言,您问题的答案就很简单了:

您不能在清单中声明多个包。但是,您也不需要。实际上,就操作系统而言,Android包名称就是您的应用程序的标识,仅此而已。您可以在代码中使用任何Java包。

警告:

默认情况下,自动生成的包含所有资源标识符的R类是在与Android包同名的Java包中生成的。因此,如果您的Android软件包名称和Java软件包名称不同,则有两个选择:


用您的Android包的名称从Java包中显式导入R
使用命令行中的appt工具和--custom-package选项将R文件生成到您的主要Java包中。 (我链接到eLinux,因为Android文档对该工具的了解不多。但这是Android SDK的一部分)


尽管这似乎可以证明两个软件包名称之间存在关联,但工具仍然只是出于方便而已。遗憾的是,尽管aapt工具允许显式设置R类的目标Java包,但是Eclipse和IntelliJ都隐藏了该选项,这使得混乱更加完整。

10-07 19:57
查看更多