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 ツールがコードを—データとリソース ファイルと共に、 26—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— 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たとえば、画面がオフになった、バッテリ残量が低い、写真が撮影されたなど、システムに起因するブロードキャストはたくさんあります。アプリでもブロードキャストを開始でき、たとえば他のアプリに、一部のデータが端末にダウンロードされ、利用可能になったことを伝えることもできます。— 149 150— 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>と呼ばれる非同期メッセージによってアクティベートされます。コンポーネントがアプリに属していても他のものに属していても、インテントにより実行時に個別のコンポーネントがお互いに結び付けられます(他のコンポーネントからのアクションを要求するメッセンジャーのようなものです)。—— 192 193 194 195</p> 196 197<p>インテントは {@link android.content.Intent} オブジェクトを使用して作成されます。このオブジェクトは特定のコンポーネントや特定の<em>タイプ</em>のコンポーネントをアクティベートするようにメッセージを定義します。インテントはそれぞれ明示的、暗黙的のいずれかになります。— 198 199</p> 200 201<p>アクティビティとサービスでは、インテントが実行するアクション(「閲覧」したり「送信」したりする)を定義し、操作に使うデータ(特に、開始されるコンポーネントが知っておく必要があるデータ)の URI を指定することもできます。 202 203たとえば、インテントはアクティビティに画像を表示したり、ウェブページを開いたりするアクティビティに対して要求を伝達します。 204場合によっては、結果を受け取るアクティビティを開始でき、この場合にアクティビティが返す結果も {@link android.content.Intent} になります(たとえば、ユーザーが個人の連絡先を取り出し、それを返してくれるインテントを発行できます。返されたインテントには選択された連絡先を指す URI が含まれています)。 205— 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<?xml version="1.0" encoding="utf-8"?> 275<manifest ... > 276 <application android:icon="@drawable/app_icon.png" ... > 277 <activity android:name="com.example.project.ExampleActivity" 278 android:label="@string/example_label" ... > 279 </activity> 280 ... 281 </application> 282</manifest></pre> 283 284<p><code><a 285href="{@docRoot}guide/topics/manifest/application-element.html"><application></a></code> 要素では、{@code android:icon} 属性でアプリを特定するアイコンのリソースを指します。 286 287</p> 288 289<p><code><a 290href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></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"><activity></a></code> アクティビティ用の要素 299</li> 300 <li><code><a 301href="{@docRoot}guide/topics/manifest/service-element.html"><service></a></code> サービス用の要素 302</li> 303 <li><code><a 304href="{@docRoot}guide/topics/manifest/receiver-element.html"><receiver></a></code> ブロードキャスト レシーバー用の要素 305</li> 306 <li><code><a 307href="{@docRoot}guide/topics/manifest/provider-element.html"><provider></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<intent-filter>}</a> 要素を、コンポーネントを宣言している要素の子として追加することで、コンポーネントのインテント フィルタを宣言できます。 342</p> 343 344<p>たとえば、新規メールを作成するアクティビティを持つメールアプリをビルドした場合、次のように「送信」インテント(新規メールを送信するための)に応答するインテント フィルタを宣言できます。 345</p> 346<pre> 347<manifest ... > 348 ... 349 <application ... > 350 <activity android:name="com.example.project.ComposeEmailActivity"> 351 <intent-filter> 352 <action android:name="android.intent.action.SEND" /> 353 <data android:type="*/*" /> 354 <category android:name="android.intent.category.DEFAULT" /> 355 </intent-filter> 356 </activity> 357 </application> 358</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<manifest ... > 386 <uses-feature android:name="android.hardware.camera.any" 387 android:required="true" /> 388 <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" /> 389 ... 390</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 ファイルで定義する必要があります。— 410 411 412アプリのリソースを使用すると、コードを修正することなく別のリソースセットを提供することで、アプリのあらゆる特性を簡単にアップデートできるようになります。これにより、さまざまな端末の設定用(別の言語や画面サイズなど)にアプリを最適化できます。 413— 414— 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