summaryrefslogtreecommitdiff
path: root/docs/html-intl/intl/in/guide/components/fundamentals.jd
blob: bd9a500f77a5c608557ab62134bc7400a24f241c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
page.title=Dasar-Dasar Aplikasi
@jd:body

<div id="qv-wrapper">
<div id="qv">

<h2>Dalam dokumen ini</h2>
<ol>
<li><a href="#Components">Komponen Aplikasi</a>
  <ol>
    <li><a href="#ActivatingComponents">Mengaktifkan komponen</a></li>
  </ol>
</li>
<li><a href="#Manifest">File Manifes</a>
  <ol>
    <li><a href="#DeclaringComponents">Mendeklarasikan komponen</a></li>
    <li><a href="#DeclaringRequirements">Mendeklarasikan kebutuhan aplikasi</a></li>
  </ol>
</li>
<li><a href="#Resources">Sumber Daya Aplikasi</a></li>
</ol>
</div>
</div>

<p>Aplikasi Android ditulis dalam bahasa pemrograman Java. Android SDK Tools mengkompilasi 
kode Anda&mdash;bersama data dan file sumber daya &mdash;ke dalam APK: <i>Paket Android</i>,
yaitu file arsip berekstensi {@code .apk}. Satu file APK berisi semua konten 
aplikasi Android dan merupakan file yang digunakan perangkat berbasis Android untuk menginstal aplikasi.</p>

<p>Setelah diinstal di perangkat, setiap aplikasi Android tinggal di sandbox keamanannya sendiri: </p>

<ul>
 <li>Sistem operasi Android merupakan sistem Linux multi-pengguna yang di dalamnya setiap 
aplikasi adalah pengguna berbeda.</li>

<li>Secara default, sistem menetapkan ID pengguna Linux unik kepada setiap aplikasi (ID ini hanya
 digunakan oleh sistem dan tidak diketahui aplikasi). Sistem menetapkan izin
bagi semua file dalam aplikasi sehingga hanya ID pengguna yang diizinkan yang bisa mengaksesnya. </li>

<li>Setiap proses memiliki mesin virtual (VM) sendiri, sehingga kode aplikasi yang berjalan secara terisolasi dari 
aplikasi lainnya.</li>

<li>Secara default, setiap aplikasi berjalan dalam proses Linux-nya sendiri. Android memulai proses 
bila ada komponen aplikasi yang perlu dijalankan, kemudian mematikan proses bila tidak lagi diperlukan
atau bila sistem harus memulihkan memori untuk digunakan aplikasi lain.</li>
</ul>

<p>Dengan cara ini, sistem Android mengimplementasikan <em>prinsip privilese minim</em>. Ini berarti, 
secara default aplikasi hanya memiliki akses ke komponen yang diperlukannya untuk melakukan pekerjaannya dan
tidak lebih dari itu. Hal ini menghasilkan lingkungan yang sangat aman sehingga aplikasi tidak bisa mengakses bagian 
sistem bila tidak diberi izin.</p>

<p>Akan tetapi, ada beberapa cara bagi aplikasi untuk berbagi data dengan aplikasi lain dan bagi aplikasi
untuk mengakses layanan sistem:</p>

<ul>
  <li>Dua aplikasi bisa diatur untuk menggunakan ID pengguna Linux yang sama, 
dalam hal ini keduanya bisa saling mengakses file masing-masing.  Untuk menghemat sumber daya sistem, aplikasi dengan ID
pengguna yang sama juga bisa diatur agar berjalan dalam proses Linux yang sama dan menggunakan VM yang sama (
aplikasi juga harus ditandatangani dengan sertifikat yang sama).</li>
  <li>Aplikasi bisa meminta izin akses ke data perangkat seperti kontak 
pengguna, pesan SMS, penyimpanan lepas-pasang (kartu SD), kamera, Bluetooth, dan lainnya. Semua 
izin aplikasi harus diberikan oleh pengguna saat menginstal.</li>
</ul>

