マニフェスト内の Android パッケージと、使用するクラスの Java パッケージは別の概念です。便宜上、これらはたまたまデフォルトで同じになっています。ただし、それらは完全に異なり、無関係である可能性があります。
org.example.myapp
アクティビティ、サービス、コンテンツ プロバイダー、およびブロードキャスト リスナーを宣言するときに、次の 3 つの方法のいずれかでコンポーネント クラス名を指定できます(Android パッケージが .
- クラス名、つまり
MyActivity
. OS は、クラスが Android パッケージと同じ名前の Java パッケージにあると想定し、完全修飾クラス名に解決しorg.example.myapp.MyActivity
ます。この形式は と同等であることに注意してください.MainActivity
...
- 相対クラス名、つまり
.ui.MyActivity
. OS は、クラスが Android パッケージと同じ名前の Java パッケージ内にある Java パッケージ内にあると想定し、. として完全修飾クラス名に解決しorg.example.myapp.ui.MyActivity
ます。先頭.
に注意してください。重要です。そうしないと、失敗します...
- 完全修飾、つまり
com.android.example.myapp.MyActivity
. OS はこれをロードする必要があるクラスの正確な名前として使用し、Android パッケージ名を無視します。
Android パッケージ名と Java パッケージ名が混同されているのは、2 つの独立した概念に同じ用語を使用しているためです。のドキュメントでは、その 2 つのコンポーネントを and とComponentName
呼んでいるため、簡単にはなりませんが、実際にはandです (上記の 3 つのバリアントのいずれかが受け入れられます)。package
class
Android package
Java class
前文が長くなったので、質問への答えは簡単です。
マニフェストで複数のパッケージを宣言することはできません。ただし、その必要もありません。Android パッケージ名は、OS に関する限り、実際にはアプリケーションの ID であり、それ以上のものではありません。コードでは任意の Java パッケージを使用できます。
警告:
すべてのリソースの識別子を含む自動生成されR
たクラスは、Android パッケージと同じ名前の Java パッケージにデフォルトで生成されます。したがって、Android パッケージ名と Java パッケージ名が異なる場合は、次の 2 つのオプションがあります。
R
Android パッケージの名前を使用して、Java パッケージからクラスを明示的にインポートします。
appt
コマンド ラインからツールを使用し、--custom-package
オプションを使用してR
ファイルをメインの Java パッケージに生成します。(Android のドキュメントにはこのツールに関する情報があまりないため、eLinux にリンクしています。しかし、これは Android SDK の一部です)
これは 2 つのパッケージ名が関連していることの証明のように思えるかもしれませんが、これも単なるツールの便宜上のものです。悲しいことに、このaapt
ツールではクラスのターゲット Java パッケージを明示的に設定できますが、R
Eclipse と IntelliJ の両方がそのオプションを隠しているため、混乱がより完全になります。