AndroidManifest.xmlファイル
AndroidManifest.xmlは[※1] 全てのアプリケーションに必須のファイルです。これはアプリケーションのルートディレクトリに配置され、アプリケーションのコンポーネント(アクティビティやサービスなど)などについて、それらがどのような挙動を行いどのような情報を公開し、どのようなデータを処理出来、またはどのようにしてそれらを起動するかという情報です[※2] 。のパッケージに関するグローバルな情報を保持します。
このファイルに関する重要な視点として、中に含まれるIntentフィルタ情報があります。ここではいつ、どこでアクティビティを開始できるかという情報が記述されます。アクティビティやOSがWebページを開いたり連絡先リストからの選択画面を表示しようとしたりする際に、Intentオブジェクトを生成します。この中には、何をしたいか、どのデータに対して処理をしたいか[※3] 、データの種類、その他の情報が含まれます。Android側ではIntentオブジェクト内の情報を、全てのアプリケーションから公開されているIntentフィルタの情報と照合し、呼び出し元から指定されたデータ処理などに最も敵後鬱したものを探し出します。この点についての更なる詳細はIntentのリファレンスページを参照下さい。
アクティビティ、Content Provider、サービス、Intentレシーバといった宣言情報以外にも、AndroidManifest.xmlにはセキュリティ制御やテストのための許可情報を盛り込むことが出来ます。これらのタグとそれらの持ち得る属性についてはAndroidManifestをご覧下さい。
単純なAndroidManifest.xmlファイルの例を示します:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my_domain.app.helloactivity">
<application android:label="@string/app_name">
<activity class=".HelloActivity">
<intent-filter>
<action android:value="android.intent.action.MAIN"/>
<category android:value="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
この中で、以下のような注意点があります
- ほぼ全てのAndroidManifest.xmlでは、他の多くのAndroid用XMLファイルと同様、最初の要素に以下の名前空間宣言を付ける必要があります。xmlns:android="http://schemas.android.com/apk/res/android" これにより、このファイルを記述するのに欠かせない様々なAndroidの標準的属性をファイル内で利用することが出来るようになります。
- ほとんどのマニフェストファイルは、パッケージ内に存在するアプリケーションレベルのコンポーネントを定義する、単一の<application>要素を含みます。
- プログラムランチャからアクセス可能なパッケージとするためには[※4] 、ここに挙げた例のように少なくとも一つの、MAINアクションとLAUNCHERカテゴリを持つActivityコンポーネントを含む必要があります。
以下に、もう少し詳細なAndroidManifest.xmlファイルの概要として、利用可能なタグ一覧を示します。
- <manifest>
- パッケージに関する全情報を提供する、ファイルのルートノードです。この中には以下のものを配置出来ます。
- <uses-permission>
- パッケージが正常に動作するために、ユーザに対して求める必要のある許可情報です。許可情報については、セキュリティモデルドキュメントに詳細があります。マニフェストファイルには、必ずしもこのタグを含む必要はありません。
- <permission>
- 他のどのアプリケーションが、どのパッケージのどのような機能やコンポーネントにアクセス出来るかを定めます。許可情報については、Security Modelドキュメントに詳細があります。マニフェストファイルには、必ずしもこのタグを含む必要はありません。
- <instrumentation>
- このパッケージ、あるいは他のパッケージの動作を検証するための手順コンポーネント[※5] を定義することが出来ます。Instrumentationのページに詳細があります。マニフェストファイルには、必ずしもこのタグを含む必要はありません。
- <application>
- パッケージに含まれる、アプリケーションレベルのコンポーネント宣言を行うルート要素です。また、この要素にはグローバルあるいはアプリケーションの、または両方のためのラベル、アイコン、テーマ、必要な許可情報といった属性を指定することが出来ます。マニフェストファイルにはこれらのうち、0あるいは1つの要素を含むことが出来ます。この中では、必要に応じて以下のコンポーネント宣言を盛り込むことが出来ます。
- <activity>
- Activityとはアプリケーションがユーザとのインタラクションを行うための主要な要素です。ユーザがアプリケーションを実行した際に最初に表示されるものはアクティビティで、他の画面についてもほとんどの場合それぞれが独立して宣言されたアクティビティタグとなります。
Note: パッケージ内で使うか、公開するかに関わらず、全てのアクティビティはマニフェストファイル内に<activity>タグとして記述される必要があります。アクティビティにマッチするタグが存在しない場合は、当該アクティビティの実行は出来ません。
ただし実行時にアクティビティを探し出して利用する場合には、一つ以上の<intent-filter>要素により、それらのアクティビティがサポートするアクションについて記述しておくことが出来ます。
- <intent-filter>
- IntentFilterの形式にて、コンポーネントがサポートするIntentの値を宣言します。この要素の下にぶら下げることの出来る様々な値に加え、ユニークなラベル、アイコンといったアクションに必要な属性を指定することも出来ます[※6] 。
- <action>
- コンポーネントがサポートするIntent actionです。
- <category>
- コンポーネントがサポートするIntent categoryです。
- <type>
- コンポーネントがサポートするIntent data MIME typeです。
- <scheme>
- コンポーネントがサポートするIntent data URI schemeです。
- <authority>
- コンポーネントがサポートするIntent data URI authorityです。
- <path>
- コンポーネントがサポートするIntent data URI pathです。
- <receiver>
- IntentReceiverにより、アプリケーションが動作中か否かに関わらず、データの変更やアクションの発生通知を受けることが出来ます。アクティビティタグにより、レシーバがサポートする<intent-filter>を含むことも出来ます。詳細はアクティビティの<intent-filter>解説をご覧下さい。
- <service>
- Serviceは、バックグラウンドで走らせ続けることの出来るコンポーネントです。アクティビティタグにより、レシーバがサポートする一つ以上の<intent-filter>を含むことが出来ます。詳細はアクティビティの<intent-filter>解説をご覧下さい。
- <provider>
- ContentProviderは永続的データの管理と、それを他のアプリケーションからアクセス出来るようにするためのコンポーネントです。
- [※1]スコープ的にグローバル? system-wideの意味?要検討
- [※2]嘘っぽい
- [※3]want to do it toの訳が微妙
- [※4]情報が欠落していないか
- [※5]ユニットテスト時のテストクラスのイメージ、違うかも
- [※6]例を交えたほうが分かり易そう