在一个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
的文档并没有使它更容易,因为它将其两个组件称为package
和class
,而它们实际上是Android package
和Java 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都隐藏了该选项,这使得混乱更加完整。