<p>Hal tersebut mencakup dasar-dasar tentang cara aplikasi Android berada di dalam sistem. Bagian dokumen
selanjutnya memperkenalkan Anda pada:</p>
<ul>
  <li>Komponen kerangka kerja inti yang mendefinisikan aplikasi.</li>
  <li>File manifes tempat Anda mendeklarasikan komponen dan fitur yang diperlukan perangkat
untuk aplikasi.</li>
  <li>Sumber daya yang terpisah dari kode aplikasi dan memungkinkan 
aplikasi mengoptimalkan perilakunya untuk beragam konfigurasi perangkat.</li>
</ul>



<h2 id="Components">Komponen Aplikasi</h2>

<p>Komponen aplikasi adalah blok pembangun penting dari aplikasi Android.
Setiap komponen merupakan titik berbeda yang digunakan sistem untuk memasuki aplikasi. Tidak semua komponen 
merupakan titik masuk sebenarnya bagi pengguna dan sebagian saling bergantung, namun masing-masing komponen tersedia 
sebagai kesatuan sendiri dan memainkan peran tertentu&mdash;masing-masing merupakan
blok pembangun unik yang mendefinisikan perilaku aplikasi secara keseluruhan.</p>

<p>Ada empat macam tipe komponen aplikasi. Setiap tipe memiliki kegunaan tersendiri
dan daur hidupnya sendiri yang mendefinisikan cara komponen dibuat dan dimusnahkan.</p>

<p>Berikut ini empat tipe komponen aplikasi:</p>

<dl>

<dt><b>Aktivitas</b></dt>

<dd>Sebuah <i>aktivitas</i> mewakili satu layar dengan antarmuka pengguna. Misalnya,
aplikasi email mungkin memiliki satu aktivitas yang menampilkan daftar email 
baru, aktivitas lain untuk menulis email, dan aktivitas satunya lagi untuk membaca email. Walaupun
semua aktivitas bekerja sama untuk membentuk pengalaman pengguna yang kohesif dalam aplikasi email,
masing-masing tidak saling bergantung. Karenanya, aplikasi berbeda bisa memulai
salah satu aktivitas ini (jika aplikasi email mengizinkannya). Misalnya, aplikasi kamera bisa memulai
aktivitas dalam aplikasi email yang membuat email baru agar pengguna bisa berbagi gambar.

<p>Aktivitas diimplementasikan sebagai subkelas {@link android.app.Activity} dan Anda bisa mengetahui selengkapnya
tentang hal ini dalam panduan pengembang <a href="{@docRoot}guide/components/activities.html">Aktivitas</a>
.</p>
</dd>


<dt><b>Layanan</b></dt>

<dd>Sebuah <i>layanan</i> adalah komponen yang berjalan di latar belakang untuk melakukan
operasi yang berjalan lama atau untuk melakukan pekerjaan bagi proses jarak jauh. Layanan
tidak menyediakan antarmuka pengguna. Misalnya, sebuah layanan bisa memutar musik di latar belakang sementara 
pengguna berada dalam aplikasi lain, atau layanan bisa menarik data lewat jaringan tanpa
memblokir interaksi pengguna dengan aktivitas. Komponen lain, seperti aktivitas, bisa memulai
layanan dan membiarkannya berjalan atau mengikat layanan untuk berinteraksi dengannya.

<p>Layanan diimplementasikan sebagai subkelas {@link android.app.Service} dan Anda bisa mengetahui selengkapnya
tentang hal ini dalam panduan
pengembang <a href="{@docRoot}guide/components/services.html">Layanan</a>.</p>
</dd>


<dt><b>Penyedia konten</b></dt>

