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. Инструменты Android SDK (Software Development Kit – комплект разработки программного обеспечения) компилируют 26написанный вами код — и все требуемые файлы данных и ресурсов — в файл APK – <i>программный пакет Android</i>, 27который представляет собой файл архива с расширением {@code .apk}. В файле APK находится все, что требуется для работы 28Android-приложения, и он позволяет установить приложение на любом устройстве под управлением системы Android.</p> 29 30<p>Каждое приложение Android, установленное на устройстве, работает в собственной "песочнице" (изолированной программной среде): </p> 31 32<ul> 33 <li>операционная система Android представляет собой многопользовательскую систему Linux, в которой каждое приложение является 34отдельным пользователем;</li> 35 36<li>по умолчанию система назначает каждому приложению уникальный идентификатор пользователя Linux (этот идентификатор используется только 37системой и неизвестен приложению); система устанавливает полномочия для всех файлов 38 в приложении, с тем чтобы доступ к ним был разрешен только пользователю с идентификатором, назначенным этому приложению; </li> 39 40<li>у каждого процесса имеется собственная виртуальная машина (ВМ), так что код приложения выполняется изолированно от 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>двум приложениям можно назначить один идентификатор пользователя Linux. В этом случае 58каждый из них сможет обращаться к файлам другого приложения. Для экономии ресурсов системы также можно 59сделать так, чтобы приложения с одинаковым идентификатором пользователя выполнялись в одном процессе Linux и использовали одну ВМ ( 60приложения также должны быть подписаны одним сертификатом);</li> 61 <li>приложение может запросить разрешение на доступ к данным устройства, например к контактам 62пользователя, SMS-сообщениям, подключаемой карте памяти (SD-карте), камере, Bluetooth и др. Все 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>Компоненты приложения можно отнести к одному из четырех типов. Компоненты каждого типа предназначены для определенной цели, 87они имеют собственный жизненный цикл, который определяет способ создания и прекращения существования компонента.</p> 88 89<p>Четыре типа компонентов:</p> 90 91<dl> 92 93<dt><b>Операции</b></dt> 94 95<dd>Операция (Activity) <i>представляет</i> собой один экран с пользовательским интерфейсом. Например, 96в приложении для работы с электронной почтой одна операция может служить для отображения списка новых 97сообщений, другая – для составления сообщения и третья операция – для чтения сообщений. Несмотря на то что 98операции совместно формируют связное взаимодействие пользователя с приложением по работе с электронной почтой, каждая из них 99не зависит от других операций. Любые из этих операций могут быть запущены 100другим приложением (если это позволяет приложение по работе с электронной почтой). Например, приложение для камеры может запустить 101операцию в приложении по работе с электронной почтой, которая составляет новое сообщение, чтобы пользователь мог отослать фотографию. 102 103<p>Операция относится к подклассу класса {@link android.app.Activity}. Подробные сведения об этом можно 104найти в руководстве для разработчиков в статье <a href="{@docRoot}guide/components/activities.html">Операции</a> 105.</p> 106</dd> 107 108 109<dt><b>Службы</b></dt> 110 111<dd>Служба (Service) <i>представляет</i> собой компонент, который работает в фоновом режиме и выполняет длительные 112операции, связанные с работой удаленных процессов. Служба 113не имеет пользовательского интерфейса. Например, она может воспроизводить музыку в фоновом режиме, пока 114пользователь работает в другом приложении, или же она может получать данные по сети, не 115блокируя взаимодействие пользователя с операцией. Служба может быть запущена другим компонентом, который затем будут взаимодействовать с ней, – например 116операцией. 117 118<p>Служба относится к подклассу класса {@link android.app.Service}. Подробные сведения об этом можно 119найти в руководстве для разработчиков в статье <a href="{@docRoot}guide/components/services.html">Службы</a> 120.</p> 121</dd> 122 123 124<dt><b>Поставщики контента</b></dt> 125 126<dd>Поставщик <i>контента (Content provider)</i> управляет общим набором данных приложения. Данные можно хранить в 127файловой системе, базе данных SQLite, в Интернете или любом другом постоянном месте хранения, к которому у вашего 128приложения имеется доступ. Посредством поставщика контента другие приложения могут запрашивать или даже изменять 129данные (если поставщик контента позволяет делать это). Например, в системе Android есть поставщик 130контента, который управляет информацией контактов пользователя. Любое приложение, получившее соответствующие 131разрешения, может запросить часть этого поставщика контента (например {@link 132android.provider.ContactsContract.Data}), для чтения и записи сведений об определенном человеке. 133 134<p>Поставщики контента также используются для чтения и записи данных, доступ к которым внешним компонентам 135приложение не предоставляет. Например, в образце приложения <a href="{@docRoot}resources/samples/NotePad/index.html">Note Pad</a> с помощью 136поставщика контента выполняется сохранение заметок.</p> 137 138<p>Поставщик контента относится к подклассу класса {@link android.content.ContentProvider}. 139Он должен реализовывать стандартный набор API-интерфейсов, с помощью которых другие приложения будут выполнять 140транзакции. Подробные сведения можно найти в руководстве для разработчиков в статье <a href="{@docRoot}guide/topics/providers/content-providers.html">Поставщики контента</a> 141.</p> 142</dd> 143 144 145<dt><b>Приемники широковещательных сообщений</b></dt> 146 147<dd>Приемник широковещательных сообщений (Broadcast receiver) <i>представляет</i> собой компонент, который реагирует на объявления 148распространяемые по всей системе. Многие из этих объявлений рассылает система — например объявление о том, 149что экран выключился, аккумулятор разряжен или был сделан фотоснимок. 150Объявления также могут рассылаться приложениями, — например, чтобы сообщить другим приложениям о том, что 151какие-то данные были загружены на устройство и теперь готовы для использования. Несмотря на то что приемники широковещательных сообщений 152не имеют пользовательского интерфейса, они могут<a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">создавать уведомления в строке состояния,</a> 153чтобы предупредить пользователя о событии "рассылка объявления". Однако чаще всего они являются 154просто "шлюзом" для других компонентов и предназначены для выполнения минимального объема работы. Например 155, они могут инициировать выполнение службой определенных действий при возникновении события. 156 157<p>Приемник широковещательных сообщений относится к подклассу класса {@link android.content.BroadcastReceiver} 158, а каждое такое сообщение предоставляется как объект {@link android.content.Intent}. Подробные сведения изложены 159в руководстве, посвященном классу {@link android.content.BroadcastReceiver}.</p> 160</dd> 161 162</dl> 163 164 165 166<p>Уникальной особенностью системы Android является то, что любое приложение может запустить компонент 167другого приложения. Например, если вы хотите дать пользователю возможность фотографировать, используя 168камеру устройства, то, поскольку наверняка имеется другое приложение, которое может выполнить это действие, вместо того чтобы разработать операцию фотографирования в своем приложении, вы можете вызвать 169такое приложение. Вам не 170нужно внедрять код из приложения для камеры или даже устанавливать на него ссылку. 171Вместо этого вы можете просто запустить операцию фотографирования 172 из приложения для камеры. По завершении этой операции фотография будет возвращена в ваше приложение, и ее можно будет использовать. Для пользователя 173 это будет выглядеть как одно приложение.</p> 174 175<p>Когда система запускает компонент, она запускает процесс для этого приложения (если 176он еще не был запущен) и создает экземпляры классов, которые требуются этому компоненту. Например, если ваше приложение 177запустит операцию фотографирования в приложении для камеры, эта операция 178будет выполняться в процессе, который относится к этому стороннему приложению, а не в процессе вашего приложения. 179Поэтому, в отличие от приложений для большинства других систем, в приложениях для Android отсутствует единая 180точка входа (например, в них нет функции {@code main()}).</p> 181 182<p>Поскольку система выполняет каждое приложение в отдельном процессе с такими правами доступа к файлам, которые 183ограничивают доступ в другие приложения, ваше приложение не может напрямую вызвать компонент из 184другого приложения. Это может сделать сама система Android. Поэтому, чтобы вызвать компонент в 185другом приложении, необходимо сообщить системе о своем намерении (<em>Intent</em>) 186запустить определенный компонент. После этого система активирует для вас этот компонент.</p> 187 188 189<h3 id="ActivatingComponents">Активация компонентов</h3> 190 191<p>Компоненты трех из четырех возможных типов — операции, службы и 192приемники широковещательных сообщений — активируются асинхронным сообщением, которое называется <em>Intent</em> (намерение). 193Объекты Intent связывают друг с другом отдельные компоненты во время выполнения, будь то это компоненты 194 вашего или стороннего приложения (эти объекты Intent можно представить себе 195в виде мессенджеров, которые посылают другим компонентам запрос на выполнение действий).</p> 196 197<p>Объект Intent создается с помощью объекта {@link android.content.Intent}, который описывает запрос на 198активацию либо конкретного компонента, либо компонента конкретного <em>типа</em> — соответственно, намерение Intent 199может быть явным или неявным.</p> 200 201<p>Для операций и служб Объект Intent определяет действие, которое требуется выполнить (например, просмотреть (view) или 202отправить (send) что-то), а также может указывать URI (Uniform Resource Identifier – унифицированный идентификатор ресурса) данных, с которыми это действие нужно выполнить (помимо прочих сведений, которые 203нужно знать запускаемому компоненту). Например, объект Intent может передавать запрос 204на выполнение операции "показать изображение" или "открыть веб-страницу". В некоторых ситуациях операцию можно 205запустить, чтобы получить результат. В этом случае операция возвращает 206результат также в виде объекта {@link android.content.Intent} (например, можно отправить сообщение Intent, чтобы дать 207пользователю возможность выбрать контакт и вернуть его вам — в ответном сообщении Intent будет содержаться 208URI, указывающий на выбранный контакт).</p> 209 210<p>Для приемников широковещательных сообщений Intent просто определяет 211передаваемое объявление (например, широковещательное сообщение о низком уровне заряда аккумулятора 212содержит только строку "аккумулятор разряжен").</p> 213 214<p>Компоненты четвертого типа – поставщики контента – сообщениями Intent не активируются. Они 215активируются по запросу от {@link android.content.ContentResolver}. Процедура определения 216 контента (content resolver) обрабатывает все прямые транзакции с поставщиком контента, с тем чтобы этого не пришлось делать компоненту, который 217выполняет транзакции с поставщиком. Вместо этого он вызывает методы для объекта {@link 218android.content.ContentResolver}. Это формирует слой, абстрагирующий (в целях безопасности) поставщика 219контента от компонента, запрашивающего информацию.</p> 220 221<p>Для активации компонентов каждого типа имеются отдельные методы:</p> 222<ul> 223 <li>Можно запустить операцию (или определить для нее какое-то новое действие), 224передав объект {@link android.content.Intent} методу {@link android.content.Context#startActivity 225startActivity()} или {@link android.app.Activity#startActivityForResult startActivityForResult()} 226(если требуется, чтобы операция вернула результат).</li> 227 <li>Можно запустить службу (либо выдать работающей службе новые инструкции), 228передав объект {@link android.content.Intent} методу {@link android.content.Context#startService 229startService()}. Либо можно установить привязку к службе, передав объект{@link android.content.Intent} методу 230{@link android.content.Context#bindService bindService()}.</li> 231 <li>Можно инициировать рассылку сообщений, передав объект {@link android.content.Intent} таким методам, как 232{@link android.content.Context#sendBroadcast(Intent) sendBroadcast()}, {@link 233android.content.Context#sendOrderedBroadcast(Intent, String) sendOrderedBroadcast()} и {@link 234android.content.Context#sendStickyBroadcast sendStickyBroadcast()}.</li> 235 <li>Можно выполнить запрос к поставщику контента, вызвав метод {@link 236android.content.ContentProvider#query query()} для объекта {@link android.content.ContentResolver}.</li> 237</ul> 238 239<p>Подробные сведения об использовании объектов Intent приведены в документе <a href="{@docRoot}guide/components/intents-filters.html">Объекты Intent и 240фильтры объектов Intent</a>. Более подробная информация об активации определенных компонентов также приведена 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 необходимо знать, что 248компонент существует. Для этого она читает файл {@code AndroidManifest.xml} приложения (файл 249манифеста). В этом файле, который должен находиться в корневой папке 250приложения, должны быть объявлены все компоненты приложения.</p> 251 252<p>Помимо объявления компонентов приложения, манифест служит и для других целей, 253среди которых:</p> 254<ul> 255 <li>указание всех полномочий пользователя, которые требуются приложению, например разрешения на доступ в Интернет или 256на чтение контактов пользователя;</li> 257 <li>объявление минимального<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">уровня API</a>, 258требуемого приложению, с учетом того, какие API-интерфейсы оно использует;</li> 259 <li>объявление аппаратных и программных функций, которые нужны приложению или используются им, например камеры, 260службы Bluetooth или сенсорного экрана;</li> 261 <li>указание библиотек API, с которыми необходимо связать приложение (отличные от API-интерфейсов платформы 262Android), например библиотеки <a href="http://code.google.com/android/add-ons/google-apis/maps-overview.html">Google Maps 263</a>;</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 android:icon} в элементе <code><a 285href="{@docRoot}guide/topics/manifest/application-element.html"><application></a></code> 286указывает на ресурсы для значка, который обозначает 287приложение.</p> 288 289<p>Атрибут {@code android:name} в элементе <code><a 290href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> 291указывает полное имя класса подкласса {@link 292android.app.Activity}, а атрибут {@code android:label} указывает строку, 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в манифесте, поэтому они не могут быть запущены. А вот 313приемники широковещательных сообщений 314можно либо объявить в манифесте, либо создать динамически в коде (как объекты 315{@link android.content.BroadcastReceiver}) и зарегистрировать в системе путем вызова 316{@link android.content.Context#registerReceiver registerReceiver()}.</p> 317 318<p>Подробные сведения о структуризации файла манифеста для приложения см. в документе <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">Файл AndroidManifest.xml</a> 319. </p> 320 321 322 323<h3 id="DeclaringComponentCapabilities">Объявление возможностей компонентов</h3> 324 325<p>Как уже говорилось в разделе <a href="#ActivatingComponents">Активация компонентов</a>, с помощью объекта 326{@link android.content.Intent} можно запускать операции, службы и приемники широковещательных сообщений. Для этого в объекте Intent следует 327явно указать имя целевого компонента (с помощью имени класса компонента). Однако 328в полной мере возможности объектов Intent раскрываются при использовании концепции <em>неявных Intent</em>. В неявном сообщении Intent 329просто описывается тип действия, которое требуется выполнить (а также, хотя это и не обязательно, дата, в которую вы бы хотели 330выполнить это действие). Системе же предоставляется возможности найти на устройстве компонент, который может выполнить это 331действие, и запустить его. При наличии нескольких компонентов, которые могут выполнить действие, описанное в сообщении 332Intent, пользователь выбирает, какой из них будет использоваться.</p> 333 334<p>Система определяет компоненты, которые могут ответить на сообщение Intent, путем сравнения 335полученного сообщения Intent с <i>фильтрами объектов Intent,</i> указанными в файле манифеста других приложений, имеющихся 336 на устройстве.</p> 337 338<p>При объявлении операции в манифесте своего приложения по желанию можно указать 339фильтры объектов Intent, которые указывают возможности операции, с тем чтобы она могла реагировать на сообщения Intent 340от других приложений. Чтобы объявить фильтр Intent для своего компонента, 341необходимо добавить элемент <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code 342<intent-filter>}</a> в качестве дочернего для элемента объявления компонента.</p> 343 344<p>Например, если вы создали приложение для работы с электронной почтой с операцией составления нового сообщения, вы можете 345объявить фильтр для ответа на сообщения Intent типа "send" (для отправки нового сообщения электронной почты) следующим образом:</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>Затем, если другое приложение создаст объект Intent с действием {@link 362android.content.Intent#ACTION_SEND} и передаст его в {@link android.app.Activity#startActivity 363startActivity()}, система сможет запустить вашу операцию, дав пользователю возможность написать и отправить 364сообщение электронной почты.</p> 365 366<p>Подробные сведения о создании фильтров объектов Intent приведены в документе <a href="{@docRoot}guide/components/intents-filters.html">Объекты Intent и фильтры объектов Intent</a>. 367</p> 368 369 370 371<h3 id="DeclaringRequirements">Объявление требований приложения</h3> 372 373<p>Существует огромное количество устройств, работающих под управлением Android, и не все они имеют 374одинаковые функциональные возможности. Чтобы ваше приложение не могло быть установлено на устройствах, 375в которых отсутствуют функции, необходимые приложению, важно четко определить профиль для 376типов устройств, поддерживаемых вашим приложением, указав требования к аппаратному и программному обеспечению в 377файле манифеста. Эти объявления по большей части носят информационный характер, система их не 378читает. Однако их читают внешние службы, например Google Play, с целью обеспечения 379фильтрации для пользователей, которые ищут приложения для своих устройств.</p> 380 381<p>Например, если вашему приложению требуется камера и оно использует API-интерфейсы из Android 2.1 (<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>Теперь ваше приложение нельзя будет установить из Google Play на устройствах, в которых <em>нет</em> камеры, а также на устройствах, работающих под управлением 394Android версии <em>ниже</em> 2.1.</p> 395 396<p>Однако можно также объявить, что приложение использует камеру, но для его работы она не является 397<em>непременно необходимой</em>. В этом случае в приложении атрибуту <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html#required">{@code required}</a> 398необходимо задать значение {@code "false"}, а во время работы оно должно проверять, имеется ли 399на устройстве камера, и при необходимости отключать свои функции, которые используют камеру.</p> 400 401<p>Более подробные сведения об управлении совместимостью своего приложения с различными устройствами 402приведены в документе <a href="{@docRoot}guide/practices/compatibility.html">Совместимость устройств</a> 403.</p> 404 405 406 407<h2 id="Resources">Ресурсы приложения</h2> 408 409<p>Приложение Android состоит не только из кода — ему необходимы такие существующие отдельно от исходного кода 410ресурсы, как изображения, аудиофайлы и все, что связано с визуальным 411представлением приложения. Например, необходимо определять анимацию, меню, стили, цвета 412и макет пользовательских интерфейсов операций в файлах XML. Используя ресурсы приложения, можно без труда 413изменять его различные характеристики, не меняя код, а, кроме того, —путем предоставления 414наборов альтернативных ресурсов — можно оптимизировать свое приложение для работы с различными 415конфигурациями устройств (например, для различных языков или размеров экрана).</p> 416 417<p>Для каждого ресурса, включаемого в проект Android, инструменты SDK задают уникальный 418целочисленный идентификатор, который может использоваться, чтобы сослаться на ресурс из кода приложения или из 419других ресурсов, определенных в XML. Например, если в вашем приложении имеется файл изображения с именем {@code 420logo.png} (сохраненный в папке {@code res/drawable/}), инструменты SDK сформируют идентификатор ресурса 421под именем {@code R.drawable.logo}, с помощью которого на изображение можно будет ссылаться и вставлять его в 422пользовательский интерфейс.</p> 423 424<p>Один из наиболее важных аспектов предоставления ресурсов отдельно от исходного кода 425заключается в возможности использовать альтернативные ресурсы для различных конфигураций 426устройств. Например, определив строки пользовательского интерфейса в XML, вы сможете перевести их на другие 427языки и сохранить эти переводы в отдельных файлах. Затем по <em>квалификатору</em> языка 428, добавленному к имени каталога ресурса (скажем {@code res/values-fr/} для строк на французском 429языке), и выбранному пользователем языку система Android применит к вашему пользовательскому интерфейсу строки на 430соответствующем языке.</p> 431 432<p>Android поддерживает разные <em>квалификаторы</em> для соответствующих ресурсов. Квалификатор 433 представляет собой короткую строку, которая включается в имена каталогов ресурсов с целью 434определения конфигурации устройства, для которой эти ресурсы следует использовать. В качестве другого 435примера можно сказать, что для своих операций следует создавать разные макеты, которые будут соответствовать 436размеру и ориентации экрана устройства. Например, когда экран устройства имеет книжную 437ориентацию (расположен вертикально), кнопки в макете можно также размещатьь по вертикали, а когда экран 438развернут горизонтально (альбомная ориентация), кнопки следует размещать по горизонтали. Чтобы при изменении ориентации экрана изменялся макет, 439можно определить два разных макета и применить соответствующий 440квалификатор к имени каталога каждого макета. После этого система будет автоматически применять соответствующий 441макет в зависимости от ориентации устройства.</p> 442 443<p>Подробные сведения о различных видах ресурсов, которые можно включить в приложение, а также о том, как 444создавать альтернативные ресурсы для разных конфигурацией устройств, см. в разделе <a href="{@docRoot}guide/topics/resources/providing-resources.html">Предоставление ресурсов</a>.</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">Объекты Intent и фильтры объектов Intent</a> 453 </dt> 454 <dd>Сведения об использовании API-интерфейсов {@link android.content.Intent} для 455 активации таких компонентов приложений, как операции и службы, а также о предоставлении возможности другим приложениям 456 использовать компоненты своего приложения.</dd> 457 <dt><a href="{@docRoot}guide/components/activities.html">Операции</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">Совместимость устройств</a></dt> 471 <dd>Сведения о том, каким образом система Android работает на устройствах разных типов, и общие сведения о том, 472 как оптимизировать свое приложение для каждого устройства или ограничить круг устройств, на которых может быть установлено 473 приложение.</dd> 474 <dt><a href="{@docRoot}guide/topics/security/permissions.html">Системные разрешения</a></dt> 475 <dd>Сведения о том, как система Android ограничивает доступ приложений к определенным API-интерфейсам с помощью системы 476 разрешений, которая требует согласия пользователя на использование этих API-интерфейсов вашим приложением.</dd> 477 </dl> 478</div> 479</div> 480 481