Diktat Pemrograman Piranti Bergerak dengan Android

download Diktat Pemrograman Piranti Bergerak dengan Android

of 113

description

Diktat belajar pemrograman piranti bergerak dengan android untuk mahasiswa.

Transcript of Diktat Pemrograman Piranti Bergerak dengan Android

PEMROGRAMAN PIRANTI BERGERAK BERBASIS ANDROID

DIKTAT KULIAH

Oleh: Hendra, MT. Hartono, M.Kom.

PROGRAM STUDI TEKNIK INFORMASI STMIK IBBI MEDAN 2011

KATA PENGANTARDewasa ini, perangkat telepon pintar bukanlah merupakan barang yang mewah lagi, tetapi telah menjadi kebutuhan bagi individu yang terus bergerak, dan ingin tetap terkoneksi dengan berbagai sumber informasi, perkembangan pasar perangkat telepon pintar tentu saja dapat menjadi peluang baru bagi para pengembang aplikasi untuk bagaimana mengembangkan perangkat lunak yang berjalan pada perangkat tersebut. Salah satu fenomena yang perlu kita cermati dari pasar perangkat telepon pintar adalah perkembangan dari perangkat yang berbasis Android, dan bahkan Android juga berkembang kepada perangkat tablet. Android sendirinya merupakan suatu platform software yang dibangun diatas kernel Linux yang bersifat terbuka dan dikembangkan oleh Open Handset Alliance (OHA). OHA merupakan kolaborasi yang dari operator mobile, pabrikan, pabrikan komponen, dan software provider, serta perusahaan marketing yang dipimpin oleh Google. Diktat kuliah ini kami persiapkan untuk sebagai pengantar kuliah Pemrograman Piranti Bergerak dengan harapan dapat membawa mahasiswa kepada suatu materi kuliah yang up-to-date sesuai dengan arah perkembangan teknologi piranti bergerak dan menangkap peluang yang timbul dari pertumbuhan Android. Medan, 16 November 2011 Penulis

DAFTAR ISI Bagian 1, Pengantar Pemrograman Android................................................................1 Bagian 2, Project Android Anda yang Pertama............................................................8 Bagian 3, Struktur Project Android.............................................................................11 Bagian 4, Pembuatan Resources.................................................................................15 Bagian 5, Linear Layout.............................................................................................20 Bagian 6, Frame, Relative, Table Layout...................................................................24 Bagian 7, Pembuatan Activity....................................................................................28 Bagian 8, Pembuatan Event........................................................................................33 Bagian 9, Mengaktifkan Activity................................................................................37 Bagian 10, Pertukaran Data antar Activity.................................................................40 Bagian 11, Pengaktifan Activity Eksternal.................................................................44 Bagian 12, Mendayagunakan Activity pada Aplikasi Android...................................48 Bagian 13, Broadcast Receiver...................................................................................53 Bagian 14, Database SQLite.......................................................................................57 Bagain 15, Pengolahan Data.......................................................................................62 Bagian 16, Content Provider.......................................................................................66 Bagian 17, Membuat Content Provider......................................................................71 Bagian 18, Membuat Service......................................................................................79 Bagian 19, Lokalisasi Aplikasi...................................................................................82

Pemrograman Piranti Bergerak

Bagian 1, Pengantar AndroidApa itu Android?Menurut developer.android.com, Android adalah sebuah tumpukan software untuk peralatan bergerak yang terdiri dari sistim operasi, middleware, dan aplikasi kunci lainnya. Android memiliki fitur sebagai berikut: 1. Framework aplikasi yang memungkinkan pemakaian ulang dan pengantian dari komponen. 2. Dalvik virtual machine yang dioptimisasi untuk perangkat mobile (cpu yang lambat, memori yang kecil, OS tanpa swap space, dan sumber power baterai yagn terbatas). 3. Browser terintegrasi yang berdasarkan pada engine WebKit open source. 4. Graphics teroptimisasi yang didukung dengan suatu library grafis 2D, grafis 3D berdasarkan spesifikasi OpenGL ES 1.0. 5. SQLite1 untuk penyimpanan data terstruktur. 6. Dukungan Media untuk suara, video, dan gambar umum berbagai format (MPEG4, H.264, MP3, ACC, AMR, JPG, PNG, dan GIF) 7. GSM Telephony (tergantung hardware). 8. Bluetooth, EDGE, 3G, dan WiFi (tergantung hardware) 9. Camera, GPS, compass, dan accelerometer (tergantung hardware) 10. Lingkungan pengembangan yang kaya termasuk suatu emulator peralatan, peralatan untuk debugging, profiling memori dan unjuk kerja serta suatu plugin untuk IDE Eclipse.

Sejarah AndroidPlatform Android merupakan produk dari Open Handset Alliance yang merupakan suatu kelompok organisasi yang berkolaborasi untuk membangun mobile phone yang lebih baik. Kelompok ini dipimpin oleh Google, operator mobile, pabrikan, pabrikan komponen, dan software provider, serta perusahaan marketing. Perangkat Android pertama dipasaran adalah G1 yang dipabrikasi oleh HTC.

1

SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine. SQLite is the most widely deployed SQL database engine in the world. The source code for SQLite is in the public domain.

Hendra, MT. & Hartono, M.Kom.

1

Pemrograman Piranti Bergerak

Arsitektur AndroidArsitektur dari Android terdiri dari 4 lapisan perangkat lunak, dengan lapisan yang paling dasar adalah Linux Kernel yang bertindak sebagai sistim operasi, lapisan yang kedua adalah native library dan Android runtime, native library bertindak sebagai hardware abstraction yang ditulis dengan C/C++ yang disediakan oleh vendor, sedangkan Android runtime lingkungan dimana aplikasi .dex akan dijalankan (terdiri dari library-library dan Dalvik Virtual Machine (DVM)2 yang merupakan Virtual Machine berbasis register3 yang dioptimalkan untuk pemakaian memori yang rendah), lapisan yang ketiga adalah Application Framework yang anda gunakan untuk mengembangkan aplikasi, dan lapisan keempat adalah Applications and Widgets yang merupakan aplikasi yang dapat anda buat ataupun aplikasi yang telah disediakan.

Gambar 1. Arsitektur lapisan perangkat lunak Android

Arsitektur AplikasiAndroid berjalan diatas kernel Linux, dan aplikasi Android ditulis dengan bahasa pemrograman Java, dan dijalankan didalam DVM yang merupakan teknologi open source4, masing-masing aplikasi Android dijalankan didalam suatu instant dari DVM,2

3

4

Berbeda dengan Java Virtual Machine (JVM) yang menggunakan arsitektur berbasis stack, DVM merupakan Virtual Machine dengan arsitektur berbasis register. Bytecode pada DVM berbeda dengan bytecode JVM, dimana file .Class hasil kompilasi dengan Android SDK perlu ditransformasi menjadi Dalvik Executable (.dex) dengan tool dx agar dapat berjalan pada DVM. David Ehringer (2010) menuliskan bahwa arsitektur berbasis register membutuh rata-rata 47% lebih sedikit eksekusi instruktusi virtual machine (VM) dibandingkan dengan berbasis stack, pada sisi lain kode register lebih besar 25% dibandingkankan dengan kode stack sehingga membutuhkan lebih banyak instruksi VM, sehingga secara keseluruhan VM berbasis register membutuhkan rata-rata 32% lebih sedikit waktu berdasarkan hasil benchmark. Android is an open-source software stack for mobile devices, and a corresponding open-source project led by Google. We created Android in response to our own experiences launching mobile apps. We wanted to make sure that there was no central point of failure, so that no industry player can restrict or control the innovations of any other. That's why we created Android, and made its source code open

Hendra, MT. & Hartono, M.Kom.

2

Pemrograman Piranti Bergerak yang mana menjadi process yang diatur oleh kernel Linux sebagaimana ditunjukan pada Gambar 2.

Gambar 2. Arsitektur eksekusi aplikasi Android

Aplikasi AndroidSuatu aplikasi Android dapat berupa salah satu dari empat komponen yang klasifikasi berikut ini : 1. Activities, merupakan suatu aplikasi yang berfokus pada aktifitas pemakai dan memiliki user interface (UI), suatu activity diaktifkan ketika pemakai mengaktifkan sebuah aplikasi dari home screen atau launcher aplikasi. 2. Services, suatu service berjalan dilatarbelakang dan digunakan untuk kegiatan yang membutuhkan existensi untuk jangka waktu yang lama dan tidak memiliki UI, seperti suatu monitoring jaringan, atau aplikasi pemeriksaan update. 3. Content providers, suatu penyimpan dan penyedia yang bersifiat tetap dan dapat tersedia antar aplikasi, jika aplikasi anda sangat sederhana, anda tidak perlu membuat content provider, jika anda membuat aplikasi yang lebih besar, atau membuat sesuatu data tersedia untuk banyak aktivitas ataupun aplikasi, tentu suatu content provider dibutuhkan. 4. Broadcast dan Intent receivers, suatu aplikasi Android yang menerima message sistem dan melakukan tanggapan respon, seperti menerima suatu pesan teks. Kecuali Content providers, komponen lainnya diaktifkan melalui asynchronus message yang dikenal dengan intent, dan intent dapat memiliki bundle yang mendukung informasi terkait dengan komponen, dan digunakan untuk pertukaran data antar komponen.

Apa itu Android SDK?Android SDK menyediakan tools dan APIs yang dibutuhkan untuk mengembangkan aplikasi pada platform Android dengan menggunakan bahasa pemrograman Java. Hendra, MT. & Hartono, M.Kom. 3

Pemrograman Piranti Bergerak Android SDK untuk berbagai platform (Linux, Mac Os, windows) dapat didownload secara gratis pada http://developer.android.com/sdk/index.html

Distribusi platform AndroidBerikut ini adalah data per 2 September 2011 yang diperoleh di developer.android.com, Android 1.5 (Cupcake3 1.0%), Android 1.6 (Donut4 1.8%), Android 2.1 (Eclair7 13.3%), Android 2.2 (Froyo8 51.2%), Android 2.3-Android 2.3.2 (Gingerbread9 0.6%) Android 2.3.3 - Android 2.3.4 10 (Gingerbread10 30.7%), Android 3.0 (Honeycomb 11 0.2%), Android 3.1 (Honeycomb12 0.7%), Android 3.2 (Honeycomb13 0.5%)

Gambar 3. Distribusi platform Android

Persyaratan pengembangan AndroidUntuk dapat melakukan pengembangan aplikasi yang berbasis Android membutuhkan beberapa pengetahuan dasar tentang : 1. Pemrograman Java dan OOP 2. Pengelolaan dokumen XML 3. Memahami dan mengerti IDE Eclipse

LatihanInstalasi Komputer untuk Pemrograman Android1. Instalasi JDK Download dan install JDK dari http://java.sun.com/javase/downloads/index.jsp

Hendra, MT. & Hartono, M.Kom.

4

Pemrograman Piranti Bergerak

2. Instalasi Eclipse Download dan unzip Eclipse dari http://www.eclipse.org/downloads/ direkomendasikan "Eclipse Classic" Lakukan unzip, misalnyua C:\Eclipse 3. Instalasi SDK Starter Package Download dan instalasi SDK Starter Package dari http://developer.android.com/sdk/index.html