<dd>Sebuah <i>penyedia konten</i> mengelola seperangkat data-bersama aplikasi. Anda bisa menyimpan data
dalam sistem file, database SQLite, di web, atau lokasi penyimpanan permanen lainnya
yang bisa diakses aplikasi. Melalui penyedia konten, aplikasi lain bisa melakukan query atau bahkan 
memodifikasi data (jika penyedia konten mengizinkannya). Misalnya, sistem Android menyediakan penyedia
konten yang mengelola informasi kontak pengguna. Karenanya, setiap aplikasi
dengan izin yang sesuai bisa melakukan query mengenai bagian dari penyedia konten (seperti {@link
android.provider.ContactsContract.Data}) untuk membaca dan menulis informasi tentang orang tertentu.

<p>Penyedia konten juga berguna untuk membaca dan menulis data privat ke aplikasi Anda
dan tidak dibagikan. Misalnya, aplikasi contoh <a href="{@docRoot}resources/samples/NotePad/index.html">Note Pad</a> menggunakan
penyedia konten untuk menyimpan catatan.</p>

<p>Penyedia konten diimplementasikan sebagai subkelas {@link android.content.ContentProvider}
dan harus mengimplementasikan seperangkat standar API yang memungkinkan aplikasi
lain melakukan transaksi. Untuk informasi selengkapnya, lihat panduan pengembang 
<a href="{@docRoot}guide/topics/providers/content-providers.html">Penyedia Konten</a>.</p>
</dd>


<dt><b>Penerima siaran</b></dt>

<dd>Sebuah <i>penerima siaran</i> adalah komponen yang merespons pengumuman siaran dalam lingkup
sistem.  Banyak siaran yang berasal dari sistem&mdash;misalnya, siaran yang mengumumkan bahwa
layar telah dimatikan, baterai lemah, atau gambar telah direkam.
Aplikasi juga bisa memulai siaran&mdash;misalnya untuk menginformasikan ke
aplikasi lain bahwa sebagian data telah diunduh ke perangkat dan bisa digunakan aplikasi lain tersebut. Walaupun penerima
siaran tidak menampilkan antarmuka pengguna, penerima bisa <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">membuat pemberitahuan baris status</a>
untuk memberi tahu pengguna kapan kejadian siaran dilakukan. Meskipun penerima siaran umumnya cuma menjadi
"gerbang" untuk komponen lain dan dimaksudkan untuk melakukan pekerjaan dalam jumlah sangat minim. Misalnya
, penerima siaran bisa menjalankan layanan untuk melakukan beberapa pekerjaan berdasarkan kejadian.

<p>Penerima siaran diimplementasikan sebagai subkelas {@link android.content.BroadcastReceiver}
dan setiap siaran dikirim sebagai objek {@link android.content.Intent}. Untuk informasi selengkapnya,
lihat kelas {@link android.content.BroadcastReceiver}.</p>
</dd>

</dl>



<p>Aspek unik dari desain sistem Android adalah aplikasi mana pun bisa memulai 
komponen aplikasi lain. Misalnya, jika Anda menginginkan pengguna mengambil
foto dengan kamera perangkat, bisa saja aplikasi lain yang melakukannya dan aplikasi
Anda bisa menggunakannya, sebagai ganti mengembangkan aktivitas sendiri untuk mengambil foto. Anda tidak
harus menyatukan atau bahkan menautkan ke kode dari aplikasi kamera.
Sebagai gantinya, Anda tinggal memulai aktivitas di aplikasi kamera yang akan mengambil
foto. Bila selesai, foto akan dikembalikan ke aplikasi sehingga Anda bisa menggunakannya. Bagi pengguna,
kamera seakan menjadi bagian dari aplikasi Anda.</p>

