如何使用多个包名?

时间:2013-03-28 02:51:37

标签: android package android-manifest

在一个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 个答案:

答案 0 :(得分:3)

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

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

  • 班级名称,即MyActivity。操作系统将假设您的类与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的文档并没有让它变得更容易,因为它将其称为packageclass两个组件,而它们实际上是Android packageJava class(其中)上述三种变体中的任何一种均可接受。)

使用更长的序言,您的问题的答案很简单:

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

警告:

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

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

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

答案 1 :(得分:1)

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

import <app-package>.R;

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

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

答案 2 :(得分:0)

我认为不可能。你可以这样做,如果package =“com.example.pack2”并且你想要声明一个包,它是包package =“com.example.pack3”,你必须使用完整路径 比如com.example.pack3.Activity!

答案 3 :(得分:0)

我在市场上有一个应用程序,其中包含5个软件包,我只将带有活动的软件包放入清单中,如果有帮助,我没有遇到任何问题

如果你要把你的应用放在Google Play上,它就不会接受以...开头的软件包名称     com。示例

这是一个保留包名称