Catatan: Jika pada saat instalasi, gagal dengan pesan Java SE JDK tidak ditemukan, maka lakukan klik pada Back dan klik pada Next kembali. Setelah instalasi, maka aktifkan SDK manager untuk mendownload SDK Platform Tools, anda membutuhkan koneksi internet dalam hal ini.

Hendra, MT. & Hartono, M.Kom.

5

Pemrograman Piranti Bergerak

Anda dapat memilih package-package yang ingin diinstall pada bagian Available Package. Catat lokasi instalasi android-sdk misalnya : C:\Program Files\Android\androidsdk (akan digunakan pada langkah 5, dan diketik sebagai C:\PROGRA~1\Android\android-sdk ) Hendra, MT. & Hartono, M.Kom. 6

Pemrograman Piranti Bergerak

4. Installing the ADT Plugin untuk Eclipse Aktifkan Eclipse, kemudian pada menu Help, pilih Install New Software

Klik pada Add, pada sisi kanan atas

Pada dialog Add Site, ketikan http://dl-ssl.google.com/android/eclipse/ Alternatif: anda dapat mendownload manual pada alamat http://dl.google.com/android/ADT-12.0.0.zip

Pada dialog Add Site, klik Archive, dan browse serta pilih ADT-12.0.0.zip

Hendra, MT. & Hartono, M.Kom.

7

Pemrograman Piranti Bergerak

Isi sebuah nama untuk local update site (misalnya Android Plugin) pada field Name Klik OK. Pada dialog Available Software, pilih checkbox disamping Developer Tools dan klik Next Pada jendela berikutnya, anda akan melihat daftar dari tools yang telah didownload, dan klik Next Baca dan terima license agreements, dan klik Finish Catatan : Jika anda mendapatkan security warning yang mengatakan bahwa authenticity atau validity dari software tidak dapat dilakukan, klik OK Ketika instalasi selesai, restart Eclipse 5. Konfigurasi ADT Plugin Setelah anda berhasil mendownload ADT sebagaimana yang diterangkan diatas, maka langkah berikutnya adalah melakukan modifikasi terhadap ADT preferences pada Eclipse untuk menunjuk pada Android SDK directory. Pada Eclipse, menu Window, pilih Preferences, Pilih Android dari panel sebelah kiri Pada SDK Location pada panel utama, klik Browse... dan tempatkan SDK directory, klik Apply dan Ok.

Hendra, MT. & Hartono, M.Kom.

8

Pemrograman Piranti Bergerak

Bagian 2, Project Android anda yang pertamaSebagaimana kebiasaan dari pembelajaran pemrograman yang selalu diawali dengan pembuatan program sederhana yang menampilkan pesan Hello World. Adapun tujuan dari pembuatan program yang sederhana ini adalah sebagai pengenalan anda untuk lingkungan pengembangan IDE Eclipse, dan pengujian akan keberhasilan setting environment pengembangan Aplikasi Android yang telah anda lakukan sebelumnya.

Mengaktifkan IDE EclipseEclipse merupakan IDE pengembangan terpadu aplikasi Java, dan setelah ditambah ADT Plugin, maka dapat juga mendukung project pengembangan aplikasi Android. Untuk mengaktifkan Eclipse, browse ke folder dimana paket Eclipse diunzip, misalnya C:\Eclipse dan anda cukup melakukan double click pada :

Pada awal keaktifkan Eclipse akan ditanyakan Workspace yang akan digunakan untuk penyimpanan setting dan file project pengembangan yang akan kita lakukan, jika anda bekerja dengan komputer LAB yang digunakan juga oleh mahasiswa lain, maka kami sarankan untuk membuat sebuah folder dengan Nim Anda pada Drive dimana proses tulis diperbolehkan.

Pembuatan Project Android dengan EclipseSecara ringkas pembuatan project Android dengan Eclipse dilakukan dengan langkahlangkah sebagai berikut: 1. Pada menu File, pilih New, dan pilih Android Project atau jika tidak ada pilihan Android Project, maka dipilih Project, kemudian akan tampil jendela 2. Setelah pementuan workspace, maka akan tampil IDE dari Eclipse, dan untuk membuat project Android anda yang pertama, pada menu File, pilih New, pilih Android Project

Hendra, MT. & Hartono, M.Kom.

9

Pemrograman Piranti Bergerak

Jika pada New, tidak tersedia pilihan Android Project, maka dapat dipilih Project

Isikan detail dari Project meliputi: 1. Project name : HelloAndroid 2. Build Target: Android 2.2 3. Application name: Hello, Android 4. Package name: com.hendra.helloandroid 5. Create Activity: HelloAndroidActivity 6. Min SDK Version: 8 Catatan: Package name merupakan suatu identitas unique anda dari aplikasi lainnya yang kemungkinan menggunakan Project name yang sama, identitas unique ini sangat penting ketika anda ingin mempublikasi aplikasi anda pada Android Market, anda disarankan untuk menggunakan Package name dengan format penulisan com.namaperusahaananda.namaaplikasi. Build Target dan Min SDK Version menentukan versi minimal Android yang dapat menjalankan aplikasi sehingga Android dan Android Market tahu aplikasi anda berjalan pada perangkat versi apa saja. Dan klik pada OK, sehingga muncul tampilan pada Package Explorer sebagai berikut

Hendra, MT. & Hartono, M.Kom.

10

Pemrograman Piranti Bergerak

Kemudian untuk menjalankan program tersebut, klik pada toolbar Run

Perhatikan log pada Tab Console

Otomatis akan ditampilkan emulator dari Android yang menampilkan pesan Hello World, HelloAndroidActivity!

Hendra, MT. & Hartono, M.Kom.

11

Pemrograman Piranti Bergerak

Trouble Shooting, jika pada saat Run, muncul pesan kesalahan berikut ini :[2011-07-10 07:11:06 - Emulator] invalid command-line parameter: Files\Android\androidsdk\tools/emulator-arm.exe. [2011-07-10 07:11:07 - Emulator] Hint: use '@foo' to launch a virtual device named 'foo'. [2011-07-10 07:11:07 - Emulator] please use -help for more information

Ini adalah suatu masalah pada R12 dimana pada lokasi SDK tidak dapat mengandung spasi. Periksa kembali pengetikan ada pada saat mendefinisikan lokasi SDK Android yaitu pada menu Window, Preferences, Android, dan periksa SDK Location Jika berisi C:\Programme Files(x86)\Android\android-sdk dimana pada pengetikan diatas mengandung spasi, sehingga perlu diubah menjadi C:\PROGRA~2\Android\android-sdk. Bagi anda yang menjalankan Windows 32-bit, ubah path ke C:\PROGRA~1\Android\android-sdk.

Pengaturan aplikasi pada Emulator AndroidUntuk melakukan uninstall aplikasi dari Emulator Android dapat dilakukan dengan klik pada Home, pilih pada Laucher, Setting, Applications, Manage applications Hendra, MT. & Hartono, M.Kom. 12

Pemrograman Piranti Bergerak

Kemudian klik pada aplikasi, dan uninstall.

Pengaturan aplikasi dengan adb shellUntuk melakukan uninstall dengan Android Debug Bridge, aktifkan ke command prompt, dan ketik perintah-perintah sebagai berikut: cd \progra~1\android\android-sdk\platform-tools adb shell #ls #rm com.hendra.helloworld.apk #exit atau adb uninstall com.hendra.helloworld

Shortcut untuk Emulator AndroidTabel 1, Tombol kendali emulator Android Tombol Escape Home F2, PageUp Shift-F2, PageDown F3 F4 F5 F7 Ctrl-F11 Fungsi emulator Tombol back Tombol home Tombol menu Tombol start Tombol call/dial Tombol hangup/endcall Tombol search Tombol power Rotasi layar

Hendra, MT. & Hartono, M.Kom.

13

Pemrograman Piranti Bergerak

Pengembangan dengan perangkat AndroidJika anda memiliki perangkat Android, maka anda dapat menjalankan aplikasi pada perangkat Android dari IDE Eclipse dengan menghubungkan perangkat anda ke PC dengan data cable, kemudian menginstalasi USB Driver yang sesuai dengan perangkat anda. Setting pada perangkat anda: 1. Mengaktifkan fitur untuk memperbolehkan instalasi aplikasi dari sumber yang tidak dikenal, dengan klik pada Setting, pilih Applications, kemudian aktifkan Unknown sources. 2. Mengaktifkan USB Debugging pada perangkat, dengan klik pada Setting, pilih Applications, kemudian pilih Development, dan aktifkan USB debugging. Setelah perangkat anda terkoneksi ke PC dan setting tersebut diatas, maka anda dapat memeriksa apakah perangkat anda telah dikenal oleh ADT, dengan menjalankan perintah berikut dari DOS prompt. cd \progra~1\android\android-sdk\platform-tools adb device Secara otomatis akan ditampilkan nama perangkat anda, dan ketika anda menjalankan aplikasi dari Eclipse, otomatis aplikasi terinstall dan di run.

Mempublikasi aplikasi andaAgar aplikasi anda dapat diterima pada Android Market, maka aplikasi tersebut perlu ditandatangani secara digital dengan menggunakan kunci private yang digenerate dan disimpan pada lokasi yang aman. Sebelum aplikasi tersebut ditandatangani maka aplikasi tersebut perlu dipaket dalam modus pelepasan dengan klik kanan pada project yang akan dilepas pada project explorer, kemudian pilih Export Signed Application Package..., dan lakukan langkah sebagai berikut: 1. Isikan nama project yang akan diekspor pada isian Project, kemudian klik Next 2. Pilih Use existing keystore jika anda telah memiliki kunci private, dan pilih Create new keystore jika belum. Isikan lokasi penyimpanan keystore, isikan password dan confirm password sekali lagi, dan klik next. 3. Isikan Alias: KunciKu Password: hendra Confirm: hendra Hendra, MT. & Hartono, M.Kom. 14

Pemrograman Piranti Bergerak Validity years: 25 First and Lastname: Hendra Soewarno Organizational unit: STMIK Organization: IBBI City or Locality: Medan State or Province:Sumut Country Code XX: ID Kemudian klik next, 4. Isikan lokasi dimana APK akan disimpan (APK modus pelepasan dan sudah ditandatangani secara digital) Ketika suatu aplikasi diupgrade, kunci (file keystore) yang sama diperlukan untuk menandatanganinya untuk memastikan update yang transparant kepada pemakai. File keystore harus disimpan secara aman untuk mencegah kemungkinan pemanfaatan file keystore anda oleh pihak yang tidak berhak dan beresiko terhadap reputasi anda.

LatihanBuatlah aplikasi Android yang dapat menampilkan pesan Hello World !, dan lakukan proses penandatanganan aplikasi untuk modus pelepasan.

Hendra, MT. & Hartono, M.Kom.

15

Pemrograman Piranti Bergerak

Bagian 3, Struktur project AndroidUntuk dapat melihat Struktur project dari aplikasi Android anda dapat dilihat melalui jendela Project Explorer. Secara umum project Android memiliki struktur sebagaimana yang ditunjukan pada Gambar 1, yaitu terdiri dari folder src, gen, Android 2.2, assets, res, dan file AndroidManifest.xml, default.properties, dan proguard.cfg.

Gambar 1, Tampilan Project Explorer pada Eclipse

Struktur proyek HelloWorldKita akan membahas mulai dari resource, source code dan manifest.

