1

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

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

<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" >
4

4 回答 4

3

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

当你声明你的activity、services、content provider和broadcast listener时,你可以通过以下三种方式指定组件类名(假设你的Android包是org.example.myapp

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

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

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

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

警告:

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

  • R使用您的 Android 包的名称从 Java 包中显式导入类
  • 使用appt命令行中的工具和--custom-package选项将R文件生成到主 Java 包中。(我链接到 eLinux,因为 Android 文档没有太多关于该工具的内容。但它是 Android SDK 的一部分)

虽然这似乎证明了这两个包名称是相关的,但这只是工具所采用的便利。遗憾的是,虽然该aapt工具允许为R类显式设置目标 Java 包,但 Eclipse 和 IntelliJ 都隐藏了该选项,这使得混淆更加彻底。

于 2013-03-28T03:35:18.210 回答
1

您只需简单地导入包。但是,如果我没记错的话,默认情况下不会看到其他包中的类。你必须包括

import <app-package>.R;

app-package 是应用程序包的名称。(不带括号)

还要确保您拥有的任何导入语句都引用了正确的项目 R 文件。

于 2013-03-28T03:01:52.760 回答
0

我认为不可能。你可以这样做,如果 package="com.example.pack2" 并且你想声明一个包 package="com.example.pack3" 的 Activity,你必须使用像 com.example.pack3 这样的完整路径。活动!

于 2013-03-28T03:03:09.443 回答
0

我在市场上有一个应用程序,里面有 5 个包,我只把里面有活动的包放在清单中,如果有帮助的话,我没有遇到任何问题

如果您要将您的应用程序放在 google play 上,它不会接受以 com.example 开头的包名称。

这是一个保留的包名

于 2013-03-28T03:28:58.437 回答