Reputation: 9351
What is the correct way to use more than one package in one Android application?
If there is more than one package, is it correct to put all the names in the manifest tag, like in the example below?
<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" >
Upvotes: 2
Views: 2503
Reputation: 75982
The Android package in the manifest and the Java packages of the classes you use are separate concepts. They happen to be the same by default, for convenience. However, they can be completely different and unrelated.
When you declare your activities, services, content provider, and broadcast listener, you can specify the component class name in on of the following three ways (assuming your Android package is org.example.myapp
)
MyActivity
. The OS will assume your class is in Java package that has the same name as your Android package, and will resolve it to a fully qualified class name as org.example.myapp.MyActivity
. Note, this form is equivalent to .MainActivity
, which is a....ui.MyActivity
. The OS will assume your class is in Java package that is inside of a Java package with the same name as your Android package, and will resolve it to a fully qualified class name as org.example.myapp.ui.MyActivity
. Note the leading .
, it is important! Otherwise you'll fall through to...com.android.example.myapp.MyActivity
. The OS will use this as the exact name of the class it needs to load, and will ignore the Android package name.The confusion between Android package name and Java package name is due to using the same term for two independent concepts. The documentation for ComponentName
does not make it any easier, as it calls its two components package
and class
, whereas they are really Android package
and Java class
(where any of the three variants above are acceptable).
With that longer preamble, the answer to your question is simple:
You can't declare more than one packages in the manifest. However, you also don't need to. The Android package name is in reality the identity of your application as far as the OS is concerned, and nothing more. You can use any Java packages in your code.
Warning:
The auto-generated R
class that contains the identifiers for all your resources is generated by default in a Java package with the same name as your Android package. Therefore, if your Android package name and your Java package name are different, you have two options:
R
class from the Java package with the name of your Android packageappt
tool from the command line and the --custom-package
option to generate the R
file into your main Java package. (I am linking to eLinux, because the Android documentation does not have much about the tool. But it is part of the Android SDK)While this might seem as a proof that the two package names are relate, it's again mere convenience adopted by the tools. Sadly, while the aapt
tool allows explicit setting of the target Java package for the R
class, both Eclipse and IntelliJ hide that option, which makes the confusion more complete.
Upvotes: 3
Reputation: 7104
i got an app on the market with 5 packages in it and i only put the package with the activitys in it in the manifest and i havent gotten any problems with it if that helps any
and if your going to put your app on google play it wont accept package names starting with com.example.
that is a reserved package name
Upvotes: 0
Reputation: 1
I think it can not be. You can do like this ,if package="com.example.pack2" and you want to declare a Activity which is the package package="com.example.pack3" ,you must use a full path like com.example.pack3.Activity!
Upvotes: 0
Reputation: 171
You would just simply import the package. However, if I remember correctly, the classes in the other packages would not be seen by default. You will have to include
import <app-package>.R;
with app-package being the name of the application package. (without the brackets)
Also make sure that any import statements you have refers to the correct projects R file.
Upvotes: 1