Resource (/res)Merupakan folder dimana kita menempatkan segala sumber daya gambar, deklarasi string dan nilai yang akan digunakan pada aplikasi, pemakaian sumber daya ini dapat dilakukan pada saat pembuatan layout, class java maupun manifest.

drawable-hdpi, drawable-mdpi, drawable-ldpiDrawable merupakan folder dimana kita menempatkan file-file gambar menurut resolusi masing-masing (high:72x72, medium:48x48, low:36x36). Pada proyek HelloWorld di masing-masing folder terdapat file icon.png sesuai dengan resolusi untuk masing-masing folder.

ValuesResource values merupakan file XML yang berisi deklarasi nilai untuk array, color, dimensi dan string. Pada proyek HelloWorld, folder /res/value terdapat sebuah file string.xml yang isinya adalah sebagai berikut: Hendra, MT. & Hartono, M.Kom. 16

Pemrograman Piranti Bergerak Hello World, HelloWorldActivity! HelloWorld

Pada deklarasi tersebut diatas berarti kita memiliki dua sumber daya string yang bernama hello dan app_name yang masing-masing memiliki nilai Hello World, HelloWorldActivity! dan HelloWorld.

LayoutResource Layout merupakan rancangan antarmuka Activity pada program Android yang ditulis dalam format XML. Pada proyek HelloWorld, forder /res/layout terdapat file main.xml yang berisi rancangan antarmuka.

Berdasarkan XML tersebut diatas dapat dijelaskan bahwa main.xml terdiri dari satu Group View (LinearLayout dengan orientasi vertikal, dan pengaturan ukuran lebar dan tingginya mengisi seluruh ruang parent), kemudian didalam Group View tersebut terdapat sebuah View (TextView dengan ukuran lebar adalah sesuai ukuran lebar parent, dan tingginya sesuai dengan tinggi text pada view tersebut, dan memiliki text dengan menggambil nilai sumber daya resource yang bernama hello (@string/hello))

R.java, Resources and AssetsDirektori gen pada proyek android mengandung nilai buatan R.java adalah class yang mana mengandung referensi ke sumber daya yang ada pada folder res pada proyek. Jika anda membuat sumber daya yang baru, secara otomatis akan dibuat referensi dengan suatu nilai identitas untuk R.java, nilai identitas inilah yang akan menjadi acuan bagi java class untuk mengakses kepada sumber daya tersebut, jadi jangan lakukan perubahan secara manual pada R.java Direktori assets dapat digunakan untuk menyimpan data apa saja, dan anda dapat mengakses data melalui AssetsManager dengan metoda getAssets(). Hendra, MT. & Hartono, M.Kom. 17

Pemrograman Piranti Bergerak

Source code (/src)Merupakan folder yang berisi source code java class untuk masing-masing activity, service, content provider dan broadcast receiver pada aplikasi Android, dalam hal ini adalah file HelloWorldActivity.java.package com.hendra.helloworld; import android.app.Activity; import android.os.Bundle; public class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }

Adapun penjelasan untuk file HelloWorldActivity.java adalah bahwa setiap Activoty class harus merupakan subclass dari Activity (extends Activity), kemudian perlu dioverride method onCreate dan melakukan pemanggilan terhadap metode onCreate dari super classnya. Metode onCreate merupakan metode yang secara otomatis dipanggil setiap instant dari HelloWorldActivity dibuat. Pada method onCreate akan membuat ContentView berdasarkan layout yang didefinisikan pada /res/layout/main.xml (setContentView(R.layout.main))

AndroidManifest.XMLMerupakan file XML yang berisi informasi mengenai aplikasi Android.

Hendra, MT. & Hartono, M.Kom.

18

Pemrograman Piranti Bergerak

Pada manifest ini ditentukan icon Launcher dari aplikasi adalah diambil dari icon yang didefinisikan pada /res/drawable/icon (@drawable/icon), kemudian nama aplikasi akan diambil dari deklarasi app_name yang didefinisikan didalam file /res/values/string.xml. Pada aplikasi ini akan terdapat satu activity yang diberi nama .HelloWorldActivity (sesuai dengan activity yang dengan HelloWordActivity yang didefinisikan pada HelloWorldActivity.java. Activity .HelloWorldActivity ini adalah merupakan aktivitas utama atau dengan kata lain merupakan titik masuk ke aplikasi (android.intent.action.MAIN), dan Activity ini akan ditempatkan pada lokasi Launcher aplikasi (android.intent.category.LAUNCHER) sehingga pemakai dapat mengaktifkan aplikasi.

Catatan:Atribut package harus bersifat unik sebagaimana Android Marketplace hanya memperbolehkan aplikasi untuk package tertentu sekali saja, sehingga adalah praktek yang baik dengan menggunakan nama domain anda secara terbalik (com.hendra.helloworld) untuk menghindari terjadi benturan dengann developer lain. Nilai @ mengacu pada file sumber daya yang mana mengandung nilai yang sebenarnya, hal ini memudahkan untuk pengaturan sumber daya yang berbeda seperti string, color, icon untuk peralatan yang berbeda. Pada satu aplikasi Android, hanya diperbolehkan satu aktivitas yang memiliki action MAIN dengan kategori LAUNCHER.

Latihan1. Buatlah aplikasi Android yang menampilkan pesan Hello World ! 2. Lakukan explorasi terhadap struktur project aplikasi tersebut dengan mempelajari masing-masing folder pada proyek. 3. Tuliskan kembali dalam kata-kata anda sendiri struktur suatu program android terkait dengan folder /src, /gen, /res/drawable, /res/layout, /res/values.4. Tuliskan kembali dalam kata-kata anda fungsi dari AndroidManifest.XML

Hendra, MT. & Hartono, M.Kom.

19

Pemrograman Piranti Bergerak

Bagian 4, Pembuatan ResourcesAnda disarankan untuk melakukan eksternalisasi terhadap sumber daya seperti gambar dan string yang digunakan pada aplikasi anda terhadap kode aplikasi (dengan meletakan mereka pada folder /res, dan melakukan referensi terhadap resource tersebut)., dengan eksternalisasi anda dapat menangani resources dengan kode program secara terpisah (perubahan terhadap resource dapat dilakukan tanpa melakukan perubahan terhadap kode aplikasi). Eksternalisasi sumber daya anda juga memperbolehkan anda untuk menyediakan sumber daya alternatif yang mendukung konfigurasi peralatan tertentu seperti bahasa yang berbeda atau ukuran layar.

Gambar 1, Dua peralatan berbeda mengunakan sumber daya default

Gambar 2, Dua peralatan berbeda mengunakan sumber daya berbeda

Pengelompokan Jenis ResourceAnda harus menempatkan masing-masing jenis dari resource pada sub folder tertentu di dalam folder /res, berikut ini adalah jenjang dari file untuk suatu proyek sederhana.MyProject/ src/ MyActivity.java res/ drawable/ icon.png layout/ main.xml info.xml values/ strings.xml

Hendra, MT. & Hartono, M.Kom.

20

Pemrograman Piranti Bergerak

Mengakses Resources dari XMLUntuk mengakses resources dapat dilakukan melalui file XML maupun melalui koding, adapun syntax untuk mengacu pada suatu resources pada file XML adalah : @[:]/ dimana adalah nama package di mana resources berada (anda dapat mengabaikannya jika mengaksesnya dari package yang sama, adalah subclass R untuk jenis resource, dan adalah nama variabel resource Contoh deklarasi resources: /res/values/strings.xml Hello World, HelloWorldActivity! HelloWorld

Contoh pemakaian:

dimana @string/hello mengacu pada resource type string yang memiliki nama variabel hello, dan @android: color/secondary_text_light adalah mengacu pada system resource Android (tidak berada pada package yang sama)

Mengakses Resources dari KodingUntuk mengakses resources dari file XML kita menggunakan konstruksi seperti @string/hello, tetapi untuk mengakses resources dari dalam kode Java kita menggunakan integer dari R.java.Contoh pemakaian: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView textHello = (TextView) findViewById(R.id.helloText); textHello.setText(getString(R.string.helloHendra)); }

Hendra, MT. & Hartono, M.Kom.

21

Pemrograman Piranti Bergerak Pada contoh diatas penulisan R.id.helloText berarti kita mengacu kepada sumber daya yang memiliki id helloText yang merupakan suatu view yang dideklarasikan pada sumber daya layout, sedangkan R.string.helloHendra mengacu kepada sumber daya string yang memiliki id helloHendra.Tabel 1, Mengacu kepada resources Android dari XML dan JavaAndroid Resource res/layout/main.xml res/drawable-hdpi/file.png @+id//helloText Reference from XML @layout/main @drawable/file @string/helloHendra @id/helloText Reference from Java R.layout.main R.drawable.file R.string.helloHendra R.id.helloText

String ResourceSebuah resource string menyediakan teks string untuk aplikasi anda, ada tiga jenis dari resources yang dapat tersedia bagi aplikasi anda yaitu String (XML resource yang menyediakan string tunggal), String Array (XML resource yang menyediakan array dari string)lokasi file: res/values/filename.xml Syntax: Syntax text_string text_string Contoh Hello! Mercury Venus Earth Mars

Hendra, MT. & Hartono, M.Kom.

22

Pemrograman Piranti Bergerak

Akses String dengan XMLString resource yang telah kita siapkan pada resources, dapat digunakan pada saat pembuatan layout dengan format penulisan @string/name. Contoh:

Akses String dengan JavaString resource yang telah kita siapkan pada resources, dapat digunakan pada saat progra, java dengan format R.string.name. Contoh:String string = getString(R.string.hello);

Anda dapat menggunakan getString, getText untuk mengakses string resource, perbedaannya adalah getText lebih kepada rich text style.

Akses Array String dengan JavaSedangkan untuk mengakses string-array dapat menggunakan perintah getStringArray yang merupakan metoda dari suatu objek resource. Contoh:Resources res = getResources(); String[] planets = res.getStringArray(R.array.planets_array);

Pembuatan resources dengan EclipseADT plug-in pada Eclipse menyediakan fasilitas pembuatan values resource yang terdiri dari tab Resources view dan XML view. Pada tab Resources view anda dapat melakukan penambahan, perubahan dan penghapusan values resource secara interaktif, sedangkan pada tab XML view pembuatan values resource dilakukan dengan menggunakan pengetikan XML.

Latihan1. Buatlah String resource sebagai berikut dan simpan pada file pesan.xml: String name Text string 23

Hendra, MT. & Hartono, M.Kom.

Pemrograman Piranti Bergerak selamat_belajar program_android mata_kuliah Selamat belajar Pemrograman android Di Mata kuliah pemrograman piranti bergerak

2. Tampilkan masing-masing String resource pada TextView. TextView pesan1 pesan2 pesan3 String name selamat_belajar program_android mata_kuliah

3. Tambahkan string resource dengan nama semester yang berisi text string di semester enam, dan kemudian tambahkan TextView pesan3 yang menampilkan string resource semester secara pemrograman Java. 4. Tambahkan Array String yang mendeklarasikan nama-nama hari dalam minggu (Senin, Selasa, Rabu, Kamis, Jumat, Sabtu, Minggu), dan simpan pada file hari.xml. 5. Lakukan pembuatan values resource pada soal 1 dan 4 dengan menggunakan fasilitas pada Resource View.

Hendra, MT. & Hartono, M.Kom.

24

Pemrograman Piranti Bergerak

Bagian 5, LinearLayoutLayout merupakan salah satu resource yang digunakan yang mendefinisikan antarmuka suatu activity yang digambarkan di layar. Memahami layout merupakan hal yang penting untuk merancang suatu aplikasi Android yang baik. Secara khususnya layout resource ditempatkan pada folder /res/layout/filename.xml. Referensi terhadap suatu layout resource secara Java adalah R.layout.filename dan secara XML adalah @[package:]layout/filename. Adapun syntax penulisan untuk sebuah layout resource adalah sebagai berikut ini:

Untuk membantu anda memahami syntax penulisan tersebut diatas, maka akan dijelaskan fungsi dari masing-masing elemen sebagai berikut: Merupakan suatu kontainer untuk element view lainnya, atau dengan kata lain didalam suatu ViewGroup dapat ditempatkan element view lainnya baik berupa widget maupun ViewGroup lainnya (nested). Suatu komponen UI tunggal yang umunya disebut dengan suatu widget, suatu object View dapat terdiri dari TextView, Button, 25

Hendra, MT. & Hartono, M.Kom.

Pemrograman Piranti Bergerak dan CheckBox. Mengikut sertakan suatu layout file kedalam layout ini, pemakaian include digunakan untuk melakukan reuse terhadap layout yang anda.

Atribut pada ViewGroup dan ViewPada masing-masing ViewGroup maupunView dapat memiliki atribut yang nantinya digunakan untuk mengacu terhadap elemen tersebut dari aplikasi, maupun digunakan untuk menentukan dimensi dari masing-masing elemen. android:id Merupakan ID resource yang bersifat unik yang digunakan untuk mengacu terhadap elemen tersebut dari aplikasi anda. Merupakan dimensi yang menentukan ukuran tinggi dari elemen, dapat berupa fill_parent atau wrap_content. Merupakan dimensi yang menentukan ukuran lebar dari elemen, dapat berupa fill_parent atau wrap_content. Salah satu objek view dapat mengikutsertakan elemen ini untuk sebagai fokus awal pada layar.

android:layout_height android:layout_width

Contoh: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView.(R.layout.main_activity); }

