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 @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 @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 @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 @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 @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 @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}—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 @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 @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 @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 @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 @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—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—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