1682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnspage.title=Layanan Terikat
2682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsparent.title=Layanan
3682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsparent.link=services.html
4682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns@jd:body
5682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
6682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
7682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<div id="qv-wrapper">
8682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<ol id="qv">
9682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<h2>Dalam dokumen ini</h2>
10682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<ol>
11682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li><a href="#Basics">Dasar-Dasar</a></li>
12682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li><a href="#Creating">Membuat Layanan Terikat</a>
13682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    <ol>
14682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns      <li><a href="#Binder">Memperluas kelas Binder</a></li>
15682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns      <li><a href="#Messenger">Menggunakan Messenger</a></li>
16682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    </ol>
17682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  </li>
18682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li><a href="#Binding">Mengikat ke Layanan</a></li>
19682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li><a href="#Lifecycle">Mengelola Daur Hidup Layanan Terikat</a></li>
20682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</ol>
21682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
22682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<h2>Kelas-kelas utama</h2>
23682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<ol>
24682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>{@link android.app.Service}</li>
25682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>{@link android.content.ServiceConnection}</li>
26682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>{@link android.os.IBinder}</li>
27682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</ol>
28682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
29682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<h2>Contoh</h2>
30682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<ol>
31682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html">{@code
32682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns      RemoteService}</a></li>
33682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html">{@code
34682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns      LocalService}</a></li>
35682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</ol>
36682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
37682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<h2>Lihat juga</h2>
38682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<ol>
39682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li><a href="{@docRoot}guide/components/services.html">Layanan</a></li>
40682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</ol>
41682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</div>
42682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
43682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
44682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Layanan terikat adalah server di antarmuka klien-server. Layanan terikat memungkinkan komponen-komponen
45682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns(seperti aktivitas) untuk diikat ke layanan, mengirim permintaan, menerima respons, dan bahkan melakukan
46682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnskomunikasi antarproses (IPC). Layanan terikat biasanya hidup hanya saat melayani
47682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnskomponen aplikasi lain dan tidak berjalan di latar belakang terus-menerus.</p>
48682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
49682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Dokumen ini menampilkan cara membuat layanan terikat, termasuk cara mengikat
50682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnske layanan dari komponen aplikasi lain. Akan tetapi, Anda juga harus mengacu dokumen <a href="{@docRoot}guide/components/services.html">Layanan</a> untuk
51682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsinformasi tambahan tentang layanan secara umum, seperti cara menyampaikan pemberitahuan dari layanan, mengatur
52682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslayanan agar berjalan di latar depan, dan lain-lain.</p>
53682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
54682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
55682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<h2 id="Basics">Dasar-Dasar</h2>
56682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
57682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Layanan terikat adalah implementasi kelas {@link android.app.Service} yang memungkinkan
58682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsaplikasi lain diikat padanya dan berinteraksi dengannya. Untuk menyediakan pengikatan bagi sebuah
59682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslayanan, Anda harus mengimplementasikan metode callback {@link android.app.Service#onBind onBind()}. Metode ini
60682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsmenghasilkan objek {@link android.os.IBinder} yang mendefinisikan antarmuka pemprograman yang
61682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsbisa digunakan klien untuk berinteraksi dengan layanan.</p>
62682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
63682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<div class="sidebox-wrapper">
64682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<div class="sidebox">
65682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <h3>Mengikat ke Layanan yang Sudah Dimulai</h3>
66682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
67682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Seperti dibahas dalam dokumen <a href="{@docRoot}guide/components/services.html">Layanan</a>
68682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns, Anda bisa membuat layanan yang dimulai sekaligus diikat. Yakni, layanan bisa
69682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsdimulai dengan memanggil {@link android.content.Context#startService startService()}, yang memungkinkan
70682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslayanan berjalan terus-menerus, dan juga membolehkan klien untuk mengikat ke layanan dengan memanggil {@link
71682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.content.Context#bindService bindService()}.
72682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <p>Jika Anda mengizinkan layanan dimulai dan diikat, lalu ketika layanan telah
73682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsdimulai, sistem <em>tidak</em> menghapus layanan ketika semua klien melepas ikatan. Sebagai gantinya, Anda harus
74682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsmenghentikan layanan secara eksplisit, dengan memanggil {@link android.app.Service#stopSelf stopSelf()} atau {@link
75682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.content.Context#stopService stopService()}.</p>
76682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
77682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Walaupun Anda biasanya harus mengimplementasikan {@link android.app.Service#onBind onBind()}
78682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<em>atau</em> {@link android.app.Service#onStartCommand onStartCommand()}, kadang-kadang perlu
79682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsmengimplementasikan keduanya. Misalnya, sebuah pemutar musik bisa merasakan manfaatnya karena layanannya boleh berjalan
80682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsterus-menerus dan juga menyediakan pengikatan. Dengan cara ini, sebuah aktivitas bisa memulai layanan untuk memutar beberapa
81682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslagu dan musik terus dimainkan sekalipun pengguna meninggalkan aplikasi. Lalu, bila pengguna
82682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnskembali ke aplikasi, aktivitas bisa mengikat ke layanan untuk mendapatkan kembali kontrol atas pemutaran.</p>
83682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
84682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Pastikan membaca bagian tentang <a href="#Lifecycle">Mengelola Daur Hidup Layanan
85682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsTerikat</a>, untuk informasi selengkapnya tentang daur hidup layanan saat menambahkan pengikatan ke
86682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslayanan yang sudah dimulai.</p>
87682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</div>
88682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</div>
89682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
90682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Klien bisa mengikat ke layanan dengan memanggil {@link android.content.Context#bindService
91682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsbindService()}. Bila itu dilakukan, klien harus menyediakan implementasi {@link
92682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.content.ServiceConnection}, yang memantau koneksi dengan layanan. Metode {@link
93682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.content.Context#bindService bindService()} kembali dengan serta-merta tanpa sebuah nilai, namun
94682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsbila sistem Android membuat koneksi antara klien
95682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsdan layanan, sistem akan memanggil {@link
96682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.content.ServiceConnection#onServiceConnected onServiceConnected()} pada {@link
97682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.content.ServiceConnection} untuk mengirim {@link android.os.IBinder} yang
98682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsbisa digunakan klien untuk berkomunikasi dengan layanan.</p>
99682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
100682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Beberapa klien bisa terhubung ke layanan dengan serentak. Akan tetapi, sistem akan memanggil metode
101682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns{@link android.app.Service#onBind onBind()} layanan Anda untuk mengambil {@link android.os.IBinder} hanya
102682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsbila klien pertama mengikat. Sistem lalu memberikan {@link android.os.IBinder} yang sama ke setiap
103682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsklien tambahan yang mengikat, tanpa memanggil {@link android.app.Service#onBind onBind()} lagi.</p>
104682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
105682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Bila klien terakhir melepas ikatan dari layanan, sistem akan menghapus layanan (kecuali jika
106682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslayanan juga dimulai oleh {@link android.content.Context#startService startService()}).</p>
107682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
108682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Bila Anda mengimplementasikan layanan terikat, yang terpenting adalah mendefinisikan antarmuka
109682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsyang dihasilkan metode callback {@link android.app.Service#onBind onBind()} Anda. Ada sedikit
110682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnscara mendefinisikan antarmuka {@link android.os.IBinder} layanan Anda dan bagian berikut
111682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsakan membahas masing-masing teknik.</p>
112682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
113682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
114682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
115682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<h2 id="Creating">Membuat Layanan Terikat</h2>
116682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
117682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Saat membuat layanan yang menyediakan pengikatan, Anda harus menyediakan {@link android.os.IBinder}
118682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsyang menyediakan antarmuka pemrograman yang bisa digunakan klien untuk berinteraksi dengan layanan. Ada
119682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnstiga cara untuk mendefinisikan antarmuka:</p>
120682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
121682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<dl>
122682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <dt><a href="#Binder">Memperluas kelas Binder</a></dt>
123682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <dd>Jika layanan Anda bersifat privat untuk aplikasi Anda sendiri dan berjalan dalam proses yang sama dengan klien
124682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns(biasanya), Anda harus membuat antarmuka dengan memperluas kelas {@link android.os.Binder}
125682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsdan menghasilkan instance dari
126682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns{@link android.app.Service#onBind onBind()}. Klien akan menerima {@link android.os.Binder} dan
127682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsbisa menggunakannya untuk mengakses langsung metode publik yang tersedia dalam implementasi {@link android.os.Binder}
128682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsatau bahkan {@link android.app.Service}.
129682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <p>Inilah teknik yang lebih disukai bila layanan Anda sekadar pekerja latar belakang untuk aplikasi Anda
130682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnssendiri. Satu-satunya alasan tidak membuat antarmuka dengan cara ini adalah karena
131682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslayanan Anda akan digunakan oleh aplikasi lain atau pada proses-proses terpisah.</dd>
132682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
133682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <dt><a href="#Messenger">Menggunakan Messenger</a></dt>
134682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <dd>Jika antarmuka Anda perlu bekerja lintas proses, Anda bisa membuat
135682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsantarmuka untuk layanan dengan {@link android.os.Messenger}. Dengan cara ini, layanan
136682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsmendefinisikan {@link android.os.Handler} yang akan merespons aneka tipe objek {@link
137682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.os.Message}. {@link android.os.Handler}
138682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsini adalah dasar bagi {@link android.os.Messenger} yang nanti bisa berbagi {@link android.os.IBinder}
139682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsdengan klien, sehingga memungkinkan klien mengirim perintah ke layanan dengan menggunakan objek {@link
140682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.os.Message}. Selain itu, klien bisa mendefinisikan sendiri {@link android.os.Messenger} 
141682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnssehingga layanan bisa mengirim balik pesan.
142682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <p>Inilah cara termudah melakukan komunikasi antarproses (IPC), karena {@link
143682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.os.Messenger} akan mengantre semua permintaan ke dalam satu thread sehingga Anda tidak perlu mendesain
144682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslayanan agar thread-safe.</p>
145682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  </dd>
146682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
147682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <dt>Menggunakan AIDL</dt>
148682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <dd>AIDL (Android Interface Definition Language) melakukan semua pekerjaan untuk mengurai objek menjadi
149682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsprimitif yang bisa dipahami dan diarahkan oleh sistem operasi ke berbagai proses untuk melakukan
150682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsIPC. Teknik sebelumnya, dengan menggunakan {@link android.os.Messenger}, sebenarnya berdasarkan AIDL sebagai
151682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsstruktur yang mendasarinya. Seperti disebutkan di atas, {@link android.os.Messenger} membuat antrean
152682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnssemua permintaan klien dalam satu thread, sehingga layanan akan menerima permintaan satu per satu. Akan tetapi,
153682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsjika ingin layanan Anda menangani beberapa permintaan sekaligus, Anda bisa menggunakan AIDL
154682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnssecara langsung. Dalam hal ini, layanan Anda harus mampu multi-thread dan dibuat thread-safe.
155682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <p>Untuk menggunakan AIDL secara langsung, Anda harus
156682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsmembuat file {@code .aidl} yang mendefinisikan antarmuka pemrograman. Alat Android SDK menggunakan
157682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsfile ini untuk menghasilkan kelas abstrak yang mengimplementasikan antarmuka dan menangani IPC, yang nanti
158682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsbisa Anda perluas dalam layanan.</p>
159682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  </dd>
160682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</dl>
161682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
162682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <p class="note"><strong>Catatan:</strong> Umumnya aplikasi <strong>tidak boleh</strong> menggunakan AIDL untuk
163682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsmembuat layanan terikat, karena hal itu mungkin memerlukan kemampuan multi-thread dan
164682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsbisa mengakibatkan implementasi yang lebih rumit. Dengan demikian, AIDL tidak cocok untuk sebagian besar aplikasi
165682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsdan dokumen ini tidak membahas cara menggunakannya untuk layanan Anda. Jika Anda yakin perlu
166682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsmenggunakan AIDL secara langsung, lihat dokumen <a href="{@docRoot}guide/components/aidl.html">AIDL</a>
167682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns.</p>
168682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
169682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
170682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
171682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
172682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<h3 id="Binder">Memperluas kelas Binder</h3>
173682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
174682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Jika layanan Anda hanya digunakan oleh aplikasi lokal dan tidak perlu bekerja lintas proses,
175682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsmaka Anda bisa mengimplementasikan kelas {@link android.os.Binder} Anda sendiri yang memberi klien Anda
176682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsakses langsung ke metode publik dalam layanan.</p>
177682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
178682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p class="note"><strong>Catatan:</strong> Hal ini hanya berhasil jika klien dan layanan berada dalam
179682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsaplikasi dan proses yang sama, suatu kondisi yang paling umum. Misalnya, cara ini sangat cocok untuk sebuah aplikasi musik
180682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsyang perlu mengikat aktivitas ke layanannya sendiri, yakni memutar musik di
181682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslatar belakang.</p>
182682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
183682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Berikut cara menyiapkannya:</p>
184682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<ol>
185682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>Dalam layanan Anda, buat sebuah instance {@link android.os.Binder} yang:
186682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    <ul>
187682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns      <li>berisi metode publik yang bisa dipanggil klien</li>
188682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns      <li>menghasilkan instance {@link android.app.Service} saat ini, yang memiliki metode publik yang
189682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsbisa dipanggil klien</li>
190682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns      <li>atau, menghasilkan instance kelas lain yang host-nya di layanan dengan metode publik yang
191682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsbisa dipanggil klien</li>
192682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    </ul>
193682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>Hasilkan instance {@link android.os.Binder} ini dari metode callback {@link
194682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.app.Service#onBind onBind()}.</li>
195682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>Di klien, terima {@link android.os.Binder} dari metode callback {@link
196682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.content.ServiceConnection#onServiceConnected onServiceConnected()} dan
197682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsbuat panggilan ke layanan terikat dengan menggunakan metode yang disediakan.</li>
198682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</ol>
199682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
200682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p class="note"><strong>Catatan:</strong> Alasan layanan dan klien harus berada dalam aplikasi yang sama
201682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsadalah agar klien bisa mengkonversi objek yang dihasilkan dan memanggil API-nya dengan benar. Layanan
202682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsdan klien juga harus berada dalam proses yang sama, karena teknik ini tidak melakukan
203682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnspengarahan (marshalling) apa pun untuk lintas proses.</p>
204682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
205682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Misalnya, berikut ini adalah layanan yang memberi klien akses ke metode-metode dalam layanan melalui
206682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsimplementasi {@link android.os.Binder}:</p>
207682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
208682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<pre>
209682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnspublic class LocalService extends Service {
210682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    // Binder given to clients
211682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    private final IBinder mBinder = new LocalBinder();
212682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    // Random number generator
213682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    private final Random mGenerator = new Random();
214682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
215682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    /**
216682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns     * Class used for the client Binder.  Because we know this service always
217682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns     * runs in the same process as its clients, we don't need to deal with IPC.
218682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns     */
219682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    public class LocalBinder extends Binder {
220682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        LocalService getService() {
221682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            // Return this instance of LocalService so clients can call public methods
222682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            return LocalService.this;
223682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        }
224682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    }
225682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
226682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    &#64;Override
227682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    public IBinder onBind(Intent intent) {
228682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        return mBinder;
229682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    }
230682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
231682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    /** method for clients */
232682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    public int getRandomNumber() {
233682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns      return mGenerator.nextInt(100);
234682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    }
235682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns}
236682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</pre>
237682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
238682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>{@code LocalBinder} menyediakan {@code getService()} metode bagi klien untuk mengambil
239682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsinstance {@code LocalService} saat ini. Cara ini memungkinkan klien memanggil metode publik dalam
240682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslayanan. Misalnya, klien bisa memanggil {@code getRandomNumber()} dari layanan.</p>
241682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
242682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Berikut ini adalah aktivitas yang mengikat ke {@code LocalService} dan memanggil {@code getRandomNumber()}
243682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsbila tombol diklik:</p>
244682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
245682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<pre>
246682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnspublic class BindingActivity extends Activity {
247682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    LocalService mService;
248682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    boolean mBound = false;
249682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
250682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    &#64;Override
251682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    protected void onCreate(Bundle savedInstanceState) {
252682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        super.onCreate(savedInstanceState);
253682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        setContentView(R.layout.main);
254682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    }
255682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
256682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    &#64;Override
257682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    protected void onStart() {
258682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        super.onStart();
259682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        // Bind to LocalService
260682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        Intent intent = new Intent(this, LocalService.class);
261682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
262682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    }
263682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
264682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    &#64;Override
265682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    protected void onStop() {
266682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        super.onStop();
267682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        // Unbind from the service
268682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        if (mBound) {
269682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            unbindService(mConnection);
270682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            mBound = false;
271682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        }
272682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    }
273682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
274682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    /** Called when a button is clicked (the button in the layout file attaches to
275682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns      * this method with the android:onClick attribute) */
276682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    public void onButtonClick(View v) {
277682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        if (mBound) {
278682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            // Call a method from the LocalService.
279682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            // However, if this call were something that might hang, then this request should
280682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            // occur in a separate thread to avoid slowing down the activity performance.
281682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            int num = mService.getRandomNumber();
282682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show();
283682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        }
284682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    }
285682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
286682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    /** Defines callbacks for service binding, passed to bindService() */
287682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    private ServiceConnection mConnection = new ServiceConnection() {
288682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
289682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        &#64;Override
290682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        public void onServiceConnected(ComponentName className,
291682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns                IBinder service) {
292682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            // We've bound to LocalService, cast the IBinder and get LocalService instance
293682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            LocalBinder binder = (LocalBinder) service;
294682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            mService = binder.getService();
295682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            mBound = true;
296682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        }
297682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
298682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        &#64;Override
299682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        public void onServiceDisconnected(ComponentName arg0) {
300682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            mBound = false;
301682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        }
302682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    };
303682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns}
304682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</pre>
305682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
306682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Contoh di atas menampilkan cara klien mengikat ke layanan dengan menggunakan implementasi
307682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns{@link android.content.ServiceConnection} dan callback {@link
308682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.content.ServiceConnection#onServiceConnected onServiceConnected()}. Bagian
309682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsberikut menyediakan informasi selengkapnya tentang proses pengikatan ke layanan.</p>
310682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
311682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p class="note"><strong>Catatan:</strong> Contoh di atas tidak secara eksplisit melepas ikatan dari layanan,
312682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsnamun semua klien harus melepas ikatan pada waktu yang tepat (seperti saat aktivitas sedang jeda).</p>
313682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
314682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Untuk contoh kode selengkapnya, lihat kelas <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html">{@code
315682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsLocalService.java}</a> dan kelas <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceActivities.html">{@code
316682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsLocalServiceActivities.java}</a> dalam <a href="{@docRoot}resources/samples/ApiDemos/index.html">ApiDemos</a>.</p>
317682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
318682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
319682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
320682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
321682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
322682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<h3 id="Messenger">Menggunakan Messenger</h3>
323682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
324682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<div class="sidebox-wrapper">
325682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<div class="sidebox">
326682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <h4>Dibandingkan dengan AIDL</h4>
327682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <p>Bila Anda perlu melakukan IPC, menggunakan {@link android.os.Messenger} untuk antarmuka
328682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslebih sederhana daripada mengimplementasikannya dengan AIDL, karena {@link android.os.Messenger} mengantre
329682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnssemua panggilan ke layanan, sementara antarmuka AIDL murni mengirim permintaan serentak ke
330682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslayanan, yang nanti harus menangani multi-threading.</p>
331682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <p>Untuk sebagian besar aplikasi, layanan tidak perlu melakukan multi-threading, jadi dengan menggunakan {@link
332682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.os.Messenger} memungkinkan layanan menangani panggilan satu per satu. Jika
333682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslayanan harus multi-thread, Anda harus menggunakan <a href="{@docRoot}guide/components/aidl.html">AIDL</a> untuk mendefinisikan antarmuka.</p>
334682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</div>
335682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</div>
336682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
337682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Jika layanan perlu berkomunikasi dengan proses jauh, Anda bisa menggunakan
338682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns{@link android.os.Messenger} untuk menyediakan antarmuka bagi layanan Anda. Teknik ini memungkinkan
339682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsAnda melakukan komunikasi antarproses (IPC) tanpa harus menggunakan AIDL.</p>
340682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
341682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Berikut ini rangkuman cara menggunakan {@link android.os.Messenger}:</p>
342682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
343682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<ul>
344682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>Layanan mengimplementasikan {@link android.os.Handler} yang menerima callback untuk tiap
345682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnspanggilan dari klien.</li>
346682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>{@link android.os.Handler} digunakan untuk membuat objek {@link android.os.Messenger}
347682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns(yang merupakan acuan ke {@link android.os.Handler}).</li>
348682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>{@link android.os.Messenger} membuat {@link android.os.IBinder} yang
349682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsdikembalikan layanan ke klien dari {@link android.app.Service#onBind onBind()}.</li>
350682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>Klien menggunakan {@link android.os.IBinder} untuk membuat instance {@link android.os.Messenger}
351682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns(yang mengacu {@link android.os.Handler} layanan), yang digunakan klien untuk mengirim
352682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsobjek {@link android.os.Message} ke layanan.</li>
353682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>Layanan menerima setiap {@link android.os.Message} dalam {@link
354682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.os.Handler}&mdash;secara spesifik, dalam metode {@link android.os.Handler#handleMessage
355682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnshandleMessage()}.</li>
356682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</ul>
357682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
358682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
359682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Dengan cara ini, tidak ada "metode" untuk dipanggil klien pada layanan. Sebagai gantinya,
360682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsklien mengirim "pesan" (objek-objek {@link android.os.Message}) yang diterima layanan dalam
361682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns{@link android.os.Handler}-nya.</p>
362682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
363682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Berikut ini contoh layanan sederhana yang menggunakan antarmuka {@link android.os.Messenger}:</p>
364682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
365682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<pre>
366682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnspublic class MessengerService extends Service {
367682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    /** Command to the service to display a message */
368682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    static final int MSG_SAY_HELLO = 1;
369682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
370682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    /**
371682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns     * Handler of incoming messages from clients.
372682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns     */
373682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    class IncomingHandler extends Handler {
374682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        &#64;Override
375682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        public void handleMessage(Message msg) {
376682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            switch (msg.what) {
377682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns                case MSG_SAY_HELLO:
378682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns                    Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show();
379682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns                    break;
380682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns                default:
381682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns                    super.handleMessage(msg);
382682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            }
383682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        }
384682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    }
385682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
386682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    /**
387682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns     * Target we publish for clients to send messages to IncomingHandler.
388682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns     */
389682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    final Messenger mMessenger = new Messenger(new IncomingHandler());
390682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
391682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    /**
392682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns     * When binding to the service, we return an interface to our messenger
393682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns     * for sending messages to the service.
394682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns     */
395682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    &#64;Override
396682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    public IBinder onBind(Intent intent) {
397682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show();
398682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        return mMessenger.getBinder();
399682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    }
400682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns}
401682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</pre>
402682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
403682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Perhatikan bahwa metode {@link android.os.Handler#handleMessage handleMessage()} dalam
404682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns{@link android.os.Handler} adalah tempat layanan menerima {@link android.os.Message}
405682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsyang masuk dan memutuskan aksi yang harus dilakukan, berdasarkan anggota {@link android.os.Message#what}.</p>
406682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
407682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Klien tinggal membuat {@link android.os.Messenger} berdasarkan {@link
408682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.os.IBinder} yang dihasilkan layanan dan mengirim pesan menggunakan {@link
409682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.os.Messenger#send send()}. Misalnya, berikut ini adalah aktivitas sederhana yang mengikat ke
410682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslayanan dan mengirim pesan {@code MSG_SAY_HELLO} ke layanan:</p>
411682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
412682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<pre>
413682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnspublic class ActivityMessenger extends Activity {
414682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    /** Messenger for communicating with the service. */
415682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    Messenger mService = null;
416682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
417682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    /** Flag indicating whether we have called bind on the service. */
418682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    boolean mBound;
419682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
420682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    /**
421682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns     * Class for interacting with the main interface of the service.
422682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns     */
423682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    private ServiceConnection mConnection = new ServiceConnection() {
424682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        public void onServiceConnected(ComponentName className, IBinder service) {
425682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            // This is called when the connection with the service has been
426682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            // established, giving us the object we can use to
427682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            // interact with the service.  We are communicating with the
428682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            // service using a Messenger, so here we get a client-side
429682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            // representation of that from the raw IBinder object.
430682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            mService = new Messenger(service);
431682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            mBound = true;
432682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        }
433682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
434682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        public void onServiceDisconnected(ComponentName className) {
435682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            // This is called when the connection with the service has been
436682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            // unexpectedly disconnected -- that is, its process crashed.
437682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            mService = null;
438682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            mBound = false;
439682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        }
440682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    };
441682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
442682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    public void sayHello(View v) {
443682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        if (!mBound) return;
444682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        // Create and send a message to the service, using a supported 'what' value
445682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);
446682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        try {
447682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            mService.send(msg);
448682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        } catch (RemoteException e) {
449682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            e.printStackTrace();
450682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        }
451682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    }
452682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
453682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    &#64;Override
454682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    protected void onCreate(Bundle savedInstanceState) {
455682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        super.onCreate(savedInstanceState);
456682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        setContentView(R.layout.main);
457682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    }
458682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
459682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    &#64;Override
460682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    protected void onStart() {
461682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        super.onStart();
462682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        // Bind to the service
463682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        bindService(new Intent(this, MessengerService.class), mConnection,
464682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            Context.BIND_AUTO_CREATE);
465682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    }
466682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
467682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    &#64;Override
468682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    protected void onStop() {
469682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        super.onStop();
470682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        // Unbind from the service
471682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        if (mBound) {
472682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            unbindService(mConnection);
473682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns            mBound = false;
474682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        }
475682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    }
476682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns}
477682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</pre>
478682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
479682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Perhatikan bahwa contoh ini tidak menampilkan cara layanan merespons klien. Jika ingin
480682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslayanan merespons, Anda juga perlu membuat {@link android.os.Messenger} di klien. Lalu
481682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnssaat menerima callback {@link android.content.ServiceConnection#onServiceConnected
482682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsonServiceConnected()}, klien akan mengirim {@link android.os.Message} ke layanan yang berisi
483682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns{@link android.os.Messenger} klien dalam parameter {@link android.os.Message#replyTo}
484682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsmetode {@link android.os.Messenger#send send()}.</p>
485682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
486682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Anda bisa melihat contoh cara menyediakan pertukaran pesan dua arah dalam contoh <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/MessengerService.html">{@code
487682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsMessengerService.java}</a> (layanan) dan <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/MessengerServiceActivities.html">{@code
488682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsMessengerServiceActivities.java}</a> (klien).</p>
489682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
490682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
491682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
492682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
493682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
494682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<h2 id="Binding">Mengikat ke Layanan</h2>
495682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
496682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Komponen-komponen aplikasi (klien) bisa mengikat ke layanan dengan memanggil
497682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns{@link android.content.Context#bindService bindService()}. Sistem Android
498682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslalu memanggil metode {@link android.app.Service#onBind
499682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsonBind()} layanan, yang menghasilkan {@link android.os.IBinder} untuk berinteraksi dengan layanan.</p>
500682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
501682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Pengikatan ini bersifat asinkron. {@link android.content.Context#bindService
502682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsbindService()} segera kembali dan <em>tidak</em> mengembalikan {@link android.os.IBinder} ke
503682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsklien. Untuk menerima {@link android.os.IBinder}, klien harus membuat instance {@link
504682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.content.ServiceConnection} dan meneruskannya ke {@link android.content.Context#bindService
505682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsbindService()}. {@link android.content.ServiceConnection} berisi metode callback yang
506682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsdipanggil sistem untuk mengirim {@link android.os.IBinder}.</p>
507682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
508682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p class="note"><strong>Catatan:</strong> Hanya aktivitas, layanan, dan penyedia konten yang bisa mengikat
509682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnske layanan yang&mdash;Anda <strong>tidak bisa</strong> ikat ke layanan dari penerima siaran.</p>
510682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
511682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Jadi, untuk mengikat ke layanan dari klien, Anda harus: </p>
512682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<ol>
513682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>Mengimplementasikan {@link android.content.ServiceConnection}.
514682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    <p>Implementasi Anda harus mengesampingkan dua metode callback:</p>
515682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    <dl>
516682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns      <dt>{@link android.content.ServiceConnection#onServiceConnected onServiceConnected()}</dt>
517682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        <dd>Sistem memanggil ini untuk mengirim {@link android.os.IBinder} yang dihasilkan oleh
518682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsmetode {@link android.app.Service#onBind onBind()} layanan.</dd>
519682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns      <dt>{@link android.content.ServiceConnection#onServiceDisconnected
520682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsonServiceDisconnected()}</dt>
521682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        <dd>Sistem Android memanggil ini bila koneksi ke layanan putus
522682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnstanpa terduga, seperti ketika layanan mengalami crash atau dimatikan. Ini <em>tidak</em> dipanggil ketika
523682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsklien melepas ikatan.</dd>
524682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    </dl>
525682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  </li>
526682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>Panggil {@link
527682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.content.Context#bindService bindService()}, dengan meneruskan implementasi {@link
528682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.content.ServiceConnection}. </li>
529682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>Bila sistem memanggil metode callback {@link android.content.ServiceConnection#onServiceConnected
530682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsonServiceConnected()}, Anda bisa mulai membuat panggilan ke layanan, dengan menggunakan
531682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsmetode yang didefinisikan oleh antarmuka.</li>
532682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>Untuk memutus koneksi dari layanan, panggil {@link
533682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.content.Context#unbindService unbindService()}.
534682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    <p>Bila telah dimusnahkan (destroyed), klien Anda akan melepas ikatan dari layanan, namun Anda harus selalu melepas ikatan
535682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsbila sudah selesai berinteraksi dengan layanan atau bila aktivitas Anda sedang jeda sehingga layanan bisa
536682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsdimatikan saat tidak sedang digunakan. (Waktu yang tepat untuk mengikat dan melepas ikatan dibahas
537682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsselengkapnya di bawah ini.)</p>
538682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  </li>
539682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</ol>
540682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
541682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Misalnya, cuplikan berikut menghubungkan klien ke layanan yang dibuat di atas dengan
542682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<a href="#Binder">memperluas kelas Binder</a>, sehingga tinggal mengkonversi 
543682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns{@link android.os.IBinder} yang dihasilkan ke kelas {@code LocalService} dan meminta instance {@code
544682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsLocalService}:</p>
545682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
546682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<pre>
547682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsLocalService mService;
548682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsprivate ServiceConnection mConnection = new ServiceConnection() {
549682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    // Called when the connection with the service is established
550682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    public void onServiceConnected(ComponentName className, IBinder service) {
551682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        // Because we have bound to an explicit
552682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        // service that is running in our own process, we can
553682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        // cast its IBinder to a concrete class and directly access it.
554682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        LocalBinder binder = (LocalBinder) service;
555682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        mService = binder.getService();
556682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        mBound = true;
557682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    }
558682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
559682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    // Called when the connection with the service disconnects unexpectedly
560682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    public void onServiceDisconnected(ComponentName className) {
561682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        Log.e(TAG, "onServiceDisconnected");
562682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns        mBound = false;
563682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    }
564682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns};
565682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</pre>
566682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
567682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Dengan {@link android.content.ServiceConnection} ini, klien bisa mengikat ke layanan dengan meneruskannya
568682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnske {@link android.content.Context#bindService bindService()}. Misalnya:</p>
569682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
570682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<pre>
571682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsIntent intent = new Intent(this, LocalService.class);
572682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsbindService(intent, mConnection, Context.BIND_AUTO_CREATE);
573682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</pre>
574682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
575682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<ul>
576682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>Parameter pertama {@link android.content.Context#bindService bindService()} adalah sebuah 
577682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns{@link android.content.Intent} yang secara eksplisit menyebutkan layanan yang akan diikat (walaupun intent
578682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsboleh implisit).</li>
579682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<li>Parameter kedua adalah objek {@link android.content.ServiceConnection}.</li>
580682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<li>Parameter ketiga adalah tanda (flag) yang menunjukkan opsi pengikatan. Tanda ini biasanya harus {@link
581682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.content.Context#BIND_AUTO_CREATE} agar dapat membuat layanan jika belum hidup.
582682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsNilai-nilai lain yang memungkinkan adalah {@link android.content.Context#BIND_DEBUG_UNBIND}
583682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsdan {@link android.content.Context#BIND_NOT_FOREGROUND}, atau {@code 0} untuk tidak satu pun.</li>
584682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</ul>
585682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
586682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
587682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<h3>Catatan tambahan</h3>
588682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
589682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Berikut ini beberapa catatan penting tentang mengikat ke layanan:</p>
590682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<ul>
591682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>Anda harus selalu menjebak eksepsi {@link android.os.DeadObjectException}, yang dilontarkan
592682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsbila koneksi terputus. Inilah satu-satunya eksepsi yang dilontarkan oleh metode jauh.</li>
593682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>Objek adalah acuan yang dihitung lintas proses. </li>
594682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns  <li>Anda biasanya harus memasangkan pengikatan dan pelepasan ikatan selama
595682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsmemasangkan momen membuat dan menghapus daur hidup klien. Misalnya:
596682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    <ul>
597682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns      <li>Jika Anda hanya perlu berinteraksi dengan layanan saat aktivitas terlihat, Anda
598682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsharus mengikat selama {@link android.app.Activity#onStart onStart()} dan melepas ikatan selama {@link
599682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.app.Activity#onStop onStop()}.</li>
600682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns      <li>Jika Anda ingin aktivitas menerima tanggapan bahkan saat dihentikan di
601682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslatar belakang, Anda bisa mengikat selama {@link android.app.Activity#onCreate onCreate()} dan melepas ikatan
602682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsselama {@link android.app.Activity#onDestroy onDestroy()}. Berhati-hatilah karena hal ini menyiratkan aktivitas
603682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsAnda perlu menggunakan layanan selama dijalankan (sekalipun di latar belakang), jadi jika
604682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnslayanan berada dalam proses lain, Anda meningkatkan bobot proses dan semakin besar
605682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnskemungkinan sistem akan mematikannya.</li>
606682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    </ul>
607682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns    <p class="note"><strong>Catatan:</strong> Anda biasanya <strong>tidak</strong> boleh mengikat dan melepas ikatan
608682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsselama {@link android.app.Activity#onResume onResume()} aktivitas Anda dan {@link
609682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.app.Activity#onPause onPause()}, karena callback ini terjadi pada setiap transisi daur hidup
610682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsdan Anda harus menjaga pemrosesan yang terjadi pada transisi ini tetap minim. Juga, jika
611682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsbanyak aktivitas dalam aplikasi Anda mengikat ke layanan yang sama dan ada transisi antara
612682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsdua aktivitas, layanan bisa dimusnahkan dan dibuat lagi sambil aktivitas saat ini melepas ikatan
613682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns(selama jeda) sebelum aktivitas berikutnya mengikat (selama lanjutkan). (Transisi aktivitas ini untuk cara
614682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsaktivitas mengoordinasikan daur hidupnya dijelaskan dalam dokumen <a href="{@docRoot}guide/components/activities.html#CoordinatingActivities">Aktivitas</a>
615682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns.)</p>
616682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns</ul>
617682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
618682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Untuk contoh kode selengkapnya, yang menampilkan cara mengikat ke layanan, lihat kelas <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html">{@code
619682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsRemoteService.java}</a> dalam <a href="{@docRoot}resources/samples/ApiDemos/index.html">ApiDemos</a>.</p>
620682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
621682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
622682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
623682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
624682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
625682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<h2 id="Lifecycle">Mengelola Daur Hidup Layanan Terikat</h2>
626682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
627682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Bila layanan dilepas ikatannya dari semua klien, sistem Android akan menghapusnya (kecuali jika layanan juga
628682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsdimulai dengan {@link android.app.Service#onStartCommand onStartCommand()}). Dengan demikian, Anda tidak harus
629682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsmengelola daur hidup layanan jika layanan itu murni sebuah layanan
630682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsterikat&mdash;yang dikelola sistem Android untuk Anda berdasarkan apakah layanan terikat ke klien atau tidak.</p>
631682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
632682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Akan tetapi, Jika Anda memilih untuk mengimplementasikan metode callback {@link android.app.Service#onStartCommand
633682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsonStartCommand()}, maka Anda harus menghentikan layanan secara eksplisit, karena layanan
634682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnssekarang dianggap telah <em>dimulai</em>. Dalam hal ini, layanan akan berjalan hingga layanan
635682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsmenghentikan dirinya sendiri dengan {@link android.app.Service#stopSelf()} atau panggilan komponen lain {@link
636682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.content.Context#stopService stopService()}, terlepas dari apakah layanan terikat ke
637682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsklien atau tidak.</p>
638682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
639682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Selain itu, jika layanan Anda telah dimulai dan menerima pengikatan, maka saat sistem memanggil
640682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsmetode {@link android.app.Service#onUnbind onUnbind()}, Anda bisa memilih untuk mengembalikan
641682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns{@code true} jika ingin menerima panggilan ke {@link android.app.Service#onRebind
642682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsonRebind()} bila nanti klien mengikat ke layanan (sebagai ganti menerima panggilan ke {@link
643682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsandroid.app.Service#onBind onBind()}). {@link android.app.Service#onRebind
644682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsonRebind()} akan menghasilkan void, namun klien tetap menerima {@link android.os.IBinder} dalam callback
645682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns{@link android.content.ServiceConnection#onServiceConnected onServiceConnected()}.
646682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor JohnsDi bawah ini adalah gambar 1 yang mengilustrasikan logika untuk jenis daur hidup ini.</p>
647682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
648682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
649682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<img src="{@docRoot}images/fundamentals/service_binding_tree_lifecycle.png" alt="" />
650682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p class="img-caption"><strong>Gambar 1.</strong> Daur hidup untuk layanan yang dimulai
651682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johnsdan juga memungkinkan pengikatan.</p>
652682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
653682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
654682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns<p>Untuk informasi selengkapnya tentang daur hidup layanan yang telah dimulai, lihat dokumen <a href="{@docRoot}guide/components/services.html#Lifecycle">Layanan</a>.</p>
655682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
656682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
657682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
658682c24e22811d4ee17ae1cd61bf255c3f7e722b7Trevor Johns
659