Hendra, MT. & Hartono, M.Kom.

26

Pemrograman Piranti Bergerak

Merancang layout dengan EclipseADT plug-in pada Eclipse menyediakan suatu designer untuk merancang dan menampilkan layout resource. Tool ini terdiri dari dua tab yaitu Graphical view dan XML view. Graphical view berfungsi untuk merancang dan menampilkan layout secara visual, sedangan XML view digunakan untuk merancang layout dengan pengetikan text XML, anda dapat beralih dari Graphical view ke XML view dan sebaliknya. Membuat layout resource dengan menggunakan Graphical View: 1. Pada jendela Palette, pilih Layouts, dan drag Linear Layout ke canvas, dan klik pada set vertical orientation (susunan kebawah secara vertikal) 2. Double klik pada linearLayout1 pada jendela Outline dan akan dimuncul jendela properties, dan set Layout Width ke Match Parent, lakukan hal sama terhadap Layout Height 3. Pada jendela Palette, pilih Form Widget, dan drag TextView ke layout, kemudian set Layout Width dan Layout Height ke Match Parent, kemudian set properti text ke "Hello, I am a TextView" dengan klik kanan pada TextView dan pilih properties dan pilih text. 4. Tambahkan juga Widget Button ke Layout, dan lakukan setting yang sesuai. 5. Klik pada XML view untuk melihat hasilnya. Catatan : Untuk membantu pemformatan text XML, tekan Ctrl+A, dan kemudian tekan Ctrl+Shift+F.

Latihan1. Buatlah layout resource yang dapat menghasilkan tampil berikut ini dengan menggunakan fasilitas pada Graphical View, bantuan Outline Window dan Properties window (dan buatlah langkah-langkah petunjuk yang dapat digunakan teman anda untuk menghasilkan layout tersebut) Petunjuk :

Hendra, MT. & Hartono, M.Kom.

27

Pemrograman Piranti Bergerak a) Pada Workbench, set konfigurasi ke b) dan lakukan perubahan resolusi menjadi c) Siapkan string resource dan color resource untuk masing-masing text diatas (red = #aa0000, green = #00aa00, blue = #0000aa , yellow = #aaaa00, row one, row two, row three, row four ) d) Gunakan Dua LinearLayout, yaitu dengan orientasi horizontal dan vertikal. e) Pada LinearLayout yang pertama tambah empat TextView, dimana masingmasing properti text dan backgroud diset ke resource (red, green,blue dan yellow), atur juga juga layout_width, layout_height, dan layout_weight. f) Pada LinearLayout yang kedua tambahkan empat TextView, dan set masing-masing Text, kemudian atur ukur textSize menjadi 15pt serta atur juga layout_width, layout_height, dan layout_weight. 2. Buatlah layout resource yang dapat menghasilkan tampilan sebagai berikut, buatlah id untuk masingmasing view, dan fokus pertama pada EditText panjang.

Hendra, MT. & Hartono, M.Kom.

28

Pemrograman Piranti Bergerak

Bagian 6, Pengaturan LayoutPada bagian sebelumnya kita telah membahas pembuatan layout resource, dan pada bagian ini kita akan membahas beberapa jenis layout yang sering digunakan, dan contoh pemanfaatannya. FrameLayout adalah objek layout yang paling sederhana, dirancang untuk menampilkan suatu tumpukan dari control View, anda tidak dapat menentukan lokasi dari child view, sebagai konsekuensinya child view akan ditampilkan menimpa view sebelumnya. LinearLayout mengatur semua kontrol child view pada satu baris ataupun kolom tunggal (horizontal/vertical orientation), layout ini sangat sesuai untuk pembuatan form. RelativeLayout mengatur tampilan dari kontrol child View secara relatif satu terhadap lainnya (dengan acuan ID), anda dapat meratakan dua elemen berdasarkan border kanan, atau membuat satunya berada dibawah lainnya, berada ditengah layar, dll. TableLayout mengatur semua kontrol child View kedalam sejumlah baris dan kolom (berbentuk tabel). Pada layout tabel tidak menampilkan garis border untuk masing-masing baris, kolom atau sel. Masing-masing kolom dan baris memiliki jumlah sel yang sama, anda dapat mengosongkan sel tertentu, dan sel dapat melakukan span kolom seperti yang dapat dilakukan pada HTML.

Frame LayoutFrameLayout dirancang untuk memblok suatu area pada layar dengan menampilkan satu objek tunggal, jika anda ingin menampilkan lebih dari satu objek, maka objek yang berikutnya akan menimpa objek sebelumnya, untuk meminimalkan hal ini anda dapat mengatur properti android:layout_gravity dari masing-masing objek. Anda dapat juga menentukan gambar background maupun foreground dengan menggunakan properti android:background dan Hendra, MT. & Hartono, M.Kom. 29

Pemrograman Piranti Bergerak android:foreground.

Linear LayoutSebagaimana yang telah dijelaskan sebelumnya bahwa pada linear layout, objek-objek view akan disusun secara vertikal ke bawah ataupun secara horizontal ke samping. Pengaturan ukuran dari masing-masing object child view dapat dilakukan dengan mengatur properti android:layout_width dan android:layout_height kematch_parent maupun wrap_content, kemudian juga dapat dilakukan pengaturan posisi penempatan dari object view dengan menggunakan properti android:layout_gravity. Kemudian anda dapat juga mengatur ukuran relatif masing-masing object child view didalam Layout dengan menggunakan properti android:layout_weight.

Relative LayoutSebagaimana dengan namanya, layout ini menempatkan object view childnya relatif satu terhadap lainnya dengan menggunakan ID (@+id/id).

Hendra, MT. & Hartono, M.Kom.

30

Pemrograman Piranti Bergerak

Table LayoutSesuai dengan namanya, layout ini menempatkan object view pada sel didalam suatu tabel.

Hendra, MT. & Hartono, M.Kom.

31

Pemrograman Piranti Bergerak

LatihanBuatlah layout untuk masing-masing jenis dengan hasil tampilan gambar pada Bab ini, kombinasikan pemakaian fasilitas Graphical View, Outline Windows, dan Properties Tab.

Hendra, MT. & Hartono, M.Kom.

32

Pemrograman Piranti Bergerak

Bagian 7, Pembuatan ActivityPada bagian sebelumnya kita telah membahas tentang pembuatan layout yang merupakan UI untuk Activity, pada bagian ini kita akan melangkah lebih lanjut dengan pembuatan Activity. Suatu Activity mewakili satu layar tunggal sebagai UI, sebagai contoh, suatu aplikasi email dapat saja memiliki beberapa activity, yaitu activity untuk menampilkan suatu daftar dari email baru, activity untuk membuat email, dan activity lainnya untuk membaca email. Walaupun activity-activity tersebut bekerja sama untuk membentuk suatu user experience pada aplikasi email, tetapi masing-masing activity sebenarnya berdiri sendiri dan tidak tergantung dengan activity lainnya. Secara umum langkah sederhana untuk membuat suatu Activity adalah sebagai berikut: 1. Membuat Layout yang akan menjadi UI dari Activit 2. Membuat Activity Class yang merupakan subclass dari android.app.Activity 3. Mendaftarkan Activity ke AndroidManifest

Membuat LayoutUntuk membuat suatu Activity kita perlu membuat layout yang merupakan rancangan dari user interface dalam bentuk file XML yang ditempatkan didalam folder /res/layout. Sesuatu hal yang perlu diperhatikan adalah penamaan untuk file layout harus menggunakan huruf kecil dan tidak dapat mengandung spasi. Contoh persegi.xml:

Membuat Activity classSelanjutnya adalah membuat suatu activity class yang merupakan subclass android.app.Activity dan ditempatkan pada folder /src. Pada Activity class anda perlu mengimplementasikan metode callback yang akan dipanggil oleh sistim selama transisi berbagai state pada lifecycle dari Activity, khususnya metode OnCreate untuk mempersiapkan UI dari Activityu dengan contoh Persegi.java sebagai berikut:package com.hendra.helloworld; import android.app.Activity; import android.os.Bundle;

Hendra, MT. & Hartono, M.Kom.

33

Pemrograman Piranti Bergerakpublic class Persegi extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.persegi); } }

Adapun koding diatas dapat dijelaskan bahwa pada metode onCreate kita melakukan pemanggilan terhadap metoda onCreate pada super class (jika tidak dilakukan akan terjadi error seperti pada Info Debug), kemudian adalah pemanggilan terhadap setContentView() untuk menentukan resource layout yang akan menjadi UI dari Activity yang kita buat.

Catatan: Jika activity anda bersifat self-contained dan tidak memperbolehkan aplikasi lainnya untuk mengaktifkan activity anda, maka anda tidak membutuhkan intent filters, dan hanya ada satu Activity yang memiliki action MAIN dengan kategori LAUNCHER. Pada contoh diatas dapat dijelaskan bahwa didalam aplikasi terdapat satu Activity dengan nama .Persegi (sesuai dengan mana Activity Class yang diawali dengan titik), Activity tersebut merupakan kategori LAUNCHER yang berarti Activity tersebut akan ditempatkan pada system's application launcher (aplikasi dapat diaktifkan secara langsung oleh pemakai). Kemudian Activity tersebut merupakan ACTION_MAIN yang berarti ketika aplikasi diaktifkan oleh pemakai, maka Activity tersebut merupakan titik masuk utama dari aplikasi. Hendra, MT. & Hartono, M.Kom. 34

