blob: 725c68dacb686390360e5805efcb26c77e14b44d [file] [log] [blame]
page.title=Đại cương v ng dng
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Trong tài liu này</h2>
<ol>
<li><a href="#Components">Thành phn ca ng dng</a>
<ol>
<li><a href="#ActivatingComponents">Kích hot các thành phn</a></li>
</ol>
</li>
<li><a href="#Manifest">Tp Bn kê khai</a>
<ol>
<li><a href="#DeclaringComponents">Khai báo các thành phn</a></li>
<li><a href="#DeclaringRequirements">Khai báo các yêu cu ca ng dng</a></li>
</ol>
</li>
<li><a href="#Resources">Tài nguyên ng dng</a></li>
</ol>
</div>
</div>
<p>ng dng Android được viết bng ngôn ng lp trình Java. B công c SDK Android s biên dch
mã ca bn&mdash;cùng vi bt k tp d liu và tài nguyên nào&mdash;vào mt APK: mt <i>gói Android</i>,
đó là mt tp lưu tr có hu t {@code .apk}. Mt tp APK cha tt c ni dung
ca mt ng dng Android và là tp mà các thiết b da trên nn tng Android s dng để cài đặt ng dng.</p>
<p>Sau khi được cài đặt lên mt thiết bị, tng ng dng Android s bên trong hp cát bo mt ca chính nó: </p>
<ul>
<li>H điu hành Android là mt h thng Linux đa người dùng trong đó mi ng dng là mt
người dùng khác nhau.</li>
<li>Theo mc định, h thng gán cho tng ng dng mt ID người dùng Linux duy nht (ID ch được s dng bi
h thng và không xác định đối vi ng dng). H thng s đặt quyn cho tt c tp trong mt ng dng
sao cho ch ID người dùng được gán cho ng dng đó mi có th truy cp chúng. </li>
<li>Mi tiến trình có máy o (VM) riêng ca mình, vì thế mã ca mt ng dng s chy độc lp vi
các ng dng khác.</li>
<li>Theo mc định, mi ng dng chy trong tiến trình Linux ca chính nó. Android khi động tiến trình khi bt k
thành phn nào ca ng dng cn được thc thi, sau đó tt tiến trình khi không còn
cn na hoc khi h thng phi khôi phc b nh cho các ng dng khác.</li>
</ul>
<p>Bng cách này, h thng Android trin khai <em>nguyên tc đặc quyn ít nht</em>. C thể,
theo mc định, mi ng dng ch có th truy cp vào các thành phn mà nó cn để thc hin công vic ca mình và
không hơn. Điu này to ra mt môi trường rt bo mt mà trong đó mt ng dng không th truy cp các b phn ca
h thng mà nó không được cp quyn.</p>
<p>Tuy nhiên, có nhiu cách để mt ng dng chia s d liu vi các ng dng khác và để mt
ng dng truy cp vào các dch v ca h thng:</p>
<ul>
<li>Có th sp xếp để hai ng dng chia s cùng ID người dùng Linux, trong trường hp đó
chúng có th truy cp các tp ca nhau. Để tiết kim tài nguyên ca h thng, các ng dng có
cùng ID người dùng cũng có th sp xếp để chy trong cùng tiến trình Linux và chia s cùng VM (các
ng dng cũng phi được ký bng cùng chng chỉ).</li>
<li>Mt ng dng có th yêu cu quyn truy cp d liu ca thiết b chng hn như
danh b ca người dùng, tin nhn SMS, thiết b lưu tr gn được (th SD), máy nh, Bluetooth và nhiu na. Tt c
quyn ng dng đều phi được cp bi người dùng ti thi đim cài đặt.</li>
</ul>
<p>Đó là ni dung cơ bn v cách mà mt ng dng Android tn ti trong h thng. Phn còn li ca
tài liu này gii thiu vi bn về:</p>
<ul>
<li>Các thành phn khuôn kh ct lõi định nghĩa ng dng ca bn.</li>
<li>Tp bn kê khai mà trong đó bn khai báo các thành phn và tính năng yêu cu ca thiết b cho ng dng
ca bn.</li>
<li>Các tài nguyên tách riêng vi mã ng dng và cho phép ng dng ca bn
ti ưu hóa hành vi ca nó cho nhiu loi cu hình thiết b đa dng.</li>
</ul>
<h2 id="Components">Thành phn ca ng dng</h2>
<p>Thành phn ca ng dng là nhng khi dng thiết yếu ca mt ng dng Android. Mi
thành phn là mt đim khác nhau mà qua đó h thng có th vào ng dng ca bn. Không phi tt c
thành phn đều là các đim nhp thc tế cho người dùng và mt s ph thuc vào nhau, nhưng mi thành phn tn ti
như mt thc th riêng và đóng mt vai trò riêng&mdash;mi thành phn là mt khi dng duy nht
giúp định nghĩa hành vi chung ca ng dng ca bn.</p>
<p>Có bn loi thành phn ng dng khác nhau. Mi loi có mt mc đích riêng
và có mt vòng đời riêng, xác định cách thành phn được to lp và hy.</p>
<p>Sau đây là bn loi thành phn ng dng:</p>
<dl>
<dt><b>Hot động</b></dt>
<dd>Mt <i>hot động</i> biu din mt màn hình đơn vi mt giao din người dùng. Ví dụ,
mt ng dng e-mail có th có mt hot động vi chc năng hin th mt danh sách
e-mail mi, mt hot động khác để son e-mail, và mt hot động khác để đọc e-mail. Mc dù
các hot động cùng nhau to thành mt tri nghim người dùng gn kết trong ng dng e-mail, mi hot động
li độc lp vi nhau. Như vy, mt ng dng khác có th khi động bt k hot động nào
trong s này (nếu ng dng e-mail cho phép nó). Ví dụ, mt ng dng máy nh có th khi động
hot động trong ng dng e-mail có chc năng son thư mi, để người dùng chia s mt bc nh.
<p>Hot động được trin khai như mt lp con ca {@link android.app.Activity} và bn có th tìm hiu thêm
v nó trong hướng dn dành cho nhà phát trin <a href="{@docRoot}guide/components/activities.html">Hot động</a>
.</p>
</dd>
<dt><b>Dch vụ</b></dt>
<dd>Mt <i>dch vụ</i> là mt thành phn chy ngm để thc hin các thao tác
chy lâu hoc để thc hin công vic cho các tiến trình t xa. Dch v
không cung cp giao din người dùng. Ví dụ, mt dch v có th phát nhc dưới nn trong khi
người dùng đang mt ng dng khác, hoc nó có th ti d liu qua mng mà không
chn người dùng tương tác vi hot động. Mt thành phn khác, chng hn như mt hot động, có th khi động
dch v và để nó chy hoc gn kết vi nó để tương tác vi nó.
<p>Dch v được trin khai như mt lp con ca {@link android.app.Service} và bn có th tìm hiu
thêm v nó trong hướng dn cho nhà phát trin <a href="{@docRoot}guide/components/services.html">Dch vụ</a>
.</p>
</dd>
<dt><b>Trình cung cp Ni dung</b></dt>
<dd>Mt <i>trình cung cp ni dung</i> s qun lý mt tp d liu ng dng được chia sẻ. Bn có th lưu tr d liu trong
h thng tp, mt cơ s d liu SQLite, trên web, hay bt k v trí lưu tr liên tc nào khác mà
ng dng ca bn có th truy cp. Thông qua trình cung cp ni dung, các ng dng khác có th truy vn hay thm chí sa đổi
d liu (nếu trình cung cp ni dung cho phép). Ví dụ, h thng Android cung cp mt trình cung cp
ni dung có chc năng qun lý thông tin danh b ca người dùng. Như vy, bt k ng dng nào có các quyn
phù hp đều có th truy vn bt k phn nào ca trình cung cp ni dung (chng hn như {@link
android.provider.ContactsContract.Data}) để đọc và ghi thông tin v mt người c thể.
<p>Trình cung cp ni dung cũng hu ích vi vic đọc và ghi d liu riêng tư đối vi
ng dng ca bn và không được chia sẻ. Ví dụ, ng dng mu <a href="{@docRoot}resources/samples/NotePad/index.html">Note Pad</a> s dng mt
trình cung cp ni dung để lưu các ghi chú.</p>
<p>Trình cung cp ni dung được trin khai như mt lp con ca {@link android.content.ContentProvider}
và phi trin khai mt tp các API tiêu chun cho phép các ng dng khác thc hin
giao tác. Để biết thêm thông tin, xem hướng dn cho nhà phát trin <a href="{@docRoot}guide/topics/providers/content-providers.html">Trình cung cp Ni dung</a>
.</p>
</dd>
<dt><b>Hàm nhn qung bá</b></dt>
<dd>Mt <i>hàm nhn qung bá</i> (broadcast receiver) là mt thành phn có chc năng hi đáp li các thông báo
qung bá trên toàn h thng. Nhiu qung bá khi ngun t h thng&mdash;ví dụ, mt qung bá thông báo
rng màn hình đã tt, pin yếu, hoc mt bc nh được chp.
Các ng dng cũng có th khi to qung bá&mdash;ví d như để các ng dng khác biết rng
mt phn d liu đã được ti xung thiết b và có sn để h s dng. Mc dù các hàm nhn qung bá
không hin th giao din người dùng, chúng có th <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">to mt thông báo thanh trng thái</a>
để cnh báo người tiếp nhn khi xy ra mt s kin qung bá. Tuy nhiên trường hp ph biến hơn đó là hàm nhn qung bá ch
là mt "cổng kết nối" ti các thành phn khác và nhm mc đích thc hin lượng công vic rt ít. Ví
dụ, nó có th khi to mt dch v để thc hin mt s công vic da trên s kin.
<p>Hàm nhn qung bá được trin khai như mt lp con ca {@link android.content.BroadcastReceiver}
và mi qung bá được chuyn giao như mt đối tượng {@link android.content.Intent}. Để biết thêm thông tin,
hãy xem lp {@link android.content.BroadcastReceiver}.</p>
</dd>
</dl>
<p>Mt khía cnh độc đáo trong thiết kế h thng Android đó là bt k ng dng nào cũng có th khi động mt thành phn ca
ng dng khác. Ví dụ, nếu bn mun người dùng chp
nh bng máy nh ca thiết bị, có th có mt ng dng khác có chc năng đó và
ng dng ca bn có th s dng nó thay vì phát trin mt hot động để t chp nh. Bn không
cn tích hp hay thm chí là liên kết vi mã t ng dng ca máy nh.
Thay vào đó, bn đơn gin có th khi động hot động đó trong ng dng máy nh có chc năng
chp nh. Khi hoàn thành, nh thm chí được tr v ng dng ca bn để bn có th s dng nó. Đối vi người dùng,
có v như máy nh là mt b phn thc s trong ng dng ca bn.</p>
<p>Khi h thng khi động mt thành phn, nó s khi động tiến trình cho ng dng đó (nếu tiến trình không
đang chy) và khi to các lp cn thiết cho thành phn. Ví dụ, nếu ng dng
ca bn khi động hot động trong ng dng máy nh có chc năng chp nh, hot động đó
s chy trong tiến trình thuc v ng dng máy nh ch không chy trong tiến trình ca ng dng ca bn.
Vì thế, không như ng dng trên hu hết các h thng khác, ng dng Android không có mt đim nhp
duy nht (ví dụ, không có chc năng {@code main()}).</p>
<p>Vì h thng chy tng ng dng trong mt tiến trình riêng vi các quyn ca tp mà
hn chế truy cp vào các ng dng khác, ng dng ca bn không th trc tiếp kích hot mt thành phn t
mt ng dng khác. Tuy nhiên, h thng Android có thể. Vì thế, để kích hot mt thành phn trong
mt ng dng khác, bn phi chuyn giao mt thông báo ti h thng trong đó nêu rõ <em>ý định</em> ca bn để
khi động mt thành phn c thể. Sau đó, h thng s kích hot thành phn cho bn.</p>
<h3 id="ActivatingComponents">Kích hot Thành phn</h3>
<p>Ba trong bn loi thành phn&mdash;hot động, dch v và
hàm nhn qung bá&mdash;s được kích hot bng mt thông báo không đồng b gi là <em>ý định</em>.
Ý định s gn kết tng thành phn vi nhau vào thi gian chy (bn có th nghĩ chúng như là
các hàm nhn tin có chc năng yêu cu mt hành động t các thành phn khác), dù thành phn đó thuc
v ng dng ca bn hay ng dng khác.</p>
<p>Mt ý định được to thành bng mt đối tượng {@link android.content.Intent}, nó định nghĩa mt thông báo để
kích hot mt thành phn c th hoc mt <em>loi</em> thành phn c thể&mdash;tương ng, mt ý định
có th biu th hoc không biu thị.</p>
<p>Đối vi các hot động và dch vụ, ý định có chc năng định nghĩa mt hành động s thc hin (ví dụ, "xem" hoc
"gửi" gì đó) và có th ch định URI ca d liu để hành động da trên đó (ngoài nhng điu khác mà
thành phn được khi động có th cn biết). Ví dụ, mt ý định có th truyn ti mt yêu cu
để mt hot động hin th mt hình nh hay m mt trang web. Trong mt s trường hp, bn có th khi động mt
hot động để nhn kết quả, trong trường hp đó, hot động cũng tr v
kết qu trong mt {@link android.content.Intent} (ví dụ, bn có th phát hành mt ý định để cho phép
người dùng chn mt liên lc cá nhân và yêu cu tr nó v cho bn&mdash định tr v bao gm mt
URI ch đến liên lc được chn).</p>
<p>Đối vi hàm nhn qung bá, ý định ch định nghĩa
thông báo đang được qung bá (ví dụ, mt qung bá để báo rng pin ca thiết b yếu
s ch bao gm mt xâu hành động ch báo rng "pin yếu").</p>
<p>Loi thành phn còn li, trình cung cp ni dung, không được kích hot bi ý định. Thay vào đó, nó được
kích hot khi được nhm ti bi mt yêu cu t mt {@link android.content.ContentResolver}. B gii quyết
ni dung x lý tt c giao tác trc tiếp vi trình cung cp ni dung sao cho thành phn mà
đang thc hin giao tác vi trình cung cp s không cn mà thay vào đó gi các phương pháp trên đối tượng {@link
android.content.ContentResolver}. Điu này để li mt lp tóm tt gia trình cung cp
ni dung và thành phn yêu cu thông tin (để bo mt).</p>
<p>Có các phương pháp riêng để kích hot tng loi thành phn:</p>
<ul>
<li>Bn có th khi động mt hot động (hoc giao cho nó vic gì mi để làm) bng cách
chuyn mt {@link android.content.Intent} đến {@link android.content.Context#startActivity
startActivity()} hoc {@link android.app.Activity#startActivityForResult startActivityForResult()}
(khi bn mun hot động tr v mt kết quả).</li>
<li>Bn có th khi động mt dch v (hoc gi ch dn mi ti mt dch v đang din ra) bng cách
chuyn mt {@link android.content.Intent} đến {@link android.content.Context#startService
startService()}. Hoc bn có th gn kết vi dch v bng cách chuyn mt {@link android.content.Intent} đến
{@link android.content.Context#bindService bindService()}.</li>
<li>Bn có th khi to mt qung bá bng cách chuyn {@link android.content.Intent} ti các phương pháp như
{@link android.content.Context#sendBroadcast(Intent) sendBroadcast()}, {@link
android.content.Context#sendOrderedBroadcast(Intent, String) sendOrderedBroadcast()}, hoặc {@link
android.content.Context#sendStickyBroadcast sendStickyBroadcast()}.</li>
<li>Bn có th thc hin mt truy vn ti mt trình cung cp ni dung bng cách gi {@link
android.content.ContentProvider#query query()} trên một {@link android.content.ContentResolver}.</li>
</ul>
<p>Để biết thêm thông tin v vic s dng ý định, hãy xem tài liu <a href="{@docRoot}guide/components/intents-filters.html" định và B lc
Ý định</a>. Bn cũng có th xem thêm thông tin v vic kích hot các thành phn c th
trong nhng tài liu sau: <a href="{@docRoot}guide/components/activities.html">Hot động</a>, <a href="{@docRoot}guide/components/services.html">Dịch vụ</a>, {@link
android.content.BroadcastReceiver} và <a href="{@docRoot}guide/topics/providers/content-providers.html">Trình cung cấp Nội dung</a>.</p>
<h2 id="Manifest">Tệp Bản kê khai</h2>
<p>Trước khi hệ thống Android có thể khởi động một thành phần ứng dụng, hệ thống phải biết rằng
thành phần đó tồn tại bằng cách đọc tệp {@code AndroidManifest.xml} của ứng dụng (tệp
"bn kê khai"). Ứng dụng của bạn phải khai báo tất cả thành phần của nó trong tệp này, nó phải nằm ở gốc của
thư mục dự án của ứng dụng.</p>
<p>Bản kê khai làm nhiều việc bên cạnh việc khai báo các thành phần của ứng dụng,
chẳng hạn như:</p>
<ul>
<li>Xác định bất kỳ quyền của người dùng nào mà ứng dụng yêu cầu, chẳng hạn như truy cập Internet hay
truy cập đọc vào danh bạ của người dùng.</li>
<li>Khai báo <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">Mức API</a>
ti thiu mà ng dng yêu cu da trên nhng API mà ng dng s dng.</li>
<li>Khai báo các tính năng phn cng và phn mm được s dng hoc yêu cu bi ng dng, chng hn như máy nh,
dch v Bluetooth, hoc màn hình cm ng đa đim.</li>
<li>Các thư vin API mà ng dng cn được liên kết vi (ngoài các API khuôn kh
Android), chng hn như <a href="http://code.google.com/android/add-ons/google-apis/maps-overview.html">thư vin Google Maps
</a>.</li>
<li>Và hơn thế na</li>
</ul>
<h3 id="DeclaringComponents">Khai báo các thành phn</h3>
<p>Nhim v chính ca bn kê khai là thông báo cho h thng v các thành phn ca ng dng. Ví
dụ, mt tp bn kê khai có th khai báo mt hot động như sau: </p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;manifest ... &gt;
&lt;application android:icon="@drawable/app_icon.png" ... &gt;
&lt;activity android:name="com.example.project.ExampleActivity"
android:label="@string/example_label" ... &gt;
&lt;/activity&gt;
...
&lt;/application&gt;
&lt;/manifest&gt;</pre>
<p>Trong phn t <code><a
href="{@docRoot}guide/topics/manifest/application-element.html">&lt;application&gt;</a></code>
, thuc tính {@code android:icon} s tr đến các tài nguyên cho mt biu tượng có chc năng nhn biết
ng dng.</p>
<p>Trong phn t <code><a
href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code>,
thuc tính {@code android:name} quy định tên lp hoàn toàn đủ tiêu chun ca lp con {@link
android.app.Activity} và các thuc tính {@code android:label} quy định mt xâu
để s dng làm nhãn hin th vi người dùng đối vi hot động.</p>
<p>Bn phi khai báo tt c thành phn ca ng dng như sau:</p>
<ul>
<li>Các phn t <code><a
href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code>
cho hot động</li>
<li>Các phn t <code><a
href="{@docRoot}guide/topics/manifest/service-element.html">&lt;service&gt;</a></code> cho
dch vụ</li>
<li>Các phn t <code><a
href="{@docRoot}guide/topics/manifest/receiver-element.html">&lt;receiver&gt;</a></code>
cho hàm nhn qung bá</li>
<li>Các phn t <code><a
href="{@docRoot}guide/topics/manifest/provider-element.html">&lt;provider&gt;</a></code>
cho trình cung cp ni dung</li>
</ul>
<p>Các hot động, dch v và trình cung cp ni dung mà bn bao gm trong ngun ca mình nhưng không khai báo
trong bn kê khai s không hin th vi h thng và h qu là không bao gi chy được. Tuy nhiên,
hàm nhn
qung bá có th hoc được khai báo trong bn kê khai hoc được to linh hot trong mã (dng đối tượng
{@link android.content.BroadcastReceiver}) và được đăng ký vi h thng bng cách gi
{@link android.content.Context#registerReceiver registerReceiver()}.</p>
<p>Để tìm hiu thêm v cách cu trúc tp bn kê khai cho ng dng ca mình, hãy xem tài liu <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">Tp AndroidManifest.xml</a>
. </p>
<h3 id="DeclaringComponentCapabilities">Khai báo các kh năng ca thành phn</h3>
<p>Như đã nêu bên trên trong phn <a href="#ActivatingComponents">Kích hot các Thành phn</a>, bn có th s dng mt
{@link android.content.Intent} để khi động các hot động, dch v và hàm nhn qung bá. Bn có th làm vy bng cách
công khai ch định thành phn đích (s dng tên lp thành phn) trong ý định. Tuy nhiên,
sc mnh thc s ca ý định nm trong khái nim <em>ý định không biu thị</em>. Ý định không biu th
đơn thun mô t kiu hành động cn thc hin (và có th có c d liu mà bn mun
thc hin hành động) và cho phép h thng tìm mt thành phn trên thiết b có kh năng thc hin
hành động và khi động nó. Nếu có nhiu thành phn có th thc hin hành động được mô t bi
ý định, khi đó người dùng chn ý định s s dng.</p>
<p>Cách h thng nhn biết các thành phn có kh năng hi đáp li mt ý định là bng cách so sánh
ý định nhn được vi <i>các b lc ý định</i> được cung cp trong tp bn kê khai ca các ng dng khác trên
thiết bị.</p>
<p>Khi bn khai báo mt hot động trong bn kê khai ng dng ca mình, bn có th tùy chn bao gm
các b lc ý định có chc năng khai báo các kh năng ca hot động sao cho nó có th hi đáp li ý định
t các ng dng khác. Bn có th khai báo mt b lc ý định cho thành phn ca mình bng cách
thêm mt phn t <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code
&lt;intent-filter&gt;}</a> làm con của phần tử công khai của thành phần đó.</p>
<p>Ví dụ, nếu bn đã xây dng mt ng dng e-mail có mt hot động son e-mail mi, bn có th
khai báo b lc ý định đó để tr li các ý định "gửi" (để gi mt e-mail mi) như sau:</p>
<pre>
&lt;manifest ... >
...
&lt;application ... &gt;
&lt;activity android:name="com.example.project.ComposeEmailActivity">
&lt;intent-filter>
&lt;action android:name="android.intent.action.SEND" />
&lt;data android:type="*/*" />
&lt;category android:name="android.intent.category.DEFAULT" />
&lt;/intent-filter>
&lt;/activity>
&lt;/application&gt;
&lt;/manifest>
</pre>
<p>Sau đó, nếu mt ng dng khác to mt ý định vi hành động {@link
android.content.Intent#ACTION_SEND} và chuyển nó cho {@link android.app.Activity#startActivity
startActivity()}, h thng có th khi động hot động ca bn để người dùng có th son tho và gi mt
e-mail.</p>
<p>Để tìm hiu thêm v vic to các b lc ý định, hãy xem tài liu <a href="{@docRoot}guide/components/intents-filters.html" định và B lc Ý định</a>.
</p>
<h3 id="DeclaringRequirements">Khai báo các yêu cu ca ng dng</h3>
<p>Có nhiu loi thiết b da trên nn tng Android và không phi tt c chúng đều cung cp
các tính năng và kh năng như nhau. Để tránh vic ng dng ca bn b cài đặt trên các thiết b
thiếu nhng tính năng mà ng dng ca bn cn, điu quan trng là bn phi định nghĩa rõ ràng mt h sơ cho
các kiu thiết b mà ng dng ca bn h tr bng cách khai báo các yêu cu v thiết b và phn mm trong tp
bn kê khai ca mình. Hu hết nhng khai báo này đều ch mang tính cht thông báo và h thng không đọc
chúng, nhưng các dch v bên ngoài như Google Play thì có đọc để cung cp tính năng lc
cho người dùng khi h tìm kiếm ng dng t thiết b ca mình.</p>
<p>Ví dụ, nếu ng dng ca bn yêu cu máy nh và s dng các API được gii thiu trong Android 2.1 (<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">API Mc</a> 7),
bn cn khai báo nhng điu này như yêu cu trong tp bn kê khai ca mình như sau:</p>
<pre>
&lt;manifest ... >
&lt;uses-feature android:name="android.hardware.camera.any"
android:required="true" />
&lt;uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" />
...
&lt;/manifest>
</pre>
<p>Lúc này, nhng thiết b mà <em>không</em> có máy nh và có mt phiên bn
Android <em>thp</em> hơn 2.1 sẽ không thể cài đặt ứng dụng của bạn từ Google Play.</p>
<p>Tuy nhiên, bn cũng có th khai báo rng ng dng ca bn s dng máy nh, nhưng không
<em>yêu cu</em> nó. Trong trường hợp đó, ứng dụng của bạn phải đặt thuộc tính <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html#required">{@code required}</a>
thành {@code "false"} và kim tra ti thi gian chy xem
thiết b có máy nh không và vô hiu hóa bt k tính năng máy nh nào cho phù hp.</p>
<p>Bn có th tìm hiu thêm thông tin v cách bn có th qun lý tính tương thích ca ng dng ca bn vi các thiết b khác nhau
trong tài liu <a href="{@docRoot}guide/practices/compatibility.html">Tính tương thích vi Thiết bị</a>
.</p>
<h2 id="Resources">Tài nguyên ng dng</h2>
<p>Mt ng dng Android được son không ch có mã&mdash;nó còn yêu cu các tài nguyên
tách riêng vi mã ngun, chng hn như hình nh, tp âm thanh và bt k th gì liên quan ti trình chiếu
trc quan ca ng dng. Ví dụ, bn nên định nghĩa các hot cnh, menu, kiu, màu sc,
và b trí ca giao din người dùng ca hot động bng các tp XML. Vic s dng các tài nguyên ng dng giúp d dàng
cp nht các đặc đim khác nhau trong ng dng ca bn mà không sa đổi mã và&mdash;bng cách cung cp
các tp hp tài nguyên thay thế&mdash;cho phép bn ti ưu hóa ng dng ca mình cho nhiu loi
cu hình thiết b (chng hn như ngôn ng và kích c màn hình khác nhau).</p>
<p>Đối vi mi tài nguyên mà bn bao gm trong d án Android ca mình, b công c xây dng SDK định nghĩa mt ID s nguyên
duy nht mà bn có th s dng để tham chiếu tài nguyên t mã ng dng ca mình hoc t
các tài nguyên khác được định nghĩa trong XML. Ví dụ, nếu ng dng ca bn cha mt tp hình nh có tên {@code
logo.png} (được lưu trong thư mc {@code res/drawable/}), b công c SDK s khi to mt ID tài nguyên
đặt tên là {@code R.drawable.logo} mà bn có th s dng để tham chiếu hình nh và chèn nó vào trong giao din người dùng
ca mình.</p>
<p>Mt trong nhng khía cnh quan trng nht ca vic cung cp tài nguyên tách riêng vi mã ngun ca bn
là kh năng cho phép bn cung cp các tài nguyên thay thế cho các
cu hình thiết b khác nhau. Ví dụ, bng cách định nghĩa các xâu UI trong XML, bn có th biên dch xâu sang
các ngôn ng khác và lưu các xâu đó vào tp riêng. Sau đó, da vào mt <em>hn định</em> ngôn ng
mà bn ni vi tên ca thư mc tài nguyên (chng hn như {@code res/values-fr/} đối vi các giá tr xâu
tiếng Pháp) và thiết đặt ngôn ng ca người dùng, h thng Android s áp dng các xâu ngôn ng phù hp
cho UI ca bn.</p>
<p>Android h tr nhiu <em>hn định</em> khác nhau cho các tài nguyên thay thế ca bn. Hn định
là mt xâu ngn mà bn bao gm trong tên ca các thư mc tài nguyên ca mình nhm
định nghĩa cu hình thiết b cho nhng tài nguyên đó nên được s dng. Ly mt
ví d khác, bn nên thường xuyên to các b trí khác nhau cho hot động ca mình, tùy vào hướng và kích c
màn hình ca thiết bị. Ví dụ, khi màn hình thiết b hướng
đứng (cao), bn có th mun mt b trí có các nút thng đứng, nhưng khi màn hình hướng
kh ngang (rng), các nút nên được căn ngang. Để thay đổi b trí
tùy vào hướng, bn có th định nghĩa hai b trí khác nhau và áp dng hn định
phù hp cho tên thư mc ca tng b trí. Sau đó, h thng s t động áp dng b trí
phù hp tùy thuc vào hướng hin ti ca thiết bị.</p>
<p>Để biết thêm thông tin v các loi tài nguyên khác nhau mà bn có th bao gm trong ng dng ca mình và cách
to các tài nguyên thay thế cho nhng cu hình thiết b khác nhau, hãy đọc <a href="{@docRoot}guide/topics/resources/providing-resources.html">Cung cp Tài nguyên</a>.</p>
<div class="next-docs">
<div class="col-6">
<h2 class="norule">Tiếp tc đọc về:</h2>
<dl>
<dt><a href="{@docRoot}guide/components/intents-filters.html" định và B lc Ý định</a>
</dt>
<dd>Thông tin v cách s dng các API {@link android.content.Intent} để
kích hot các thành phn ca ng dng, chng hn như hot động và dch vụ, và cách to các thành phn cho ng dng ca bn
có sn để cho các ng dng khác s dng.</dd>
<dt><a href="{@docRoot}guide/components/activities.html">Hot động</a></dt>
<dd>Thông tin v cách to mt thc th ca lp {@link android.app.Activity},
có chc năng cung cp mt màn hình riêng trong ng dng ca bn vi mt giao din người dùng.</dd>
<dt><a href="{@docRoot}guide/topics/resources/providing-resources.html">Cung cp Tài nguyên</a></dt>
<dd>Thông tin v cách các ng dng Android được cu trúc để tách riêng các tài nguyên ng dng khi
mã ng dng, bao gm cách bn có th cung cp các tài nguyên thay thế cho nhng
cu hình thiết b c thể.
</dd>
</dl>
</div>
<div class="col-6">
<h2 class="norule">Bn cũng có th quan tâm ti:</h2>
<dl>
<dt><a href="{@docRoot}guide/practices/compatibility.html">Tính tương thích ca Thiết bị</a></dt>
<dd>Thông tin v Android hot động trên các loi thiết b khác nhau và gii thiu
v cách bn có th ti ưu hóa ng dng ca mình cho tng thiết b hoc hn chế tính sn có ca ng dng ca bn
đối vi các thiết b khác nhau.</dd>
<dt><a href="{@docRoot}guide/topics/security/permissions.html">Quyn ca H thng</a></dt>
<dd>Thông tin v cách Android hn chế truy cp ca ng dng vào mt s API nht định bng mt h thng
quyn cn có s đồng ý ca người dùng cho phép ng dng ca bn có th s dng các API đó.</dd>
</dl>
</div>
</div>