• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=アプリケーションの基礎
2@jd:body
3
4<div id="qv-wrapper">
5<div id="qv">
6
7<h2>本書の内容</h2>
8<ol>
9<li><a href="#Components">アプリのコンポーネント</a>
10  <ol>
11    <li><a href="#ActivatingComponents">コンポーネントをアクティベートする</a></li>
12  </ol>
13</li>
14<li><a href="#Manifest">マニフェスト ファイル</a>
15  <ol>
16    <li><a href="#DeclaringComponents">コンポーネントを宣言する</a></li>
17    <li><a href="#DeclaringRequirements">アプリの要件を宣言する</a></li>
18  </ol>
19</li>
20<li><a href="#Resources">アプリのリソース</a></li>
21</ol>
22</div>
23</div>
24
25<p>Android アプリは Java プログラミング言語で記述されています。APKAndroid SDK ツールがコードを&mdash;データとリソース ファイルと共に、
26&mdash;APK  <i>(Android パッケージ)にコンパイルします。</i>これは、
27{@code .apk} という接尾語の付いたアーカイブ ファイルです。1 つの APK ファイルにはAndroid アプリのすべてのコンテンツが含まれており、Android 端末はアプリをインストールする際にこのファイルを使用します。
28</p>
29
30<p>端末にインストールすると、各 Android アプリはそれぞれのセキュリティ サンドボックス内で動作します。 </p>
31
32<ul>
33 <li>Android オペレーティング システムはマルチユーザーの Linux システムであり、各アプリが異なるユーザーになります。
34</li>
35
36<li>デフォルトで、システムは各アプリに一意の Linux ユーザー ID を割り当てます(ID はシステムのみが使用し、アプリは ID を関知しません)。
37アプリが割り当てられたユーザー ID のみがアプリ内のすべてのファイルにアクセスできるよう、システムがパーミッションを設定します。
38 </li>
39
40<li>各プロセスにはそれぞれ独自の仮想マシン(VM)があるため、アプリのコードは他のアプリとは分離して実行します。
41</li>
42
43<li>デフォルトで、すべてのアプリは独自の Linux プロセス上で実行します。Android はアプリのコンポーネントのいずれかを実行する必要があるときにプロセスを開始し、それが必要なくなったときや、システムが他のアプリ用にメモリを回復させる必要があるときにプロセスをシャットダウンします。
44
45</li>
46</ul>
47
48<p>このようにして、Android システムは<em>最小権限の原則</em>を実装しています。つまり、デフォルトでは各アプリにはコンポーネントの動作に必要な分だけのアクセス権が与えられます。
49
50これにより、パーミッションの与えられていないシステムの一部にアプリはアクセスできないという非常に安全性の高い環境が作り出されます。
51</p>
52
53<p>ただし、アプリが他のアプリとデータを共有したり、システムのサービスにアクセスしたりする方法もあります。
54</p>
55
56<ul>
57  <li>2 つのアプリで同一の Linux ユーザー ID を共有して、お互いのファイルにアクセスできるようにすることも可能です。
58システム リソースを節約するため、同じユーザー ID を持つアプリを同じ Linux プロセス上で実行し、同じ VM を共有するよう設定することもできます(アプリを同じ証明書で署名する必要があります)。
59
60</li>
61  <li>アプリから、ユーザーの連絡先、SMS メッセージ、マウント可能なストレージ(SD カード)、カメラ、Bluetooth といった端末データにアクセスするためのパーミッションを要求できます。
62アプリのすべてのパーミッションは、インストール時にユーザーから付与される必要があります。
63</li>
64</ul>
65
66<p>以上が、システム内の Android アプリの基本的な仕組みです。続いて、このドキュメントでは次の内容について説明します。
67</p>
68<ul>
69  <li>アプリを定義するコア フレームワーク コンポーネント。</li>
70  <li>コンポーネントを宣言し、アプリの端末機能に必要なマニフェスト ファイル。
71</li>
72  <li>アプリでさまざまな端末構成の動作を最適化できるようにする、アプリコードから分離されたリソース。
73</li>
74</ul>
75
76
77
78<h2 id="Components">アプリのコンポーネント</h2>
79
80<p>アプリのコンポーネントは、Android アプリに不可欠な構成要素です。各コンポーネントは、システムがアプリにアクセスするためのさまざまなエントリ ポイントになります。すべてのコンポーネントがユーザーの実際のエントリ ポイントになるわけではなく、中にはお互いに依存関係にあるものもありますが、それぞれが独自のエンティティとして存在し、特定の役割を担っています。各コンポーネントはアプリの全体的な動作を定義する固有の構成要素となっています。
81
82
83&mdash;
84</p>
85
86<p>アプリのコンポーネントには、4 つのタイプがあります。それぞれのタイプは、まったく異なる目的を果たし、コンポーネントの作成や破棄方法を定義するライフサイクルもそれぞれ異なります。
87</p>
88
89<p>アプリのコンポーネントのタイプは次の 4 つです。</p>
90
91<dl>
92
93<dt><b>アクティビティ</b></dt>
94
95<dd>アクティビティ <i>は</i> 1 つのユーザー インターフェースで 1 つの画面を表すものです。たとえば、メール アプリには新着メールの一覧を表示する 1 つのアクティビティと、メールを作成するアクティビティ、メールを閲覧するアクティビティがそれぞれ別にあります。
96
97メールアプリでは、複数のアクティビティが一体となって結合したユーザー操作を実現しますが、それぞれは他のものから独立しています。
98
99それにより、別のアプリで複数のアクティビティの中から、1 つのアクティビティを開始できるようになります(メールアプリが許可している場合)。
100たとえば、カメラアプリでは写真を他のユーザーと共有するために、メール アプリの新規メールを作成するアクティビティを開始できます。
101
102
103<p>アクティビティは {@link android.app.Activity} のサブクラスとして実装されます。詳細については、デベロッパー ガイドの「<a href="{@docRoot}guide/components/activities.html">Activities</a>」をご覧ください。
104
105</p>
106</dd>
107
108
109<dt><b>サービス</b></dt>
110
111<dd>サービス <i>は、</i> 長期間の操作やリモート プロセスを処理するためにバックグラウンドで実行するコンポーネントです。
112サービスは、ユーザー インターフェースを提供しません。
113たとえば、サービスはユーザーが別のアプリを使用している間にバックグラウンドで音楽を再生したり、ユーザーが別のアクティビティを操作している間にそれを妨げることなくネットワークからデータを取得したりします。
114
115アクティビティなどの別のコンポーネントは、サービスを開始して実行したり、それをバインドしたりして操作することもできます。
116
117
118<p>サービスは {@link android.app.Service} のサブクラスとして実装されます。詳細については、デベロッパー ガイドの「<a href="{@docRoot}guide/components/services.html">サービス</a>」をご覧ください。
119
120</p>
121</dd>
122
123
124<dt><b>コンテンツ プロバイダ</b></dt>
125
126<dd>コンテンツ プロバイダ <i>は</i> 共有されているアプリデータを管理します。データは、ファイル システム、SQLite データベース、ウェブ、アプリがアクセスできる、あらゆる永続性のストレージに保存できます。
127
128コンテンツ プロバイダを介して、他のアプリがデータをクエリしたり、修正したりすることもできます(コンテンツ プロバイダが許可している場合)。
129たとえば、Android システムではユーザーの連絡先情報を管理するコンテンツ プロバイダを提供しています。
130このように、適切なパーミッションさえあれば、アプリからコンテンツ プロバイダの一部({@link
131android.provider.ContactsContract.Data}など)に問い合わせて、特定の人物に関する情報を読み取ったり書き込んだりできます。
132
133
134<p>コンテンツ プロバイダは、アプリで非公開扱いの共有されていないデータを閲覧したり書き込んだりする場合にも役立ちます。
135たとえば、<a href="{@docRoot}resources/samples/NotePad/index.html">Note Pad</a> のサンプル アプリでは、コンテンツ プロバイダを使用してメモを保存します。
136</p>
137
138<p>コンテンツ プロバイダは {@link android.content.ContentProvider} のサブクラスとして実装され、他のアプリがトランザクションを実行できるようにする API の標準セットを実装する必要があります。
139
140詳細については、デベロッパー ガイドの「<a href="{@docRoot}guide/topics/providers/content-providers.html">Contetns Providers</a>」をご覧ください。
141</p>
142</dd>
143
144
145<dt><b>ブロードキャスト レシーバー</b></dt>
146
147<dd>ブロードキャスト レシーバー <i>は</i> システム全体のブロードキャスト アナウンスに応答するコンポーネントです。
148たとえば、画面がオフになった、バッテリ残量が低い、写真が撮影されたなど、システムに起因するブロードキャストはたくさんあります。アプリでもブロードキャストを開始でき、たとえば他のアプリに、一部のデータが端末にダウンロードされ、利用可能になったことを伝えることもできます。&mdash;
149
150&mdash;
151ブロードキャスト レシーバーがユーザー インターフェースを表示することはありませんが、<a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">ステータスバー通知を作成</a>して、ブロードキャスト イベントの発生時にユーザーに警告できます。
152
153一般的には、ブロードキャスト レシーバーは他のコンポーネントへの単なる「入り口」であり、最小限の操作を行うことが前提となっています。
154たとえば、イベントに基づいた何らかの作業を実行するサービスを開始する場合などに適しています。
155
156
157<p>ブロードキャスト レシーバーは、{@link android.content.BroadcastReceiver} のサブクラスとして実装され、各ブロードキャストは {@link android.content.Intent} オブジェクトとして配信されます。
158詳細については、{@link android.content.BroadcastReceiver} クラスをご覧ください。
159</p>
160</dd>
161
162</dl>
163
164
165
166<p>Android ならではのシステムデザインによって、どのアプリケーションからでも別のアプリケーションを開始できます。
167たとえば、ユーザーが端末のカメラで写真を撮影できるようにする場合、既にその機能を備えた別のアプリがあることを想定して、写真を撮影するアクティビティを自身で開発する代わりに、アプリがそれを使用できます。
168
169カメラアプリを組み込んだり、コードにリンクしたりする必要もなく、単純に写真を撮影するカメラアプリのアクティビティを開始するだけです。
170
171
172完了後、写真はアプリに戻り、それを使用することもできます。ユーザー側には、カメラがアプリの一部であるかのように見えます。
173</p>
174
175<p>システムがコンポーネントを開始すると、そのアプリのプロセスを開始し(まだ実行していない場合)、コンポーネントが必要とするクラスをインスタンス化します。
176たとえば、アプリで写真を撮影するカメラアプリのアクティビティを開始すると、そのアクティビティはアプリのプロセスではなく、カメラアプリのプロセスで実行します。そのため、他のシステムのアプリとは異なり、Android アプリのエントリ ポイントは 1 つではありません(たとえば、{@code main()} 関数はありません)。
177
178
179
180</p>
181
182<p>システムは、他のアプリへのアクセスを制限するファイル許可を使用して各アプリを別々のプロセスで実行するため、アプリから直接他のアプリのコンポーネントはアクティベートできませんが、Android システムはそれが可能です。
183
184そのため、他のアプリのコンポーネントをアクティベートするには、特定のコンポーネントを開始する<em>インテント</em>を指定するメッセージをシステムに配信する必要があります。
185
186その後、システムが代わりにコンポーネントをアクティベートします。</p>
187
188
189<h3 id="ActivatingComponents">コンポーネントをアクティベートする</h3>
190
191<p>4 つのコンポーネント タイプのなかで、アクティビティ、サービス、ブロードキャスト レシーバーの 3 つは、<em>インテント</em>と呼ばれる非同期メッセージによってアクティベートされます。コンポーネントがアプリに属していても他のものに属していても、インテントにより実行時に個別のコンポーネントがお互いに結び付けられます(他のコンポーネントからのアクションを要求するメッセンジャーのようなものです)。&mdash;&mdash;
192
193
194
195</p>
196
197<p>インテントは {@link android.content.Intent} オブジェクトを使用して作成されます。このオブジェクトは特定のコンポーネントや特定の<em>タイプ</em>のコンポーネントをアクティベートするようにメッセージを定義します。インテントはそれぞれ明示的、暗黙的のいずれかになります。&mdash;
198
199</p>
200
201<p>アクティビティとサービスでは、インテントが実行するアクション(「閲覧」したり「送信」したりする)を定義し、操作に使うデータ(特に、開始されるコンポーネントが知っておく必要があるデータ)の URI を指定することもできます。
202
203たとえば、インテントはアクティビティに画像を表示したり、ウェブページを開いたりするアクティビティに対して要求を伝達します。
204場合によっては、結果を受け取るアクティビティを開始でき、この場合にアクティビティが返す結果も {@link android.content.Intent} になります(たとえば、ユーザーが個人の連絡先を取り出し、それを返してくれるインテントを発行できます。返されたインテントには選択された連絡先を指す URI が含まれています)。
205&mdash;
206
207
208</p>
209
210<p>ブロードキャスト レシーバーの場合、インテントは単純にブロードキャストするアナウンスを定義します(たとえば、端末のバッテリ残量が少ないことを示すブロードキャストには、「バッテリが少ない」ことを示す既知のアクション文字列が含まれます)。
211
212</p>
213
214<p>他のコンポーネント タイプであるコンテンツ プロバイダは、インテントではアクティベートされず、{@link android.content.ContentResolver} からの要求の対象となったときにアクティベートされます。
215コンテンツリゾルバが、コンテンツプロバイダを使ってすべてのトランザクションを直接処理することで、プロバイダを使ってトランザクションを実行しているコンポーネントは処理する必要がなくなり、代わりに {@link
216android.content.ContentResolver} オブジェクトのメソッドを呼び出します。
217
218これによりコンテンツ プロバイダと情報を要求しているコンポーネントとの間に(セキュリティ目的で)抽象的な層ができます。
219</p>
220
221<p>各コンポーネント タイプのアクティベート用に、個別のメソッドが用意されています。</p>
222<ul>
223  <li>アクティビティを開始する(または新しい作業を与える)場合は、{@link android.content.Intent} を {@link android.content.Context#startActivity
224startActivity()} や {@link android.app.Activity#startActivityForResult startActivityForResult()} (アクティビティに結果を求める場合)に渡します。
225
226</li>
227  <li>サービスを開始する(または継続中のサービスに新しい指示を与える)には、{@link android.content.Intent} を {@link android.content.Context#startService
228startService()} に渡します。
229または、{@link android.content.Intent} を {@link android.content.Context#bindService bindService()} に渡してサービスにバインドできます。
230</li>
231  <li>ブロードキャストを開始するには、{@link android.content.Intent} を {@link android.content.Context#sendBroadcast(Intent) sendBroadcast()}、{@link
232android.content.Context#sendOrderedBroadcast(Intent, String) sendOrderedBroadcast()}、{@link
233android.content.Context#sendStickyBroadcast sendStickyBroadcast()} などのメソッドに渡します。
234</li>
235  <li>コンテンツ プロバイダへのクエリを実行するには、{@link android.content.ContentResolver} の {@link
236android.content.ContentProvider#query query()} を呼び出します。</li>
237</ul>
238
239<p>インテントの使用に関する詳細については、「<a href="{@docRoot}guide/components/intents-filters.html">インテントとインテント フィルタ</a>」のドキュメントをご覧ください。
240特定のコンポーネントのアクティベートの詳細については、
241<a href="{@docRoot}guide/components/activities.html">アクティビティ</a>、<a href="{@docRoot}guide/components/services.html">サービス</a>、{@link
242android.content.BroadcastReceiver}、<a href="{@docRoot}guide/topics/providers/content-providers.html">コンテンツ プロバイダ</a> のドキュメントでも説明しています。</p>
243
244
245<h2 id="Manifest">マニフェスト ファイル</h2>
246
247<p>Android システムがコンポーネントを開始する前に、システムはアプリの {@code AndroidManifest.xml} ファイル(「マニフェスト」ファイル)を読み取って、コンポーネントの存在を認識する必要があります。
248
249アプリはこのファイルですべてのコンポーネントを宣言し、このファイルはアプリ プロジェクトのディレクトリのルートに置く必要があります。
250</p>
251
252<p>マニフェストはアプリのコンポーネントを宣言する他にも、次のようにさまざまな役割があります。
253</p>
254<ul>
255  <li>インターネット アクセスや、ユーザーの連絡先への読み取りアクセスなど、アプリに必要なユーザー パーミッションを識別する。
256</li>
257  <li>アプリが使用する API に基づいた、アプリが必要とする最小 <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">API レベル</a>を宣言する。
258</li>
259  <li>カメラ、Bluetooth サービス、マルチタッチ スクリーンなど、アプリで使用されるか必要とされるハードウェア機能やソフトウェア機能を宣言する。
260</li>
261  <li><a href="http://code.google.com/android/add-ons/google-apis/maps-overview.html">Google マップ ライブラリ</a>など、アプリにリンクする必要のある API ライブラリ(Android フレームワーク API は除く)。
262
263</li>
264  <li>その他の役割</li>
265</ul>
266
267
268<h3 id="DeclaringComponents">コンポーネントを宣言する</h3>
269
270<p>マニフェストの主なタスクは、システムにアプリ コンポーネントに関する情報を与えることです。たとえば、マニフェスト ファイルではアクティビティを次のように宣言できます。
271 </p>
272
273<pre>
274&lt;?xml version="1.0" encoding="utf-8"?&gt;
275&lt;manifest ... &gt;
276    &lt;application android:icon="@drawable/app_icon.png" ... &gt;
277        &lt;activity android:name="com.example.project.ExampleActivity"
278                  android:label="@string/example_label" ... &gt;
279        &lt;/activity&gt;
280        ...
281    &lt;/application&gt;
282&lt;/manifest&gt;</pre>
283
284<p><code><a
285href="{@docRoot}guide/topics/manifest/application-element.html">&lt;application&gt;</a></code> 要素では、{@code android:icon} 属性でアプリを特定するアイコンのリソースを指します。
286
287</p>
288
289<p><code><a
290href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code> 要素では、{@code android:name} 属性で{@link
291android.app.Activity} サブクラスの完全修飾k裏スパイウェア名を指定し、{@code android:label} 属性でアクティビティのユーザーに表示するラベルとして使用する文字列を指定しています。
292
293</p>
294
295<p>すべてのアプリ コンポーネントは、次の方法で宣言する必要があります。</p>
296<ul>
297  <li><code><a
298href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code> アクティビティ用の要素
299</li>
300  <li><code><a
301href="{@docRoot}guide/topics/manifest/service-element.html">&lt;service&gt;</a></code> サービス用の要素
302</li>
303  <li><code><a
304href="{@docRoot}guide/topics/manifest/receiver-element.html">&lt;receiver&gt;</a></code> ブロードキャスト レシーバー用の要素
305</li>
306  <li><code><a
307href="{@docRoot}guide/topics/manifest/provider-element.html">&lt;provider&gt;</a></code> コンテンツ プロバイダ用の要素
308</li>
309</ul>
310
311<p>ソースに含まれていながら、マニフェスト ファイルでは定義されていないアクティビティ、サービス、コンテンツ プロバイダはシステムには見えないため、実行されることはありません。
312ただし、ブロードキャスト レシーバーはマニフェストで宣言するか、コードで動的に作成({@link android.content.BroadcastReceiver} オブジェクトとして)して {@link android.content.Context#registerReceiver registerReceiver()} を呼び出すことでシステムに登録できます。
313
314
315
316</p>
317
318<p>アプリのマニフェスト ファイルの構築方法の詳細については、「<a href="{@docRoot}guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml File</a>」のドキュメントをご覧ください。
319 </p>
320
321
322
323<h3 id="DeclaringComponentCapabilities">コンポーネントの機能を宣言する</h3>
324
325<p><a href="#ActivatingComponents">コンポーネントをアクティベートする</a>で説明したように、{@link android.content.Intent} を使用してアクティビティ、サービス、ブロードキャスト レシーバーを開始できます。
326開始するには、インテントでターゲットのコンポーネントの名前を(コンポーネントのクラス名を使って)明示的に指定する必要があります。
327ただし、インテントの本来の能力は、<em>暗黙的インテント</em>の概念にあります。
328暗黙的インテントは、単に実行するアクションのタイプを記述し(どのデータ上でアクションを実行するかも任意で記述できます)、それによりシステムがそのアクションを実行できる端末上のコンポーネントを見つけて開始できます。
329
330
331インテントで記述されたアクションを実行できるコンポーネントが複数ある場合は、使用するコンポーネントを 1 つ選択できます。
332</p>
333
334<p>システムは、端末の他のアプリのマニフェスト ファイルに提供されたインテント フィルタが受け取った
335 <i>インテントを比較して、</i> インテントに応答できるコンポーネントを識別します。
336</p>
337
338<p>アプリのマニフェストでアクティビティを宣言するとき、任意でアクティビティの機能を宣言するインテント フィルタを含めて、他のアプリからのインテントに応答できるようにできます。
339
340<a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code
341&lt;intent-filter&gt;}</a> 要素を、コンポーネントを宣言している要素の子として追加することで、コンポーネントのインテント フィルタを宣言できます。
342</p>
343
344<p>たとえば、新規メールを作成するアクティビティを持つメールアプリをビルドした場合、次のように「送信」インテント(新規メールを送信するための)に応答するインテント フィルタを宣言できます。
345</p>
346<pre>
347&lt;manifest ... >
348    ...
349    &lt;application ... &gt;
350        &lt;activity android:name="com.example.project.ComposeEmailActivity">
351            &lt;intent-filter>
352                &lt;action android:name="android.intent.action.SEND" />
353                &lt;data android:type="*/*" />
354                &lt;category android:name="android.intent.category.DEFAULT" />
355            &lt;/intent-filter>
356        &lt;/activity>
357    &lt;/application&gt;
358&lt;/manifest>
359</pre>
360
361<p>次に、別のアプリが {@link
362android.content.Intent#ACTION_SEND} アクションを持つインテントを作成し、{@link android.app.Activity#startActivity
363startActivity()} に渡す場合、ユーザーがメールを下書きして送信できるよう、システムがアクティビティを開始する場合があります。
364</p>
365
366<p>インテント フィルタの作成の詳細については、「<a href="{@docRoot}guide/components/intents-filters.html">インテントとインテント フィルタ</a>」のドキュメントをご覧ください。
367</p>
368
369
370
371<h3 id="DeclaringRequirements">アプリの要件を宣言する</h3>
372
373<p>Android が搭載された端末は数多くありますが、すべての端末が同じ機能や性能を備えているわけではありません。
374アプリに必要な機能を搭載していない端末にアプリをインストールしてしまわないよう、アプリがサポートする端末のタイプについてプロファイルで明確に定義し、マニフェスト ファイルで端末の要件やソフトウェア要件を宣言しておくことが重要です。
375
376
377これらの宣言のほとんどはただの情報で、システムがそれを読み取ることはありませんが、Google Play などの外部サービスはそれを読み取って、ユーザーが端末からアプリを検索したときにフィルタを提供します。
378
379</p>
380
381<p>たとえば、アプリでカメラを使用する必要があり、Android 2.1 で採用された API(<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">API レベル</a> 7)を使用する場合、次のようにマニフェスト ファイルでそれを要件として宣言する必要があります。
382</p>
383
384<pre>
385&lt;manifest ... >
386    &lt;uses-feature android:name="android.hardware.camera.any"
387                  android:required="true" />
388    &lt;uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" />
389    ...
390&lt;/manifest>
391</pre>
392
393<p>カメラの<em>ない</em>端末で、Android バージョンが 2.1 <em>以下</em>の場合は、Google Play からアプリをインストールできません。
394</p>
395
396<p>ただし、アプリでカメラを使用するが、それが<em>必須</em>ではないということを宣言することもできます。
397この場合、アプリで <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html#required">{@code required}</a> 属性を {@code "false"} に設定し、端末にカメラがあるかどうかを実行時に確認して、必要に応じてすべてのカメラ機能を無効にする必要があります。
398
399</p>
400
401<p>異なる端末でのアプリの互換性を管理する方法については、「<a href="{@docRoot}guide/practices/compatibility.html">Device Compatibility</a>」をご覧ください。
402
403</p>
404
405
406
407<h2 id="Resources">アプリのリソース</h2>
408
409<p>Android アプリは、コードだけで構成されているわけではありません。ソース コードから分離された画像、オーディオ ファイル、その他アプリの外観に関連するあらゆるリソースが必要です。たとえば、アクティビティのアニメーション、メニュー、スタイル、色、レイアウトなどを XML ファイルで定義する必要があります。&mdash;
410
411
412アプリのリソースを使用すると、コードを修正することなく別のリソースセットを提供することで、アプリのあらゆる特性を簡単にアップデートできるようになります。これにより、さまざまな端末の設定用(別の言語や画面サイズなど)にアプリを最適化できます。
413&mdash;
414&mdash;
415</p>
416
417<p>Android プロジェクトに含めるすべてのリソースに対し、SDK ビルド ツールが一意の整数 ID を定義し、アプリコードや XML で定義された他のリソースからリソースにそれを使って参照できます。
418
419たとえば、アプリに {@code
420logo.png} という名前の画像ファイルがある場合({@code res/drawable/} ディレクトリ内に保存)、SDK ツールが {@code R.drawable.logo} という名前のリソース ID を生成し、これを使って画像を参照してユーザー インターフェースに挿入できます。
421
422</p>
423
424<p>リソースとソース コードを分離して提供する方法の最も重要な側面は、さまざまな端末設定に合わせて別のリソースを提供できるという点です。
425
426たとえば、XML で UI 文字列を定義することで、その文字列を他の言語に翻訳して、それらの文字列を別のファイルに保存しておくことができます。
427それを、リソースのディレクトリ名に付けた言語の<em>修飾子</em>(フランス語の文字列値なら {@code res/values-fr/} のように)とユーザーの言語設定に基づいて、Android システムによって UI に適切な言語の文字列が適用されます。
428
429
430</p>
431
432<p>Android では代替リソース用に多様な<em>修飾子</em>をサポートしています。修飾子は、リソースのディレクトリ名に含める短い文字列で、そのリソースを使用する端末構成を定義するものです。
433
434例をもう 1 つ挙げると、端末の画面の向きやサイズによって、アクティビティのレイアウトを複数作成する必要があります。
435
436たとえば、端末が縦方向(縦長)の場合、ボタンの付いたレイアウトを縦に並べ、端末が横方向(横長)の場合はボタンを横並びにする、といった場合です。
437
438画面の方向によってレイアウトを変更するには、2 つの異なるレイアウトを定義して、それぞれのレイアウトのディレクトリ名に適切な修飾子を適用します。
439
440そうすることで、現在の端末の向きによってシステムが自動的に適切なレイアウトを適用できます。
441</p>
442
443<p>アプリケーションに含めることのできるリソースの種類や、異なる端末設定用の代替リソースの作成方法については、「<a href="{@docRoot}guide/topics/resources/providing-resources.html">リソースの提供</a>」をご覧ください。
444</p>
445
446
447
448<div class="next-docs">
449<div class="col-6">
450  <h2 class="norule">こちらもご覧ください。</h2>
451  <dl>
452    <dt><a href="{@docRoot}guide/components/intents-filters.html">インテントとインテント フィルタ</a>
453    </dt>
454    <dd>{@link android.content.Intent} API を使用して、アクティビティやサービスなどのアプリのコンポーネントをアクティベートする方法や、アプリのコンポーネントを他のアプリで利用できるようにする方法について説明しています。
455
456</dd>
457    <dt><a href="{@docRoot}guide/components/activities.html">Activities</a></dt>
458    <dd>ユーザー インターフェースを使って独特のアプリケーション画面を提供する {@link android.app.Activity}
459 クラスのインスタンスの作成方法について説明しています。</dd>
460    <dt><a href="{@docRoot}guide/topics/resources/providing-resources.html">リソースの提供</a></dt>
461    <dd>特定の端末構成に対して代替リソースを提供する方法など、Android アプリでアプリのリソースをアプリコードから分離する仕組みについて説明しています。
462
463
464    </dd>
465  </dl>
466</div>
467<div class="col-6">
468  <h2 class="norule">関連ドキュメント</h2>
469  <dl>
470    <dt><a href="{@docRoot}guide/practices/compatibility.html">Device Compatibility</a></dt>
471    <dd>あらゆるタイプの端末での Android の動作と、端末ごとにアプリを最適化したり、別の端末でのアプリの利用を制限したりする方法について説明しています。
472
473</dd>
474    <dt><a href="{@docRoot}guide/topics/security/permissions.html">System Permissions</a></dt>
475    <dd>アプリが特定の API を使用するのにユーザーの同意を必要とするパーミッション システムを使用して、アプリから特定の API へのアクセスを Android が制限する仕組みについて説明しています。
476</dd>
477  </dl>
478</div>
479</div>
480
481