Pemrograman Piranti Bergerak

Siklus hidup activityUntuk lebih memahami cara bekerjanya suatu Activity, maka kita harus memahami siklus hidup dari suatu Activity. Activity-activity dalam sistim diatur pada suatu activity stack. Ketika suatu activity dijalankan, dia akan ditempatkan pada posisi teratas di stack dan menjadi activity yang sedang berjalan dan activity sebelumnya berada dibawahnya di dalam stack, dan dia tidak akan kembali ke foreground sampai dengan Activity diatasnya berakhir. Suatu activity memiliki empat state penting yaitu: 1. Jika suatu activity berada di foreground dari layar (pada bagian teratas dari stack), dia adalah aktif dan sedang running. 2. Jika suatu activity kehilangan fokus tetapi masih visible (dimana, merupakan activity yang tidak berukuran penuh atau ada activity transparant mendapat fokus diatas activity anda), maka dia sedang dalam kondisi pause. Suatu pause activity masih hidup (dia tetap menangani semua state dan informasi serta tetap berada pada window manager), tetapi dapat diakhiri oleh sistim jika berada dalam situasi sangat kekurangan memori. 3. Jika suatu activity benar-benar tidak kelihatan oleh aplikasi lainnya, dia adalah berada pada kondisi stop. Dia tetap mempertahankan semua state dan informasi, tetapi tidak lagi visible bagi pemakai sehingga jendelanya tersembunyi dan akan diakhir oleh sistim ketika memori diperlukan oleh aplikasi yang lain. 4. Jika suatu activity dalam kondisi pause atau stop, sistim dapat membuang activity tersebut dari memori baik dengan meminta dia untuk selesai, atau dengan membuangnya dari memori, ketika dia ditampilkan kembali ke user, dia harus benar-benar mulai dari awal dan mengembalikan dirinya ke state sebelumnya. Diagram berikut menunjukan alur penting dari suatu activity.

Hendra, MT. & Hartono, M.Kom.

35

Pemrograman Piranti Bergerak

Gambar 1. Siklus hidup suatu Activity Ada tiga kunci loop dimana menarik untuk memantau activity anda: Entire lifetime dari suatu activity terjadi diantara pemanggilan pertama terhadap onCreate(Bundle), sampai kepada panggilan akhir kepada onDestroy(). Suatu activity akan melakukan semua persiapan global pada onCreate(), dan melepas semua resources yang masih ada pada onDestroy(), contohnya misalnya Activity anda membuka database pada onCreate, maka Activity tersebut perlu menutup database pada onDestroy. Visible lifetime dari suatu activity terjadi diantara suatu panggilan kepada onStart() sampai kepada panggilan onStop(), dalam waktu ini pemakai dapat melihat activity pada layar, walaupun dia tidak berada di foreground untuk berinteraksi dengan pemakai. Diantara dua metoda ini anda dapat mengatur sumber daya yang dibutuhkan untuk menampilkan activity kepada pemakai. Sebagai contoh anda dapat mendaftarkan suatu BroardcastReceiver di onStart() untuk memantau perubahan yang mempengaruhi UI anda, dan melakukan unregister pada onStop() ketika user tidak perlu lagi melihat apa yang anda tampilkan. Metode onStart() dan onStop() dapat dipanggil berulang kali, sebagaimana aplikasi menjadi visible dan tersembunyi bagi pemakai. Foreground lifetime dari suatu activity terjadi antara suatu pemanggilan terhadap onResume sampai kepada pemanggilan terhadap onPause(), dan waktu ini activity berada di depan dari semua activity lainnya dan berinteraksi dengna pemakai. 36

Hendra, MT. & Hartono, M.Kom.

Pemrograman Piranti Bergerak Suatu activity dapat berulang kali melalui resume dan pause state sebagai contoh ketika device dalam kondisi sleep, ketika suatu hasil activity disampaikan, ketika suatu intent baru disampaikan sehingga kode yang berada pada metode ini harus cukup ringan. Anda dapat melakukan hook terhadap callback dari masing-masing tahapan siklus hidup dengan melakukan Override pada pada metode yang bersesuaian. Semua activity perlu mengimplementasikan onCreate(Bundle) untuk melakukan persiapan awal; dan banyak yang melakukan implementasi terhadap onPause() untuk memastikan penulisan perubahan data. Anda perlu selalu melakukan pemanggilan terhadap superclass ketika melakukan implementasi terhadap metode ini.public class Activity extends ApplicationContext { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); }

Latihan1. Buatlah sebuah activity yang dapat menampilkan tahapan siklus hidup dari Activity tersebut pada saat dijalankan dengan melakukan Override terhadap metode callback onCreate, onStart, onRestart, onResume, onPause, onStop, onDestroy.@Override public void onStart() { super.onStart(); tampilToast("onStart"); } private void tampilToast(String pesan) { int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(getApplicationContext(), pesan, duration); toast.show(); }

Hendra, MT. & Hartono, M.Kom.

37

Pemrograman Piranti Bergerak

Bagian 7, Penanganan EventPada bagian sebelumnya kita telah membahas tentang pembuatan Activity, dan pada bagian ini kita akan melangkah lebih jauh dengan melakukan pembahasan tentang penanganan event terkait dengan objek-objek view yang ditempatkan pada UI seperti ketika pemakaian melakukan klik, penekanan tombol, menyentuh, ataupun perubahan fokus pada suatu view. Pada Android penanganan event pada Activity dilakukan melalui Event Listener. Contoh:

package com.hendra.persegi; import import import import import android.app.Activity; android.os.Bundle; android.view.View; android.widget.Button; android.widget.TextView;

public class PersegiActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button buttonHitung = (Button) findViewById(R.id.buttonHitung); buttonHitung.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { TextView panjang = (TextView) findViewById(R.id.panjang); TextView lebar = (TextView) findViewById(R.id.lebar); TextView hasil = (TextView) findViewById(R.id.hasil); Double nPanjang = Double. parseDouble(panjang.getText().toString()); Double nLebar = Double. parseDouble(lebar.getText().toString());

Hendra, MT. & Hartono, M.Kom.

38

Pemrograman Piranti BergerakDouble nHasil = nPanjang*nLebar; hasil.setText("Hasil : " + nHasil.toString()); } }); } }

Catatan: Secara default, penanganan event onClick dapat juga dilakukan melalui properti android:onClick=hitungOnClick sebagaimana yang ditunjukan pada contoh berikut ini : public class Persegi extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.persegi); } public void hitungOnClick(View target) { TextView panjang = (TextView) findViewById(R.id.panjang); TextView lebar = (TextView) findViewById(R.id.lebar); TextView hasil = (TextView) findViewById(R.id.hasil); Double nPanjang = Double. parseDouble(panjang.getText().toString()); Double nLebar = Double. parseDouble(lebar.getText().toString()); Double nHasil = nPanjang * nLebar; hasil.setText("Hasil : " + nHasil.toString()); } }

Event ListenerSuatu event listener adalah suatu interface didalam class view yang mengandung suatu metode callback tunggal. Metode ini akan dipanggil oleh framework Android ketika View dimana listener tersebut didaftarkan dipicu oleh interaksi pemakai melalui UI, beberapa metode callback yang terkait dengan penanganan event pemakai adalah sebagai berikut:Callback onClick (View v) onLongClick(View v) Parameter v merupakan objek view yang diklik Return void

v merupakan objek view yang diklik dan ditahan boolean, mengembalikan nilai true/false yang menunjukan

Hendra, MT. & Hartono, M.Kom.

39

Pemrograman Piranti Bergerakapakah callback dikonsumsi (false berarti event lanjutan tidak dilakukan) onFocusChange (View v merupakan objek view yang mengalami v, boolean hasFocus) perubahan tahapan fokus hasFocus merupakan tahapan baru dari objek view, true artinya menerima fokus, false artinya kehilangan fokus. onKey (View v, int keyCode, KeyEvent event) v merupakan object view dimana key dikirim kepadanya keyCode, merupakan kode dari key fisik yang ditekan (KEYCODE_0, KEYCODE_A, KEYCODE_CALL, dll) event, objek KeyEvent yang mengandung informasi terkait dengan event (ACTION_UP, ACTION_DOWN, dll) onTouch (View v, MotionEvent event) v merupakan object view dimana event touch dikirim. Event merupakan objek MotionEvent yang mengandung informasi penuh tentang kejadian tersebut Boolean, mengembalikan true jika listener mengkonsumsi event tersebut. boolean, mengembalikan true jika event dikonsumsi, dan false untuk sebaliknya.

Contoh:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ImageView gambarKu = (ImageView) findViewById(R.id.gambarKu); gambarKu.setOnTouchListener( new View.OnTouchListener() { @Override

Hendra, MT. & Hartono, M.Kom.

40

Pemrograman Piranti Bergerakpublic boolean onTouch(View v, MotionEvent event) { LayoutParams layoutParams = (LayoutParams)v.getLayoutParams(); layoutParams.topMargin += event.getY(); layoutParams.leftMargin += event.getX(); v.setLayoutParams(layoutParams); return true; } }); }

Pada contoh diatas dapat dijelaskan bahwa kita mempersiapkan suatu UI yang menggunakan RelativeLayout, kemudian didalam layout ditempatkan suatu ImageView yang diberi nama gambarKu yang dialign terhadap sudut kiri atas dengan menggunakan pengaturan margin kiri dan atas. Image view ini menampilkan gambar dari resources @drawable/icon. Kemudian pada class Activity kita melakukan pendaftaran callback onTouch terhadap objek gambarKu , didalam callback onTouch kita melakukan perubahan margin kiri dan atas terhadap objek view yang menerima event tersebut (dalam hal ini objek gambarKu yang diwakili oleh parameter v)

Latihan1. Buatlah aplikasi Android yang berfungsi menghitung luas persegi berdasarkan ukuran panjang dan lebar yang diberikan pemakai. 2. Buatlah aplikasi yang menampilkan sebuah icon dengan ImageView pada suatu Relative Layout, kemudian gunakan penangan event OnTouch untuk mengatur perpindahan ImageView berdasarkan lokasi yang ditunjuk oleh MotionEvent.

Hendra, MT. & Hartono, M.Kom.

41

Pemrograman Piranti Bergerak

Bagian 8, Mengaktifkan ActivitySecara default suatu aplikasi Andorid hanya dapat memiliki satu Activity yang memiliki action MAIN dengan kategori LAUNCHER, sehingga Activity tersebut dapat diaktifkan oleh user melalui launcher sistim aplikasi, pada perkembangan selanjutnya tidak jarang kita membuat aplikasi yang memiliki lebih dari satu Activity untuk menciptakan pengalaman pemakai. Misalnya kita ingin membuat aplikasi yang terdiri dari Activity utama yang menampilkan beberapa menu pilihan kepada pemakai, kemudian berdasarkan pilihan dari pemakai akan diaktifkan Activity yang bersesuaian. Pada bagian sebelumnya kita telah membahas tentang penanganan event pada suatu objek view, pada bagian ini kita akan memanfaatkan fasilitas tersebut untuk mengaktifkan Activity secara pemrograman melalui intent dengan perintah startActivity(). Secara umum ada dua bentuk pemakaian intent untuk mengaktifkan Activity yaitu: 1. Explicit intent, dimana kita menentukan komponen yang akan dijalankan dengan perintah setClass(Context, Class) dimana class merupakan Activity class yang akan dijalankan. Explicit intent hanya efektif untuk menjalankan Activity yang berada pada aplikasi yang sama. 2. Implicit intent, dimana kita tidak perlu menentukan komponen yang akan dijalankan, tetapi kita perlu memberikan informasi tambahan seperti Action dan Uri. Explicit intent efektif untuk menjalankan Activity yang berada pada aplikasi yang sama maupun pada aplikasi eksternal. Pada bagian ini kita akan memfokuskan pada pembahasan tentang Explicit intent.