<p>Saat sistem memulai komponen, sistem akan memulai proses untuk aplikasi itu (jika
belum berjalan) dan membuat instance kelas yang diperlukan untuk komponen. Misalnya, jika aplikasi Anda
memulai aktivitas dalam aplikasi kamera yang mengambil foto, aktivitas itu akan
berjalan dalam proses yang dimiliki oleh aplikasi kamera, bukan dalam proses aplikasi Anda. 
Karenanya, tidak seperti aplikasi di sebagian besar sistem lain, aplikasi Android tidak memiliki titik
masuk tunggal (misalnya tidak ada fungsi {@code main()}).</p>

<p>Karena sistem menjalankan setiap aplikasi dalam proses terpisah dengan izin file yang
membatasi akses ke aplikasi lain, aplikasi Anda tidak bisa langsung mengaktifkan komponen dari aplikasi lain. Akan tetapi, sistem
Android bisa melakukannya. Jadi, untuk mengaktifkan
komponen dalam aplikasi lain, Anda harus mengirim pesan ke sistem yang menetapkan <em>intent</em> Anda untuk memulai
komponen tertentu. Selanjutnya sistem akan mengaktifkan komponen untuk Anda.</p>


<h3 id="ActivatingComponents">Mengaktifkan Komponen</h3>

<p>Tiga dari empat tipe komponen&mdash;aktivitas, layanan, dan
penerima siaran&mdash;diaktifkan oleh pesan asinkron yang disebut <em>intent</em>.
Intent saling mengikat setiap komponen saat runtime (Anda bisa menganggapnya
sebagai pembawa pesan yang meminta tindakan dari komponen lain), baik komponen itu milik aplikasi Anda
atau milik aplikasi lain.</p>

<p>Intent dibuat dengan objek {@link android.content.Intent}, yang mendefinisikan pesan untuk
mengaktifkan komponen tertentu atau komponen <em>tipe</em> komponen tertentu&mdash;masing-masing intent
bisa eksplisit atau implisit.</p>

<p>Untuk aktivitas dan layanan, intent mendefinisikan tindakan yang akan dilakukan (misalnya, untuk "melihat" atau 
"mengirim" sesuatu) dan mungkin menetapkan URI data untuk ditindaklanjuti (salah satu hal yang mungkin perlu diketahui 
oleh komponen yang akan dimulai). Misalnya, intent mungkin menyampaikan permintaan suatu 
aktivitas untuk menampilkan gambar atau membuka halaman web. Dalam beberapa kasus, Anda bisa memulai
aktivitas untuk menerima hasil, dalam hal ini, aktivitas juga akan mengembalikan hasil 
dalam {@link android.content.Intent} (misalnya Anda bisa mengeluarkan intent agar
pengguna bisa memilih kontak pribadi dan memintanya dikembalikan kepada Anda&mdash;intent yang dikembalikan menyertakan URI yang 
menunjuk ke kontak yang dipilih).</p>

<p>Untuk penerima siaran, intent hanya mendefinisikan
pengumuman yang sedang disiarkan (misalnya, siaran untuk menunjukkan baterai perangkat hampir habis
hanya menyertakan string tindakan yang menunjukkan "baterai hampir habis").</p>

<p>Tipe komponen lainnya dan penyedia konten, tidak diaktifkan oleh intent. Melainkan
diaktifkan saat ditargetkan oleh permintaan dari {@link android.content.ContentResolver}. Resolver
konten menangani semua transaksi langsung dengan penyedia konten sehingga komponen yang melakukan 
transaksi dengan penyedia tidak perlu dan sebagai gantinya memanggil metode pada objek {@link
android.content.ContentResolver}. Ini membuat lapisan abstraksi antara penyedia
konten dan komponen yang meminta informasi (demi keamanan).</p>

<p>Ada beberapa metode terpisah untuk mengaktifkan masing-masing tipe komponen:</p>
<ul>
  <li>Anda bisa memulai aktivitas (atau memberinya pekerjaan baru) dengan 