Explicit intentPemakaian Explicit intent dilakukan dengan menentukan class dari Activity yang akan diaktifkan oleh intent dengan contoh sebagai berikut: Misalnya aplikasi kita memiliki suatu Activity utama yang menampilkan empat tombol pilihan dimana pada masing-masing tombol pilihan jika diklik akan mengaktifkan Activity yang bersesuaian. Agar hal ini dapat dilakukan maka kita perlu membuat penanganan event onClick pada masing-masing button, kemudian pada masing-masing rutin penanganan event dibuat Intent dari komponen Activity class yang akan diaktifkan, dan akhirnya Activity diaktifkan dengan menggunakan perintah startActivity(intent), untuk jelasnya kita akan memberi koding bagaimana mengaktifkan Persegi.class berdasarkan klik pada button Persegi sebagai berikut: Hendra, MT. & Hartono, M.Kom. 42

Pemrograman Piranti Bergerak

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button buttonPersegi = (Button) findViewById(R.id.buttonPersegi); buttonPersegi.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(this, Persegi.class5); startActivity(intent); } }); }

Berdasarkan contoh diatas dapat kita jelaskan bahwa, awalnya kita mendaftarkan suatu callback onClick untuk menangani event onClick pada objek buttonPersegi (setOnClickListener), kemudian pada rutin penangan event onClick akan dipersiapkan suatu objek intent (new Intent), dan pada objek intent kita tentukan komponen yang akan diaktifkan, yaitu Persegi.class (setClass), dan akhirnya akhirnya Activity diaktifkan (startActivity).

Penanganan Activity oleh AndroidKetika kode tersebut dijalankan, maka suatu instant baru dari class Persegi akan dibuat, kemudian instant tersebut akan didorong ke Activity Stack tepat diatas Activity sebelumnya, sehingga Activity Persegi akan ditampilkan di foreground.

5

Merupakan type class dari activity yang akan diluncurkan oleh intent

Hendra, MT. & Hartono, M.Kom.

43

Pemrograman Piranti Bergerak Gambar 1 Activity stack yang mengatur visible Activity Ketika Activity Persegi berakhir, maka Activity Persegi akan kembali ke foreground.

Mengakhiri activitySecara program anda dapat mengakhir suatu Activity dengan memanggil metode finish(). Contoh:Button buttonSelesai = (Button) findViewById(R.id.buttonSelesai); buttonSelesai.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { finish(); } });

Latihan1. Buatlah aplikasi android yang menampilkan pilihan Persegi, Segitiga, Lingkaran, Selesai dalam bentuk button, kemudian buatlah masing-masing activity yang dapat melakukan perhitungan yang dimaksud dan diaktifkan melalui masingmasing tombol pilihan.. 2. Tambahkan juga kemampuan pada masing-masing activity untuk kembali kepada activity yang menampilkan tombol pilihan (gunakan metode finish()).

Hendra, MT. & Hartono, M.Kom.

44

Pemrograman Piranti Bergerak

Bagian 9, Pertukaran Data antar ActivityPada bagian sebelumnya kita telah membahas bagaimana pembuatan Activity dan pengaktifan Activity secara Explicit, walaupun beberapa Activity dapat berada pada aplikasi yang sama, tetapi pada prinsipnya antara suatu Activity dengan Activity lainnya tidak memiliki kaitan satu sama yang lain. Kadang-kadang kita membutuhkan proses pertukaran data antara Activity yang mengaktifkan dengan Activity yang diaktifkan, serta menerima kembali hasil dari Activity tersebut. Pada bagian ini kita akan membahas bagaimana pertukaran data dilakukan.

Menulis data pada intentSebagaimana yang telah dibahas pada bagian sebelumnya bahwa pengaktifan Activity adalah melalui Intent, dan pada objek Intent tersedia fasilitas Bundle ataupun menyimpan data yang kirim bersamaan dengan Intent tersebut. Misalnya pada contoh bagian sebelumnya pada saat mengaktifkan Activity Persegi.class kita juga ingin mengirim data awal untuk panjang adalah 100 dan lebar adalah 200 dan sebuah pesan kirim data secara koding sebagai berikut:buttonPersegi.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(this, Persegi.class6); //mengirim data melalui bundles intent.putExtra("panjang", 100); intent.putExtra("lebar", 200); intent.putExtra("pesan", "kirim data") startActivity(intent); } });

Berdasarkan contoh tersebut diatas dapat dijelaskan bahwa awalnya akan dibuat suatu intent baru dengan perintah new Intent(), kemudian ditentukan komponen yang akan diaktifkan adalah Persegi.class dengan perintah setClass(getApplicationContext(), Persegi.class), dan pada intent akan ditambahkan beberapa data tambahan yaitu panjang=100, lebar=200 dengan perintah putExtra(panjang,100) dan putExtra(lebar,200), dan suatu pesan string kirim data dengan perintah putExtra(pesan,kirim data), dan diakhir dengan pengaktifan target Activity dengan perintah startActivity(intent).6

Merupakan type class dari activity yang akan diluncurkan oleh intent

Hendra, MT. & Hartono, M.Kom.

45

Pemrograman Piranti Bergerak

Membaca data dari intentData yang dikirim melalui intent dapat diambil oleh target Activity dengan menggunakan perintah seperti getInt, getString sesuai dengan jenis data dan identitas data. Berikut ini adalah koding yang kita gunakan untuk mengambil data dari intent dari contoh sebelumnya.@Override protected void onCreate(Bundle

savedInstanceState) {

super.onCreate(savedInstanceState); setContentView(R.layout.persegi); Intent intent = getIntent(); Bundle bundle = intent.getExtras(); //pastikan bundle tidak kosong if (bundle != null) { Integer panjang = bundle.getInt("panjang"); Integer lebar = bundle.getInt("lebar"); String pesan = bundle.getString("Pesan"); } }

Berdasarkan koding tersebut diatas dapat dijelaskan bahwa pada metode callback onCreate di target Activity akan diawali dengan pemanggilan terhadap super class onCreate (sebagaimana yang disyaratkan oleh Android), kemudian dilanjutkan dengan penentuan UI Activity dengan setContentView, setelah itu kita mengambil intent yang mengaktifkan Acvitity dengan getIntent(), dan dilanjutkan dengan mengambil bundle dari intent tersebut dengan getBundle(), setelah itu kita perlu memastikan bahwa bundle tidak kosong (null) untuk menghindari terjadinya error, setelah itu kita akan mengambil masing-masing data dengan menggunakan getInt(panjang), getInt(lebar), dan getString(pesan).

Mengembalikan data melalui intentSelain digunakan untuk mengirim data ke target Activity, Intent juga dapat digunakan untuk mengirim data kembalian kepada kepada Activity yang mengaktifkannya, contoh:buttonKembalian.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("hasil", 2000); this.setResult(RESULT_OK, intent); finish(); } });

Hendra, MT. & Hartono, M.Kom.

46

Pemrograman Piranti Bergerak

Berdasarkan contoh tersebut diatas dapat dijelaskan bahwa pada kita mendaftarkan penanggan event onClick pada buttonKembalian, sehingga pada saat pemakai melakukan klik pada button tersebut maka akan dibuat suatu Intent baru, dan kita menuliskan data hasil dengan nilai 2000, kemudian menentukan nilai kembalian resultCode dari Activity adalah RESULT_OK, dan akhirnya Activity diakhir finish().

Mengambil data kembalianPada bagian sebelumnya kita telah membahas bagaimana kita memanfaatkan intent untuk mengembalikan data kepada Activity yang mengaktifkan Activity tersebut, dan pada bagian ini kita akan membahas bagaimana Acitivity tersebut menerima hasil kembalian tersebut. Untuk mengaktifkan suatu activity yang mengembalikan hasil proses kita dapat menggunakan perintah StartActivityForResult (intent, requestCode). Adapun fungsi requestCode dalam hal ini adalah suatu identifier yang nantinya akan kita gunakan untuk mengenali nilai kembalian dari Activity tersebut, selanjutnya data kembalian akan ditangkap dengan sub rutin onActivityResult(int requestCode, int resultCode, Intent data).buttonPersegi.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(this, Persegi.class7); startActivityForResult(intent,1); } });

Berdasarkan contoh tersebut diatas dapat dijelaskan bahwa awalnya akan dibuat suatu Intent baru, kemudian ditentukan komponen yang akan diaktifkan adalah Persegi.class, dan diakhir dengan pengaktifan target Activity dengan perintah startActivityForResult(intent, 1), dimana 1 merupakan requestCode yang akan digunakan untuk mengenali hasil dari Activity ini. Selanjutnya kita mempersiapkan suatu callback rutin onActivityResult yang otomatis akan dipanggil jika target Activity berakhir dan mengembalikan data melalui intent.@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode,7

Merupakan type class dari activity yang akan diluncurkan oleh intent

Hendra, MT. & Hartono, M.Kom.

47

Pemrograman Piranti BergerakresultCode, data); if(resultCode==RESULT_OK && requestCode ==1){ Integer hasil=data.getIntExtra("hasil", 0); } }

Berdasarkan contoh tersebut diatas dapat kita jelaskan bahwa rutin tersebut diatas merupakan callback yang otomatis dipanggil untuk merespon data kembalian oleh target Activity melalui Intent. Awalnya kita akan melakukan pemanggilan terhadap super class dengan melewatkan parameter yang bersesuaian, kemudian kita perlu melakukan pemeriksaan terhadap resultCode dan requestCode, dan mengambil hasil dari data intent dengan perintah getIntExtra(hasil, 0).

Latihan1. Buatlah aplikasi android yang menampilkan pilihan Persegi, Segitiga, Lingkaran, Selesai dalam bentuk button, kemudian buatlah masing-masing Activity yang dapat melakukan perhitungan yang dimaksud dan diaktifkan melalui masingmasing tombol pilihan yang disertai dengan pengiriman nilai awal. 2. Tambahkan juga kemampuan pada masing-masing activity untuk mengembalikan nilai hasil kepada Activity yang mengaktifkannya, dan ditampilkan dengan toast.

Hendra, MT. & Hartono, M.Kom.

48

Pemrograman Piranti Bergerak

Bagian 10, Pengaktifan Activity EksternalPada bagian sebelumnya kita telah membahas pengaktifkan Activity secara Explicit yang efektif untuk mengaktifkan Activity yang berada pada aplikasi yang sama. Pada bagian ini kita akan membahas tentang pengaktifkan Activity yang berada pada aplikasi lain secara Implicit. Agar Activity yang berada pada aplikasi kita dapat diaktifkan oleh aplikasi External, maka kita perlu menambahkan Intent-filter pada saat meregister Activity tersebut pada AndroidManifest, selanjutnya berdasarkan informasi Action dan Data, kita akan mengaktifkan Activity tersebut.

Membuat intent-filterAgar suatu Activity dapat diaktifkan dari aplikasi eksternal, maka perlu didaftarkan Intent-filter pada Activity tersebut pada saat deklarasi Activity tersebut pada file AndroidManifest.xml. Intent-filter menginformasikan kepada sistim Implicit Intent apa saja yang akan ditangani oleh Activity tersebut. Suatu intent-filter terdiri dari field action, category, dan data yang berfungsi untuk melakukan filter terhadap intent yang melewatinya dengan pencocokan pada ketiga field tersebut diatas. Contoh:

Pada contoh tersebut diatas Activity Persegi memiliki dua intent-filter yaitu ACTION_MAIN dan CATEGORY_LAUNCHER yang artinya Activity tersebut akan ditempatkan pada launcher sistim aplikasi dan merupakan Activity utama yang akan diaktifkan pada saat pengaktifan oleh pemakai, kemudian Activity Persegi juga memiliki intent-filter yang mana terdiri dari field action, category dan data untuk menfilter intent yang memiliki action ACTION_VIEW dan schema "foo" dan host "persegi.hendra.com" dengan kata lain .PersegiActivity juga dapat diaktifkan jika ada intent yang melewati intent-filter yang memiliki action ACTION_VIEW dan data uri yang diawali dengan foo://persegi.hendra.com. Jika kita ingin membatasi pengaktifan Hendra, MT. & Hartono, M.Kom. 49

Pemrograman Piranti Bergerak Activity, maka kita dapat menambahkan atribut permission pada saat mendeklarasikan suatu Activity.

prompt 7. Pada sqlite prompt ketikan .schema akan menampikan schema database 8. Pada sqlite prompt ketikan .tables akan menampilkan tabel dalam database 9. Pada sqlite prompt ketikan .quit untuk keluar dari perangkat SQLite3 10. Pada sqlite prompt ketikan .help untuk menampikan fasilitas Help Contoh: Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. C:\PROGRA~1>cd android C:\PROGRA~1\Android>cd android-sdk C:\PROGRA~1\Android\android-sdk>cd platform-tools C:\PROGRA~1\Android\android-sdk\platform-tools>adb shell # cd /data/data/com.hendra.testdb # ls # cd databases # ls # sqlite3 MyDb sqlite3 MyDb SQLite version 3.6.22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .schema .schema Hendra, MT. & Hartono, M.Kom. 65

Pemrograman Piranti Bergerak CREATE TABLE Siswa (nim PRIMARY KEY,nama TEXT, nilai char(1)); CREATE TABLE android_metadata (locale TEXT); sqlite> .tables .tables Siswa sqlite> .quit .quit # android_metadata

Latihan:1. Buatlah sebuah class yang diturunkan dari SQLiteOpenHelper yang berfungsi membuat database MyDb, dan sebuah tabel Siswa yang memiliki struktur sebagai berikut: nim text primarykey nama text nilai char(1) 2. Buatlah activity yang akan memanfaatkan class tersebut diatas, dan membuka database secara read/write. 3. Eksplorasi keberhasilan pembuatan database dengan fasiltias view Explorer File pada DDMS. 4. Lakukan eksplorasi database yang dihasilkan dengan fasilitas perangkat Sqlite3 yang diaktifkan dari adbshell. FAQ SQLite3 1. Bagaimana membuat suatu field AUTOINCREMET? Deklarasi kolom tersebut sebagai INTEGER PRIMARY KEY AUTOINCREMENT. 2. Tipe data apa saja yang didukung oleh SQLite? SQLite menggunakan dynamic typing, isi dapat disimpan sebagai INTEGER, REAL, TEXT, BLOB atau sebagai NULL. Hendra, MT. & Hartono, M.Kom. 66

Pemrograman Piranti Bergerak 3. SQLite memperbolehkan saya menyisip suatu string pada kolom database yang bertipe integer! Ini adalah fitur, bukan bug. Sqlite menggunakan dynamic typing. SQLite tidak melakukan pemaksaan terhadap tipe data, semua data dapat disisipkan dalam semua kolom, anda dapat mengisi string kedalam kolom integer, floating point, boolean, ataupun tanggal pada kolom text (sesuatu pengecualian adalah kolom dengan tipe INTEGER PRIMARY KEY akan terjadi error kalau pengisian dilakukan dengan data bukan integer). Jika anda sebuah kolom tipe INTEGER, dan anda mencoba untuk menyisip sebuah string ke kolom tersebut, SQLite akan berusaha melakukan konversi string tersebut ke suatu integer, jika berhasil akan disimpan sebagai integer, jika tidak string tersebut akan disimpan, fitur ini disebut sebagai type affinity. Untuk FAQ lainnya dapat dibaca di http://www.sqlite.org/faq.html

Hendra, MT. & Hartono, M.Kom.

67

Pemrograman Piranti Bergerak

Bagian 14, Pengolahan DataPada bagian sebelumnya kita telah membahas dan mempraktekan proses pembuatan database, dan pada bagian ini kita akan memfokuskan pada proses pengolahan data seperti menyisip, memperbaharui, menghapus, dan membaca data. Sebagaimana proses pengolahan data umumnya, sebelum suatu dapat dapat dilakukan operasi, maka perlu dibuka, dan setelah selesai operasi, maka database perlu ditutup.

Membuka databaseUntuk membuka suatu objek database secara readonly dapat menggunakan metode getReadableDatabase(), dan secara read/write dapat menggunakan metode getWriteableDatabase(), karena pemakaian getWriteableDatabase(). Suatu SQLiteException akan dilempar jika database gagal dibuka. Contoh:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.editsiswa); MyOpenHelper myOpenHelper = new MyOpenHelper(this); db = myOpenHelper.getWritableDatabase(); }

Menutup databaseUntuk menutup database dapat digunakan pemanggilan terhadap metode close. Contoh:@Override protected void onDestroy() { super.onDestroy(); db.close(); }

Menyisip dataUntuk melakukan insert data dapat menggunakan metoda insert yang terdapat pada objek SQLiteDatabase, dengan syntax sebagai berikut: public long insert (String table, String nullColumnHack, ContentValues values)

Hendra, MT. & Hartono, M.Kom.

68

Pemrograman Piranti BergerakParameters Nama tabel dimana baris akan ditambahkan optional; dapat bernilai null. Digunakan jika anda bermaksud menyisip suatu baris kosong, karena SQL tidak memperbolehkan penyisipan suatu baris yang kosong tanpa nullColumnHack menyebutkan minimal satu kolom, jika anda perlu menyisipkan suatu baris kosong, maka pada parameter ini diisi nama kolom yang nullable. values Merupakan data map yang mengandung inisial kolom dan nilai untuk baris Returns table

Mengembalikan row ID dari baris yang baru disisipkan, atau -1 jika terjadi kesalahan Contoh:ContentValues initialValues = new ContentValues(); initialValues.put("nim", "920403024"); initialValues.put("nama","Hendra"); initialValues.put("nilai", "A"); Integer hasil = db.insert("MyDb", null, initialValues);

Memperbaharui dataUntuk melakukan pembaharuan data, anda dapat menggunakan metode update sebagai berikut: public int update (String table, ContentValues values, String whereClause, String[] whereArgs)Parameters table values whereClause whereArgs Returns Nama tabel dimana proses update akan dilakukan Suatu data map dimana terdiri dari nama kolom dan nilai, null merupakan nilai yang valid dimana akan diterjemahkan menjadi NULL. Suatu WHERE clause optional yang diaplikasikan pada update. Nilai null berarti update terhadap seluruh baris dalam tabel. Anda dapat mengikutsertakan ? Pada bagian whereClause, yang mana akan diganti dengan nilai yang berasal dari whereArgs.

Jumlah baris yang terpengaruh. Contoh:ContentValues initialValues = new ContentValues(); initialValues.put("nim", "9224");

Hendra, MT. & Hartono, M.Kom.

69

Pemrograman Piranti BergerakinitialValues.put("nilai", "B"); Integer hasil = db.update("Siswa", initialValues, "nim=?", new String[] {"920403024"});

Menghapus dataUntuk melakukan penghapusan data, anda dapat menggunakan metode delete sebagai berikut: public int delete (String table, String whereClause, String[] whereArgs)Parameters Table whereClause Returns Nama tabel dimana proses hapus dilakukan Suatu WHERE clause optional yang diaplikasikan pada penghapusan. Nilai null artinya penghapusan dilakukan terhadap semua baris.

Jumlah baris yang terpengaruhi jika dilewatkan suatu whereClause, 0 sebaliknya.Integer hasil = db.delete("Siswa","nim=?", new String[] {"9224" });

atau menghapus seluruh barisInteger hasil = db.delete("Siswa",null, null);

Membaca dataUntuk membaca data dari Tabel dapat menggunakan perintah query yang akan mengembalikan suatu objek Cursor, adapun syntax penulisan untuk query adalah sebagai berikut: public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)Parameters distinct table columns true jika anda ingin menampilkan masing-masing baris secara unik, dan sebaliknya false. Nama dari tabel yang akan dikompilasi pada query. Suatu daftar dari kolom yang akan dikembalikan. Lewatkan null akan mengembalikan semua kolom, hal ini tidak disarankan untuk mencegah pembacaan data dari storage yang kemungkinan tidak dimanfaatkan. Suatu filter yang mendeklarasikan baris mana yang akan dikembalikan, dengan format penulisan seperti WHERE clause pada SQL, lewatkan null akan mengembalikan semua baris pada tabel.

selection

Hendra, MT. & Hartono, M.Kom.

70

Pemrograman Piranti BergerakselectionArgs groupBy having orderBy limit Returns Anda dapat mengikutsertakan ? Pada bagian selection, yang mana akan diganti dengan nilai yang berasal dari selectionArgs. Suatu filter yang mendeklarasikan bagaimana baris dikelompokan, sebagaimana format pada clause GROUP BY pada SQL, lewatkan null berarti tidak ada baris yang dikelompokan. Suatu filter yang mendeklarasikan bagaimana baris dikelompokan didalam cursor, jika GROUP BY digunakan, format sebagaimana clause HAVING pada SQL, lewatkan null berarti semua baris hasil pengelompokan akan diikutkan. Bagaimana baris akan diurutkan dengan format sebagaimana pada clause ORDER BY pada SQL, lewatkan null berarti tidak ada pengaturan urutan. Membatasi jumlah dari baris yang akan dikembalikan oleh query, format sebagaimana clause LIMIT pada SQL, lewatkan null berarti tidak ada LIMIT clause.

Suatu objek Cursor yang pada diposisikan sebelum isi yang pertama, catatan Cursor adalah tidak disinkronisasi.Cursor cursor = db.query(false,"Siswa",null,null,null,null,null,null,null);

Perintah diatas akan mengembalikan semua kolom dan semua baris pada tabel SiswaCursor cursor = db.query(false,"Siswa",new String[] {"nim","nama"}, null,null,null,null,null,null);

Perintah diatas akan mengembalikan kolom nim, nama dari semua baris pada tabel SiswaCursor cursor = db.query(false,"Siswa",new String[] {"count(*)"}, null,null,null,null,null,null);

Perintah diatas akan mengembalikan 1 kolom yang berisi jumlah baris pada tabel Siswa Contoh Query dan pemakaian Cursor:Cursor cursor = db.query(false,"Siswa",null,null,null,null,null,null,null); if (cursor.getCount() > 0) { cursor.moveToFirst(); do { System.out.println(cursor.getString(0) + "|" +cursor.getString(1) + "|" + cursor.getString(2)); } while (cursor.moveToNext()); } else { System.out.println("Tidak ada data"); }