meneruskan {@link android.content.Intent} ke {@link android.content.Context#startActivity
startActivity()} atau {@link android.app.Activity#startActivityForResult startActivityForResult()}
(bila Anda ingin aktivitas mengembalikan hasil).</li>
  <li>Anda bisa memulai layanan (atau memberikan instruksi baru ke layanan yang sedang berlangsung) dengan 
meneruskan {@link android.content.Intent} ke {@link android.content.Context#startService
startService()}. Atau Anda bisa mengikat ke layanan dengan meneruskan {@link android.content.Intent} ke
{@link android.content.Context#bindService bindService()}.</li>
  <li>Anda bisa memulai siaran dengan meneruskan {@link android.content.Intent} ke metode seperti
{@link android.content.Context#sendBroadcast(Intent) sendBroadcast()}, {@link
android.content.Context#sendOrderedBroadcast(Intent, String) sendOrderedBroadcast()}, atau {@link
android.content.Context#sendStickyBroadcast sendStickyBroadcast()}.</li>
  <li>Anda bisa melakukan query ke penyedia konten dengan memanggil {@link
android.content.ContentProvider#query query()} pada {@link android.content.ContentResolver}.</li>
</ul>

<p>Untuk informasi selengkapnya tentang menggunakan intent, lihat dokumen <a href="{@docRoot}guide/components/intents-filters.html">Intent dan Filter
 Intent</a>. Informasi selengkapnya tentang mengaktifkan komponen 
tertentu juga tersedia dalam dokumen berikut: <a href="{@docRoot}guide/components/activities.html">Aktivitas</a>, <a href="{@docRoot}guide/components/services.html">Layanan</a>, {@link
android.content.BroadcastReceiver} dan <a href="{@docRoot}guide/topics/providers/content-providers.html">Penyedia Konten</a>.</p>


<h2 id="Manifest">File Manifes</h2>

<p>Sebelum sistem Android bisa memulai komponen aplikasi, sistem harus mengetahui
keberadaan komponen dengan membaca file {@code AndroidManifest.xml} aplikasi (file 
"manifes"). Aplikasi Anda harus mendeklarasikan semua komponennya dalam file ini, yang harus menjadi akar
dari direktori proyek aplikasi.</p>

<p>Manifes melakukan banyak hal selain mendeklarasikan komponen aplikasi,
seperti:</p>
<ul>
  <li>Mengidentifikasi izin pengguna yang diperlukan aplikasi, seperti akses Internet atau
akses-baca ke kontak pengguna.</li>
  <li>Mendeklarasikan <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">API Level</a>
 minimum yang diperlukan aplikasi, berdasarkan API yang digunakan aplikasi.</li>
  <li>Mendeklarasikan fitur perangkat keras dan perangkat lunak yang diperlukan aplikasi, seperti kamera,
layanan Bluetooth, atau layar multisentuh.</li>
  <li>Pustaka API aplikasi perlu ditautkan (selain 
API kerangka kerja Android), seperti pustaka 
<a href="http://code.google.com/android/add-ons/google-apis/maps-overview.html">Google Maps.</a></li>
  <li>Dan lainnya</li>
</ul>


<h3 id="DeclaringComponents">Mendeklarasikan komponen</h3>

<p>Tugas utama manifes adalah menginformasikan komponen aplikasi pada sistem. Misalnya,
file manifes bisa mendeklarasikan aktivitas sebagai berikut: </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>Dalam elemen <code><a
href="{@docRoot}guide/topics/manifest/application-element.html">&lt;application&gt;</a></code>
, atribut {@code android:icon} menunjuk ke sumber daya untuk ikon yang mengidentifikasi
aplikasi.</p>

<p>Dalam elemen <code><a
href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code>, 
atribut {@code android:name} menetapkan nama kelas yang sepenuhnya memenuhi syarat subkelas {@link
android.app.Activity} dan atribut {@code android:label} menetapkan string yang akan
digunakan sebagai label yang terlihat oleh pengguna untuk aktivitas tersebut.</p>

<p>Anda harus mendeklarasikan semua komponen aplikasi dengan cara ini:</p>
<ul>
  <li>Elemen <code><a
href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code> untuk
aktivitas</li>
  <li>Elemen <code><a
href="{@docRoot}guide/topics/manifest/service-element.html">&lt;service&gt;</a></code> untuk
layanan</li>
  <li>Elemen <code><a
href="{@docRoot}guide/topics/manifest/receiver-element.html">&lt;receiver&gt;</a></code> untuk
penerima siaran</li>
  <li>Elemen <code><a
href="{@docRoot}guide/topics/manifest/provider-element.html">&lt;provider&gt;</a></code> untuk
penyedia konten</li>
</ul>

<p>Aktivitas, layanan, dan penyedia konten yang Anda sertakan dalam kode sumber, namun tidak
dideklarasikan dalam manifes, tidak akan terlihat pada sistem dan, akibatnya, tidak pernah bisa berjalan.  Akan tetapi,
penerima siaran 
bisa dideklarasikan dalam manifes atau dibuat secara dinamis dalam kode (sebagai objek 
{@link android.content.BroadcastReceiver}) dan didaftarkan pada sistem dengan memanggil
{@link android.content.Context#registerReceiver registerReceiver()}.</p>

<p>Untuk informasi selengkapnya tentang cara menstrukturkan file manifes untuk aplikasi Anda, 
lihat dokumentasi <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">File AndroidManifest.xml</a>. </p>



<h3 id="DeclaringComponentCapabilities">Mendeklarasikan kemampuan komponen</h3>

<p>Seperti telah dibahas di atas, dalam <a href="#ActivatingComponents">Mengaktifkan Komponen</a>, Anda bisa menggunakan
{@link android.content.Intent} untuk memulai aktivitas, layanan, dan penerima siaran. Anda bisa
melakukannya dengan menamai komponen sasaran secara eksplisit (menggunakan nama kelas komponen) dalam intent. Akan tetapi,
kemampuan intent sebenarnya ada pada konsep <em>intent implisit</em>. Intent implisit
cuma menjelaskan tipe tindakan yang akan dilakukan (dan, secara opsional, data tempat Anda ingin
melakukan tindakan) dan memungkinkan sistem untuk menemukan komponen pada perangkat yang bisa melakukan
tindakan tersebut dan memulainya. Jika ada banyak komponen yang bisa melakukan tindakan yang dijelaskan oleh intent,
maka pengguna bisa memilih komponen yang akan digunakan.</p>

<p>Cara sistem mengidentifikasi komponen yang bisa merespons intent adalah dengan membandingkan
intent yang diterima dengan <i>filter intent</i> yang disediakan dalam file manifes aplikasi lainnya pada
perangkat.</p>

<p>Bila mendeklarasikan aktivitas dalam manifes aplikasi, secara opsional Anda bisa menyertakan
filter intent yang mendeklarasikan kemampuan aktivitas agar bisa merespons intent dari
aplikasi lain. Anda bisa mendeklarasikan filter intent untuk komponen dengan
menambahkan elemen <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code
&lt;intent-filter&gt;}</a> sebagai anak elemen deklarasi komponen.</p>

<p>Misalnya, jika Anda telah membangun aplikasi email dengan aktivitas untuk menulis email baru, Anda bisa
mendeklarasikan filter intent untuk merespons intent "kirim" (untuk mengirim email baru) seperti ini:</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>Kemudian, jika aplikasi lain membuat intent dengan tindakan {@link
android.content.Intent#ACTION_SEND} dan meneruskannya ke {@link android.app.Activity#startActivity
startActivity()}, sistem bisa memulai aktivitas Anda agar pengguna bisa menulis draf dan mengirim
email.</p>

<p>Untuk informasi selengkapnya tentang membuat filter intent, lihat dokumen <a href="{@docRoot}guide/components/intents-filters.html">Intent dan Filter Intent</a>.
</p>



<h3 id="DeclaringRequirements">Mendeklarasikan kebutuhan aplikasi</h3>

<p>Ada berbagai macam perangkat yang didukung oleh Android dan tidak
semuanya menyediakan fitur dan kemampuan yang sama. Agar aplikasi Anda tidak dihapus pada perangkat yang tidak memiliki
fitur yang diperlukan aplikasi, Anda harus jelas mendefinisikan profil mengenai
tipe perangkat yang didukung aplikasi dengan mendeklarasikan kebutuhan perangkat dan perangkat lunak dalam file
manifes. Kebanyakan deklarasi ini hanya bersifat informasi dan sistem tidak
membacanya, namun layanan eksternal seperti Google Play akan membacanya untuk menyediakan
penyaringan bagi pengguna saat mereka mencari aplikasi dari perangkat.</p>

<p>Misalnya, jika aplikasi memerlukan kamera dan menggunakan API yang disediakan dalam Android 2.1 (<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">API Level</a> 7)
, Anda harus mendeklarasikannya sebagai kebutuhan dalam file manifes seperti ini:</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>Sekarang, perangkat yang <em>tidak</em> memiliki kamera dan menggunakan 
Android versi <em>lebih rendah</em> dari 2.1 tidak bisa menginstal aplikasi Anda dari Google Play.</p>

<p>Akan tetapi, bisa juga mendeklarasikan bahwa aplikasi Anda menggunakan kamera, namun tidak 
<em>mengharuskannya</em>. Dalam hal itu, aplikasi Anda harus mengatur atribut <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html#required">{@code required}</a>
 ke {@code "false"} dan memeriksa saat runtime apakah
perangkat memiliki kamera dan menonaktifkan setiap fitur kamera yang sesuai.</p>

<p>Informasi selengkapnya tentang cara mengelola kompatibilitas aplikasi dengan
perangkat yang berbeda disediakan dalam dokumen
<a href="{@docRoot}guide/practices/compatibility.html">Kompatibilitas Perangkat</a>.</p>



<h2 id="Resources">Sumber Daya Aplikasi</h2>

<p>Aplikasi Android tidak hanya terdiri dari kode&mdash;Aplikasi memerlukan sumber daya yang
terpisah dari kode sumber, seperti gambar, file audio, dan apa saja yang berkaitan dengan
presentasi visual dari aplikasi. Misalnya, Anda harus mendefinisikan animasi, menu, gaya, warna,
dan layout antarmuka pengguna aktivitas dengan file XML. Penggunaan sumber daya aplikasi
mempermudah pembaruan berbagai karakteristik aplikasi Anda tanpa memodifikasi kode dan&mdash;dengan menyediakan
seperangkat sumber daya alternatif&mdash;memungkinkan Anda mengoptimalkan aplikasi untuk berbagai konfigurasi
perangkat berbeda (seperti bahasa dan ukuran layar yang berbeda).</p>

<p>Untuk setiap sumber daya yang Anda sertakan dalam proyek Android, alat bawaan SDK akan mendefinisikan ID integer
unik, yang bisa Anda gunakan untuk mengacu sumber daya dari kode aplikasi atau dari sumber daya lainnya yang
didefinisikan dalam XML. Misalnya, jika aplikasi berisi file gambar bernama {@code
logo.png} (disimpan dalam direktori {@code res/drawable/}), alat SDK akan menghasilkan ID sumber daya
bernama {@code R.drawable.logo}, yang bisa Anda gunakan untuk mengacu gambar dan memasukkannya dalam
antarmuka pengguna.</p>

<p>Salah satu aspek paling penting dari penyediaan sumber daya yang terpisah dari
kode sumber adalah kemampuan Anda menyediakan sumber daya alternatif untuk konfigurasi perangkat
yang berbeda. Misalnya, dengan mendefinisikan string UI dalam XML, Anda bisa menerjemahkan string ke dalam
bahasa lain dan menyimpan string itu dalam file terpisah. Kemudian, berdasarkan <em>qualifier</em>
bahasa yang ditambahkan ke nama direktori sumber daya (seperti {@code res/values-fr/} untuk nilai
string Prancis) dan pengaturan bahasa pengguna, sistem Android akan menerapkan string bahasa yang sesuai
untuk UI Anda.</p>

<p>Android mendukung banyak <em>qualifier</em> berbeda untuk sumber daya alternatif Anda. Qualifier
adalah string pendek yang Anda sertakan dalam nama direktori sumber
daya untuk mendefinisikan konfigurasi perangkat yang harus digunakan sumber daya tersebut. Contoh lainnya,
Anda harus sering membuat layout berbeda untuk aktivitas, bergantung pada
orientasi layar dan ukuran perangkat. Misalnya, saat layar perangkat dalam orientasi
tegak, Anda mungkin ingin layout tombolnya vertikal, tetapi saat layar dalam orientasi
mendatar, tombolnya harus sejajar horizontal. Untuk mengubah layout
sesuai orientasi, Anda bisa mendefinisikan dua layout berbeda dan menerapkan qualifier yang
tepat untuk setiap nama direktori layout. Kemudian, sistem secara otomatis menerapkan
layout yang tepat sesuai dengan orientasi perangkat saat ini.</p>

<p>Untuk informasi selengkapnya tentang berbagai jenis sumber daya yang bisa disertakan dalam aplikasi dan cara
membuat sumber daya alternatif untuk konfigurasi perangkat berbeda, bacalah <a href="{@docRoot}guide/topics/resources/providing-resources.html">Menyediakan Sumber Daya</a>.</p>



<div class="next-docs">
<div class="col-6">
  <h2 class="norule">Teruskan membaca tentang:</h2>
  <dl>
    <dt><a href="{@docRoot}guide/components/intents-filters.html">Intent dan Filter Intent</a>
    </dt>
    <dd>Informasi tentang cara menggunakan API {@link android.content.Intent} untuk
 mengaktifkan komponen aplikasi, seperti aktivitas dan layanan, dan cara menyediakan komponen aplikasi
 untuk digunakan oleh aplikasi lain.</dd>
    <dt><a href="{@docRoot}guide/components/activities.html">Aktivitas</a></dt>
    <dd>Informasi tentang cara membuat instance kelas {@link android.app.Activity}, 
yang menyediakan layar tersendiri dalam aplikasi bersama antarmuka pengguna.</dd>
    <dt><a href="{@docRoot}guide/topics/resources/providing-resources.html">Menyediakan Sumber Daya</a></dt>
    <dd>Informasi tentang cara aplikasi Android disusun untuk memisahkan sumber daya aplikasi dari
kode aplikasi, termasuk cara Anda bisa menyediakan sumber daya alternatif untuk 
konfigurasi perangkat tertentu.
    </dd>
  </dl>
</div>
<div class="col-6">
  <h2 class="norule">Anda juga mungkin tertarik dengan:</h2>
  <dl>
    <dt><a href="{@docRoot}guide/practices/compatibility.html">Kompatibilitas Perangkat</a></dt>
    <dd>Informasi tentang cara kerja Android pada berbagai tipe perangkat dan 
pengenalan mengenai cara mengoptimalkan aplikasi untuk setiap perangkat atau membatasi ketersediaan aplikasi Anda untuk
perangkat berbeda.</dd>
    <dt><a href="{@docRoot}guide/topics/security/permissions.html">Izin Sistem</a></dt>
    <dd>Informasi tentang cara Android membatasi akses aplikasi pada API tertentu dengan sistem izin 
yang mengharuskan persetujuan pengguna agar aplikasi dapat menggunakan API tersebut.</dd>
  </dl>
</div>
</div>