Latihan:1. Buatlah suatu aplikasi Android yang memiliki fasilitas Tambah, Perbaiki, dan Hendra, MT. & Hartono, M.Kom. 71

Pemrograman Piranti Bergerak Hapus data siswa.

Hendra, MT. & Hartono, M.Kom.

72

Pemrograman Piranti Bergerak

Bagian 15, Content ProviderPada bagian sebelumnya kita telah membahas dua komponen utama Android yaitu Activity dan Broadcast Receiver, pada bagian ini kita akan membahas komponen yang ketiga yaitu Content Provider. Content Provider merupakan fasilitas pada Android yang memungkinkan kita untuk berbagi data antar aplikasi, sehingga kita dapat menggunakan kembali data yang sudah tersedia pada aplikasi lain. Sebagai contoh misalnya kita membutuhkan data contact berupa nama orang dan no panggilanya, tentu saja adalah lebih memanfaatkan Content Provider contacts yang telah tersedia daripada mengusahakan suatu data contacts secara mandiri. Untuk lebih memahami Content Provider dan bagaimana mengaksesnya, maka kita akan membahas secara langkah per langkah.

URISetiap Content Provider diekspos dengan menggunakan suatu public URI (yang dibungkus sebagai suatu object Uri) yang mana merupakan identitas unik, sehingga untuk dapat mengakses suatu Content Provider, maka kita perlu mengetahui URI dari Content Provider tersebut, dan semua URI memiliki format penulisan string content:////, android mendefinsikan konstanta CONTENT_URI untuk semua provider yang secara default tersedia didalam platformnya. Sebagai contoh, URI untuk tabel pencocokan nomor telepon ke nama orang adalah :Android.provider.Contacts.Phones.CONTENT_URI

yang biasanya secara ringkas ditulis sebagaiPhones.CONTENT_URI

yang merupakan konstanta dari string"content://com.android.contacts/data/phones"

URI tersebut diatas mengacu kepada semua data yang berada pada provider phones, jika anda ingin mengacu pada data dengan _ID tertentu saja maka penulisan URI menjadi:"content://com.android.contacts/data/phones/1"

Yang berarti kita mengacu kepada data dengan _ID 1.

Hendra, MT. & Hartono, M.Kom.

73

Pemrograman Piranti Bergerak

Query Content ProviderUntuk melakukan query terhadap suatu Content Provider anda membutuhkan tiga potongan informasi sebagai berikut: URI yang mengidentifikasikan provider tersebut Nama dari field data yang ingin anda terima Tipe data dari field-field tersebut.

Untuk melakukan query terhadap suatu content provider, anda dapat menggunakan metode Activity.managedQuery() yang akan mengembalikan suatu objek Cursor. Suatu managed Cursor menangani semua dengan baik, seperti melakukan unload dirinya ketika aktifitas di-pause, dan melakukan requery ketika aktifitas di-restart.public class ContentproviderActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); String[] projection=new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Phone.NUMBER }; final Cursor cursor = managedQuery(Phone.CONTENT_URI,projection, null, null, null); if (cursor.getCount() > 0) { cursor.moveToFirst(); System.out.println(cursor.getString(cursor .getColumnIndex(Contacts.DISPLAY_NAME))); System.out.println(cursor.getString(cursor .getColumnIndex(Phone.NUMBER))); } else { System.out.println("contact kosong"); } } }

Jika anda ingin melakukan query terhadap record tertentu, anda juga membutuhkan ID dari record tersebut.Uri myContact = ContentUris.withAppendedId(Phone.CONTENT_URI, 1); System.out.println(myContact.toString()); final Cursor cursor = contentResolver.query(myContact,

Hendra, MT. & Hartono, M.Kom.

74

Pemrograman Piranti Bergerakprojection, null, null, null);

dan dalam hal ini myContact merupakan uri"content://com.android.contacts/data/phones/1",

yang mengacu kepada _ID =

1.

Pemakaian PermisiSebelum suatu aplikasi dapat melakukan akses query ke contact record, maka harus diregistrasi pemakaian permisi melalui file AndroidManifest.xml sebagai berikut:

Menampilkan Contact dalam ListViewlistcontact.xml

listcontact_dtl.xml

Hendra, MT. & Hartono, M.Kom.

75

Pemrograman Piranti Bergerak

ListContact.javapublic class ListContact extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.listcontact); } @Override protected void onStart() { super.onStart(); ArrayList list = new ArrayList(); String[] projection = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Phone.NUMBER }; ContentResolver contentResolver = getContentResolver(); final Cursor cursor = contentResolver.query(Phone.CONTENT_URI, projection, null, null, null); while (cursor.moveToNext()) { HashMap item = new HashMap(); item.put("id", cursor.getString(0)); item.put("nama", cursor.getString(1)); item.put("nomor", cursor.getString(2)); list.add(item); } SimpleAdapter notes = new SimpleAdapter(this, list, R.layout.listcontact_dtl, new String[] { "nama", "nomor" }, new int[] { R.id.textViewNama, R.id.textViewNomor }); setListAdapter(notes); } @Override protected void onListItemClick(ListView l, View v, int position, long thisID) { super.onListItemClick(l, v, position, thisID); @SuppressWarnings("unchecked") HashMap item = (HashMap)

Hendra, MT. & Hartono, M.Kom.

76

Pemrograman Piranti Bergerakl.getItemAtPosition(position); tampilToast("klik " + item.get("nomor")); } private void tampilToast(String pesan) { int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(getApplicationContext(), pesan, duration); toast.show(); } }

Latihan:1. Buatlah suatu aplikasi Android yang dapat menampilkan nomor dan nama dari Content Providers contacts pada suatu listview.

Hendra, MT. & Hartono, M.Kom.

77

Pemrograman Piranti Bergerak

Bagian 16, Membuat Content ProviderPada bagian sebelumnya kita telah membahas tentang Content Provider dan bagaimana mengakses Content Provider bawaan dari Android. Pada bagian ini kita akan melangkah lebih jauh untuk membahas pembuatan Content Provider. Untuk membuat content provider anda sendiri di Android segala sesuatu yang anda perlukan adalah membuat class yang merupakan subclass dari ContentProvider dan melakukan override terhadap beberapa metode yang terdefinisi didalamnya. Metode yang perlu anda implementasi adalah: getType(): mengembalikan data MIME type dari URI yang diberikan. onCreate(): dipanggil ketika provider sedang dimulai, pada bagian ini dapat anda gunakan untuk membuka database yang menyimpan data. query(): menerima permintaan dari suatu klien. Hasilnya akan dikembalikan sebagai suatu objek Cursor. insert(): menyisip suatu record bari ke content provider. delete(): menghapus record yang ada dari content provider. update(): mengupdate suatu record yang ada dari content provider. Metode query() harus mengembalikan suatu objek Cursor yang aman dan dapat diiterasi sepanjang data yang diminta. Cursor sendirinya adalah suatu interface dan Android, dan Android telah menyediakan suatu objek Cursor yang dapat anda gunakan, sebagai contoh SQLiteCursor dapat yang dapat diiterasi melalui data yang tersimpan pada SQLite database. Anda dapat memanggil objek tersebut dengan metode query() pada class SQLiteDatabase.

Membuat DatabaseSebagai langkah awal pembuatan Content Provider adalah mempersiapkan fasilitas penyimpan data, dalam hal ini kita akan menggunakan database SQLite yang secara default telah disediakan pada platform Android. Sebagaimana yang pernah kita bahas pada bagian sebelumnya, untuk memudahkan akses ke database kita perlu membuat suatu class bantuan yang merupakan subclass dari SQLiteOpenHelper dan melakukan override terhadap beberapa callback yang berfungsi untuk membuat dan menguprade database.public class MyOpenHelper extends SQLiteOpenHelper { static final String DB_NAME = "MyDb"; static final Integer DB_VERSION = 1; public MyOpenHelper(Context context) {

Hendra, MT. & Hartono, M.Kom.

78

Pemrograman Piranti Bergeraksuper(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE Siswa (_id integer primary key autoincrement, " + "nim Text," + "nama TEXT, nilai char(1))"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w("Upgrade", "Proses akan drop dan buat ulang tabel."); db.execSQL("DROP TABLE IF EXISTS Siswa"); onCreate(db); } }

Pada class tersebut diatas, kita akan membuat suatu database MyDb yang didalamnya terdapat suatu tabel Siswa yang memiliki empat field yaitu _id, nim, nama dan nilai. Sesuatu hal yang perlu kita ingat adalah suatu tabel yang akan digunakan untuk Content Provider perlu memiliki suatu field primary key autoincrement dengan nama _id.

Membuat class ProviderSetelah fasilitas penyimpanan data telah disediakan dan didefinisikan, maka Langkah selanjutnya adalah membuat suatu class Provider yang merupakan subclass dari ContentProvider, serta melakukan Override terhadap beberapa metode yang ada, berikut ini adalah template dari metoda yang harus dioverride dan aksi yang perlu dilakukan pada masing-masing metodapublic class SiswaProvider extends ContentProvider { @Override public boolean onCreate() { //disini anda melakukan proses pembukaan database //dan mengembalian boolean keberhasilan pembukaan database } @Override public String getType(Uri uri) { //disini anda melakukan pemeriksaan URI //dan mengembalian tipe dari URI } @Override public Uri insert(Uri uri, ContentValues values) { //disini anda mengimplementasikan penambahan data //dan mengembalikan hasil dalam bentuk URI }

Hendra, MT. & Hartono, M.Kom.

79

Pemrograman Piranti Bergerak@Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { //disini anda mengimplementasikan pembacaan data dari database //dan mengembalikan hasilnya dalam bentuk cursor } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { //disini anda mengimplementasikan update data pada database //dan mengembalikan data jumlah record yang terpengaruhi } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { //disini anda mengimplementasikan penghapusan data pada database //dan mengembalikan data jumlah record yang terpengaruhi } }

Berikut ini adalah koding kongkrit dari Siswa Provider yang kita buat.public class SiswaProvider extends ContentProvider { public static final String AUTHORITY = "com.hendra.buatcontentprovider.SiswaProvider"; private static final int SISWA = 1; private static final int SISWA_ID = 2; private static final String TABLE_NAME = "Siswa"; private SQLiteDatabase db; private static final UriMatcher uriMatcher; static { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(AUTHORITY, "siswas", SISWA); uriMatcher.addURI(AUTHORITY, "siswas/#", SISWA_ID); } @Override public boolean onCreate() { Context context = getContext(); MyOpenHelper myOpenHelper = new MyOpenHelper(context); db = myOpenHelper.getWritableDatabase(); return (db == null) ? false : true; } @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)) { // ---ambil semua siswa--case SISWA: return "vnd.android.cursor.dir/vnd.hendra.siswa "; // ---ambil siswa tertentu saja---

Hendra, MT. & Hartono, M.Kom.

80

Pemrograman Piranti Bergerakcase SISWA_ID: return "vnd.android.cursor.item/vnd.hendra.siswa "; default: throw new IllegalArgumentException("Unsupported URI: " + uri); } } @Override public Uri insert(Uri uri, ContentValues values) { // ---tambah SISWA baru--long rowID = db.insert(TABLE_NAME, "", values); // ---jika penambahan berhasil--if (rowID > 0) { Uri _uri = Con