Anda di halaman 1dari 113

PEMROGRAMAN PIRANTI BERGERAK BERBASIS ANDROID

DIKTAT KULIAH

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

PROGRAM STUDI TEKNIK INFORMASI STMIK IBBI MEDAN 2011

KATA PENGANTAR
Dewasa 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 Android


Apa 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 Android
Platform 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.

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.

Pemrograman Piranti Bergerak

Arsitektur Android
Arsitektur 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 Aplikasi
Android 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

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.

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

Gambar 2. Arsitektur eksekusi aplikasi Android

Aplikasi Android
Suatu 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 Android


Berikut 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 Android


Untuk 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

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

Hendra, MT. & Hartono, M.Kom.

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.

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.

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.

Pemrograman Piranti Bergerak

Bagian 2, Project Android anda yang pertama


Sebagaimana 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 Eclipse


Eclipse 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 Eclipse


Secara 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.

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 Android


Untuk 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 shell


Untuk 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 Android


Tabel 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 Android


Jika 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 anda


Agar 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.

Latihan
Buatlah 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 Android


Untuk 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 HelloWorld


Kita 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-ldpi


Drawable 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.

Values
Resource 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


<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, HelloWorldActivity!</string> <string name="app_name">HelloWorld</string> </resources>

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.

Layout
Resource 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.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>

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 Assets


Direktori 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.XML
Merupakan file XML yang berisi informasi mengenai aplikasi Android.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hendra.helloworld" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".HelloWorldActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>

Hendra, MT. & Hartono, M.Kom.

18

Pemrograman Piranti Bergerak


</activity> </application> </manifest>

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.

Latihan
1. 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 Resources


Anda 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 Resource


Anda 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 XML


Untuk mengakses resources dapat dilakukan melalui file XML maupun melalui koding, adapun syntax untuk mengacu pada suatu resources pada file XML adalah : @[<package_name>:]<resource_type>/<resource_name> dimana <packace_name> adalah nama package di mana resources berada (anda dapat mengabaikannya jika mengaksesnya dari package yang sama, <resource_type> adalah subclass R untuk jenis resource, dan <resource_name> adalah nama variabel resource Contoh deklarasi resources: /res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello"> Hello World, HelloWorldActivity!</string> <string name="app_name">HelloWorld</string> </resources>

Contoh pemakaian:
<TextView android:id="@+id/helloText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor= "@android:color/secondary_text_light" android:text="@string/hello" />

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 Koding


Untuk 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 Java
Android Resource res/layout/main.xml res/drawable-hdpi/file.png <string name="helloHendra"> @+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 Resource
Sebuah 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 <?xml version="1.0" encoding="utf8"?> <resources> <string name="string_name"> text_string</string> </resources> <?xml version="1.0" encoding="utf8"?> <resources> <string-array name="array_name"> <item> text_string</item> </string-array> </resources> Contoh <?xml version="1.0" encoding="utf8"?> <resources> <string name="hello"> Hello!</string> </resources> <?xml version="1.0" encoding="utf8"?> <resources> <string-array name="planets_array"> <item>Mercury</item> <item>Venus</item> <item>Earth</item> <item>Mars</item> </string-array> </resources>

Hendra, MT. & Hartono, M.Kom.

22

Pemrograman Piranti Bergerak

Akses String dengan XML


String resource yang telah kita siapkan pada resources, dapat digunakan pada saat pembuatan layout dengan format penulisan @string/name. Contoh:
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" />

Akses String dengan Java


String 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 Java


Sedangkan 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 Eclipse


ADT 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.

Latihan
1. 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, LinearLayout
Layout 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:
<?xml version="1.0" encoding="utf-8"?> <ViewGroup xmlns:android= "http://schemas.android.com/apk/res/android" android:id="@[+][package:]id/resource_name" android:layout_height=["dimension" | "fill_parent" | "wrap_content"] android:layout_width=["dimension" | "fill_parent" | "wrap_content"] [ViewGroup-specific attributes] > <View android:id="@[+][package:]id/resource_name" android:layout_height=["dimension" | "fill_parent" | "wrap_content"] android:layout_width=["dimension" | "fill_parent" | "wrap_content"] [View-specific attributes] > <requestFocus/> </View> <ViewGroup > <View /> </ViewGroup> <include layout="@layout/layout_resource"/> </ViewGroup>

Untuk membantu anda memahami syntax penulisan tersebut diatas, maka akan dijelaskan fungsi dari masing-masing elemen sebagai berikut: <ViewGroup> 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

<View>

Hendra, MT. & Hartono, M.Kom.

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

Atribut pada ViewGroup dan View


Pada 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 <requestFocus>

Contoh:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, I am a TextView" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, I am a Button" /> </LinearLayout>
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 Eclipse


ADT 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.

Latihan
1. 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 Layout


Pada 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 Layout
FrameLayout 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 Layout
Sebagaimana 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 ke
match_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 Layout
Sebagaimana dengan namanya, layout ini menempatkan object view childnya relatif satu terhadap lainnya dengan menggunakan ID (@+id/id).
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/a ndroid" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="10px"> <TextView android:id="@+id/label" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Type here:" /> <EditText android:id="@+id/entry" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/label" /> <Button android:id="@+id/ok" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/entry" android:layout_marginLeft="10px" android:layout_alignParentRight="true" android:text="OK" /> <Button android:text="Cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/ok" android:layout_toLeftOf="@+id/ok"> </Button> </RelativeLayout>

Hendra, MT. & Hartono, M.Kom.

30

Pemrograman Piranti Bergerak

Table Layout
Sesuai dengan namanya, layout ini menempatkan object view pada sel didalam suatu tabel.
<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:stretchColumns="1"> <TableRow> <TextView android:layout_column="1" android:text="Open..." android:padding="3dip" /> <TextView android:text="Ctrl-O" android:gravity="right" android:padding="3dip" /> </TableRow> <View android:layout_height="2dip" android:background="#FF909090" />

Hendra, MT. & Hartono, M.Kom.

31

Pemrograman Piranti Bergerak


<TableRow> <TextView android:text="X" android:padding="3dip" /> <TextView android:text="Import..." android:padding="3dip" /> </TableRow> <TableRow> <TextView android:text="X" android:padding="3dip" /> <TextView android:text="Export..." android:padding="3dip" /> <TextView android:text="Ctrl-E" android:gravity="right" android:padding="3dip" /> </TableRow> <View android:layout_height="2dip" android:background="#FF909090" /> <TableRow> <TextView android:layout_column="1" android:text="Quit" android:padding="3dip" /> </TableRow> </TableLayout>

Latihan
Buatlah 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 Activity


Pada 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 Layout
Untuk 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 class


Selanjutnya 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 Bergerak


public 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.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hendra.testdb" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Persegi" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>

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 activity


Untuk 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(); }

Latihan
1. 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 Event


Pada 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 Bergerak


Double 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 :
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hitung" android:id="@+id/buttonHitung" android:onClick="hitungOnClick"></Button> 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 Listener
Suatu 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 Bergerak


apakah 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:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:id="@+id/relativeLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android= "http://schemas.android.com/apk/res/android"> <ImageView android:id="@+id/gambarKu" android:layout_width="wrap_content" android:src="@drawable/icon" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_marginLeft="90dp" android:layout_marginTop="102dp"> </ImageView> </RelativeLayout>

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 Bergerak


public 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)

Latihan
1. 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 Activity


Secara 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 intent
Pemakaian 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 Android


Ketika 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.

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 activity
Secara 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(); } });

Latihan
1. 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 Activity


Pada 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 intent


Sebagaimana 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 intent


Data 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 intent


Selain 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 kembalian


Pada 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 Bergerak


resultCode, 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).

Latihan
1. 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 Eksternal


Pada 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-filter
Agar 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:
<activity android:name=".PersegiActivity" android:label="@string/app_name"> <intent-filter> <action android:name= "android.intent.action.MAIN" /> <category android:name= "android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name= "android.intent.action.VIEW" /> <category android:name= "android.intent.category.DEFAULT" /> <data android:scheme="foo" android:host="persegi.hendra.com" /> </intent-filter> </activity>

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.
<activity android:name=".PersegiActivity" android:permission="com.hendra.permission.PERSEGI_PERMISSION" filter> <action android:name= "android.intent.action.MAIN" /> <category android:name= "android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name= "android.intent.action.VIEW" /> <category android:name= "android.intent.category.DEFAULT" /> <data android:scheme="foo" android:host="persegi.hendra.com" /> </intent-filter> </activity>

<intent-

Implicit Intent
Pengaktifkan Activity dengan implicit intent dilakukan dengan membuat suatu intent baru disertai dengan action yang akan dilakukan, kemudian ditambahkan Uri dengan contoh sebagai berikut:
public void persegiOnClick(View v) { Intent intent = new Intent(Intent.ACTION_VIEW); Uri uri = Uri.parse("foo://persegi.hendra.com/hitung"); intent.setData(uri); startActivity(intent); }

Berdasarkan koding tersebut diatas dapat dijelaskan bahwa kita akan mengaktifkan Activity secara implicit dengan mengirim ACTION_VIEW dan data uri "foo://persegi.hendra.com/hitung", yang cocok dengan intent-filter yang telah kita buat pada aplikasi sebelumnya. Jika Activity yang ingin kita aktifkan membutuhkan permission, maka pada AndroidManifest diaplikasi perlu ditambahkan:
<uses-permission android:name= "com.hendra.permission.PERSEGI_PERMISSION"> </uses-permission>

Catatan: Hendra, MT. & Hartono, M.Kom. 50

Pemrograman Piranti Bergerak Suatu uri memiliki format schema://host:port/path sehingga uri foo://persegi.hendra.com/hitung adalah terdiri dari komponen schema=foo, host=persegi.hendra.com dan path=hitung. Kita tidak menentukan category dari intent karena android memperlakukan semua intent yang dilewatkan dengan startActivity adalah memiliki kategori CATEGORY_DEFAULT.

Mengirim data melalui uri


Pada bagian sebelumnya kita telah membahas bagaimana mengirim data melalui fasilitas Bundle yang terdapat pada Intent, sebenarnya kita dapat juga melwatkan data dengan menambahkan parameter pada Uri dengan contoh pemakaian sebagai berikut:
public void persegiOnClick(View v) { Uri uri = Uri.parse("foo://persegi.hendra.com/hitung? panjang=10&lebar=20"); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(uri); startActivity(intent); }

Berdasarkan koding tersebut diatas dapat dijelaskan akan dilewatkan melalui Uri data melalui parameter panjang dan lebar masing-masing bernilai 10 dan 20.

Mengambil data dari Uri


Data yang dilewatkan dengan menggunakan getQueryParameter pada target Activity dengan contoh sebagai berikut:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Uri uri = getIntent().getData(); if (uri != null) { String panjang = uri.getQueryParameter("panjang"); String lebar = uri.getQueryParameter("lebar"); EditText editPanjang = (EditText) findViewById(R.id.editPanjang); EditText editLebar = (EditText) findViewById(R.id.editLebar); editPanjang.setText(panjang);

Hendra, MT. & Hartono, M.Kom.

51

Pemrograman Piranti Bergerak


editLebar.setText(lebar); } }

Pada koding tersebut diatas dapat dijelaskan bahwa Activity ketika diaktifkan akan mengambil uri dengan panggilan getIntent().getData() yang mengembalikan uri atau nilai null, jika uri tidak null maka akan diekstraksi nilai parameter panjang dan lebar dengan panggilan getQueryParameter.

Latihan
1. Buatlah masing-masing aplikasi yang terdiri dari Activity dengan kemampuan sebagai berikut: a) Mengkonversi suhu celcius yang dimasukan pemakai ke suhu fahrenheit. b) Mengkonversi suhu celcius yang dimasukan pemakai ke suhu reamur. c) Mengkonversi suhu celcius yang dimasukan pemakai ke suhu kelvin. 2. Buatlah masing aplikasi yang menampilkan menu pilihan Fahrenheit, Reamur, Kelvin, dan Selesai untuk menjalankan Activity yang bersesuaian secara explicit. 3. Bagaimana jika inisialisasi awal nilai suhu dilewatkan dengan parameter pada uri.

Hendra, MT. & Hartono, M.Kom.

52

Pemrograman Piranti Bergerak

Bagian 11, Mendayagunakan Activity pada Aplikasi Android


Pada bagian sebelumnya kita telah membahas bagaimana mengaktifkan Activity secara Explicit dan Implicit, pengaktifan activity secara Implict memiliki keunggulan yaitu dapat mengaktifkan Activity yang berada pada aplikasi lain dengan mengirim action, dan data yang bersesuaian melalui Uri. Pengaktifan Activity secara Implicit memungkinkan kita untuk mendayagunakan Activity yang sudah tersedia pada aplikasi bawaan di Android maupun aplikasi-aplikasi lainnya yang memiliki intent-filter pada saat deklarasi Activity tersebut pada AndroidManifest. Misalnya aplikasi anda perlu melakukan aktivitas panggilan terhadap nomor tertentu, menampilkan website, mengirim sms, menampilkan Google Map, maupun mengaktifkan Camera, dari pada anda membuat sendiri kemampuan tersebut diatas, tentu saja anda dapat mendayagunakan Activity yang telah tersedia pada aplikasi yang ada. Pada bagian ini kita akan membahas tentang bagaimana mendayagunakan berbagai Activity pada Aplikasi Android. Secara umum untuk mendayagunakan Activity bawaan di Android dari aplikasi kiata adalah sebagai berikut: 1. Menggunakan Permisi pada AndroidManifest.xml 2. Mengirim intent dan uri ataupun data tambahan lainnya.

Menggunakan Permisi
Untuk mengaktifkan Activity tertentu anda perlu menggunakan permisi dengan mendeklarasikan elemen <uses-permission> yang bersesuaian sebagaimana disyaratkan oleh Activity yang akan kita aktifkan, misalnya anda ingin mengaktifkan panggilan telepon, ataupun menampilkan website maka pada AndroidManifest.xml aplikasi anda anda harus menggunakan permission CALL_PHONE dan INTERNET dengan contoh sebagai berikut.
<uses-permission android:name= "android.permission.CALL_PHONE"> </uses-permission>

Melakukan Call
Sebagaimana pengaktifan Activity eksternal dengan menggunakan Implicit intent, kita perlu membuat suatu intent baru, dengan menambahkan data tambahan berupa uri dari nomor telepon yang akan dipanggil, dan diakhir startActivity dengan contoh sebagai berikut: Hendra, MT. & Hartono, M.Kom. 53

Pemrograman Piranti Bergerak


Intent intent= new Intent(Intent.ACTION_CALL, Uri.parse("tel:+81533113285")); startActivity(intent);

Anda perlu menggunakan CALL_PHONE permission pada AndroidManifest.XML


<uses-permission android:name= "android.permission.CALL_PHONE"> </uses-permission>

Info DEBUG

Contoh error yang timbul jika permission yang dibutuhkan tidak mencukupi
ERROR/AndroidRuntime(3248): java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel: +81533113285 cmp=com.android.phone/.OutgoingCallBroadcaster } from ProcessRecord{44f25f28 3248:com.hendra.pangillan/10082} (pid=3248, uid=10082) requires android.permission.CALL_PHONE

Menampilkan Website
Untuk mengirim email anda perlu menggunakan ACTION_VIEW, dan diikuti dengan informasi tambahan pada data Uri:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com")); startActivity(intent);

Anda perlu menggunakan INTERNET permission pada AndroidManifest.xml


<uses-permission android:name= "android.permission.INTERNET"> </uses-permission>

Hendra, MT. & Hartono, M.Kom.

54

Pemrograman Piranti Bergerak

Mengirim email
Untuk mengirim email anda perlu menggunakan ACTION_SEND, dan diikuti dengan informasi tambahan pada Intent melalui Bundle dengan contoh sebagai berikut:
Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("plain/text"); intent.putExtra(Intent.EXTRA_EMAIL,new String[]{"hendra.soewarno@gmail.com"}); intent.putExtra(Intent.EXTRA_SUBJECT,"Hello World"); intent.putExtra(Intent.EXTRA_TEXT,"Selamat Pagi"); startActivity(Intent.createChooser(intent, "Send mail..."));

Anda perlu menggunakan INTERNET permission pada AndroidManifest.xml


<uses-permission android:name= "android.permission.INTERNET"> </uses-permission>

Mengirim SMS
Untuk mengirim SMS anda perlu menggunakan ACTION_VIEW, dan diikuti dengan informasi tambahan pada Intent melalui data Uri dan Bundle dengan contoh sebagai berikut:
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri8.parse("sms:+81533113285")); intent.putExtra("sms_body","hello world"); startActivity(intent);

Anda perlu menggunakan SEND_SMS permission pada AndroidManifest,XML


<uses-permission android:name= "android.permission.SEND_SMS"> </uses-permission>

Mengaktifkan Google Map Kota Medan


Untuk menampilkan Google Map Kota Medan anda perlu menggunakan ACTION_VIEW, dan diikuti dengan informasi tambahan pada Intent melalui data Uri dengan contoh sebagai berikut:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:0,0?q=medan")); StartActivity(intent);
8

Uniform Resource Identifier

Hendra, MT. & Hartono, M.Kom.

55

Pemrograman Piranti Bergerak

Mengaktifkan Google Map IBBI Kampus Topaz


Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:3.59865,98.664441?z=19"));9 StartActivity(intent);

Mengaktifkan Camera dan Menerima hasil Capture

<?xml version="1.0" encoding="utf-8"?> <FrameLayout android:id="@+id/frameLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android= "http://schemas.android.com/apk/res/android"> <Button android:layout_height="wrap_content" android:layout_gravity="center|bottom" android:layout_marginBottom="98dp" android:layout_width="wrap_content" android:text="Capture" android:id="@+id/buttonCapture"> </Button> <ImageView android:src="@drawable/icon" android:layout_width="233dp" android:layout_height="233dp" android:layout_gravity="center|top" android:id="@+id/imagePhotoResultView"> </ImageView> </FrameLayout>
9

Latitude, Longitude dan Zoom

Hendra, MT. & Hartono, M.Kom.

56

Pemrograman Piranti Bergerak

private static final int CAMERA_PIC_REQUEST = 1337; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button buttonCapture = (Button) findViewById(R.id.buttonCapture); buttonCapture.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); startActivityForResult(intent, CAMERA_PIC_REQUEST); } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK && requestCode == CAMERA_PIC_REQUEST) { Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); ImageView image = (ImageView) findViewById(R.id.imagePhotoResultView); image.setImageBitmap(thumbnail); } }

Anda perlu menggunakan CAMERA permission pada AndroidManifest.xml


<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />

Latihan
1. Buatlah aplikasi android yang menampilkan EditText untuk menerima nomor telepon dari pemakai, dan Call dilakukan kalau pemakai melakukan klik pada button Call10. 2. Buatlah aplikasi yang dapat menampilkan google MAP untuk kota Medan. 3. Buatlah aplikasi yang dapat menampilkan google MAP untuk STMIK IBBI.

10

Gunakan Uri.parse("tel:"+(txtNumber.getText()).toString()))

Hendra, MT. & Hartono, M.Kom.

57

Pemrograman Piranti Bergerak

Bagian 12, Broadcast reciever


Pada bagian sebelumnya kita telah membahas salah satu dari empat komponen aplikasi android yaitu Activity, dan pada bagian ini kita akan melangkah lebih lanjut dengan membahas komponen yang kedua yaitu Broadcast receiver. Suatu Broadcast reciever adalah suatu komponen yang merespon kepada pemberitahuan Broadcast secara system-wide. Kebanyakan Broadcast berasal dari sistim, seperti pemberitahuan bahwa layar telah dimatikan, baterai hampir habis, suatu gambar telah dicapture, kejadian terkait dengan sms dan panggilan. Broadcast juga dapat berasal dari aplikasi seperti memberitahukan aplikasi lain bahwa data telah didownload ke peralatan dan tersedia untuk digunakan. Jika Activity memiliki UI, maka Broadcast receiver tidak menampilkan suatu UI, tetapi mereka dapat membuat notifikasi pada status bar untuk memberitahukan bahwa suatu kejadian Broadcast telah terjadi. Pada umumnya suatu Broadcast receiver hanya berupa suatu gerbang kepada komponen lain dan hanya melakukan suatu pekerjaan kecil, jika operasi yang dijalankan lebih panjang, maka anda perlu mengkombinasikan service dengan BroadcastReceiver untuk menjaga proses tersebut aktif sepanjang waktu operasi.

Membuat Broadcast reciever


Sebagaimana dengan Activity, Broadcast receiver juga diaktifkan oleh asynchronus message yaitu Intent. Untuk membuat Broadcast receiver anda perlu membuat suatu class yang merupakan subclass dari BroadcastReceiver. Berikut ini adalah contoh Broadcast receiver yang akan merespon terhadap panggilan telepon maupun pengiriman SMS :
public class PhoneReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent data) { String action = data.getAction(); if (action.equalsIgnoreCase( "android.intent.action.PHONE_STATE")) { if (data.getStringExtra( TelephonyManager.EXTRA_STATE).equals( TelephonyManager.EXTRA_STATE_RINGING)) { tampilToast( context, data.getStringExtra( TelephonyManager.EXTRA_INCOMING_NUMBER)); } } else { Bundle bundle = data.getExtras();

Hendra, MT. & Hartono, M.Kom.

58

Pemrograman Piranti Bergerak


Object[] pdus = (Object[]) bundle.get("pdus"); SmsMessage message = SmsMessage. createFromPdu((byte[]) pdus[0]); if (!message.isEmail()) { tampilToast(context, message.getOriginatingAddress()); buatVibrate(context); } } // this.abortBroadcast(); } private void tampilToast(Context context, String pesan) { int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, pesan, duration); toast.show(); } private void buatVibrate(Context context) { Vibrator vib = (Vibrator) context .getSystemService(Context.VIBRATOR_SERVICE); vib.vibrate(2000); } }

Berdasarkan koding tersebut diatas, maka dapat dijelaskan bahwa kita membuat sebuah Broadcast receiver dengan nama PhoneReceiver yang merupakan subclass dari BroadcastReceiver, kemudian kita akan memeriksa action dari intent yang mengaktifkan receiver, jika berupa "android.intent.action.PHONE_STATE", maka akan ditampilkan nomor yang memanggil, dan sebaliknya akan ditampilkan nomor pengirim SMS. Pengaktifkan dari receiver ini berkaitan dengan Intent-filter Catatan: Jika anda meninginkan receiver anda tidak melanjutkan Broadcaster ke receiver-receiver berikutnya yang memiliki priority yang lebih rendah, maka anda dapat menggunakan this.abortBroadcast();

Intent-filter
Untuk menentukan pemberitahuan Broadcast apa saja yang akan direspon oleh Broadcast receiver yang kita buat, maka kita perlu membuat Intent-filter pada saat deklarasi receiver pada AndroidManifest.xml, karena sebenarnya message asynchronus yang diBroadcast berupa objek Intent.

Hendra, MT. & Hartono, M.Kom.

59

Pemrograman Piranti Bergerak


<receiver android:name=".PhoneReceiver"> <intent-filter android:priority="100"> <action android:name= "android.intent.action.PHONE_STATE"> </action> <action android:name= "android.provider.Telephony.SMS_RECEIVED"> </action> </intent-filter> </receiver>

Berdasarkan koding tersebut diatas dapat dijelaskan bahwa receiver PhoneReceiver akan merespon action "android.intent.action.PHONE_STATE" dan "android.provider.Telephony.SMS_RECEIVED" dengan nilai prioritas 100, semakin tinggi nilai prioritas berarti semakin tinggi pula prioritas receiver terhadap respon yang bersesuaian. Kemudian karena receiver kita akan mengakses beberapa fitur pada perangkat, maka kita perlu menggunakan permisi sebagai berikut:
<uses-permission android:name= "android.permission.READ_PHONE_STATE"></uses-permission> <uses-permission android:name="android.permission.VIBRATE"></uses-permission> <uses-permission android:name="android.permission.RECEIVE_SMS"></usespermission>

Mengirim Broadcast
Anda juga diberi kesempatan untuk membuat custom action yang kemudian dapat diBroadcast secara pemrograman dengan contoh sebagai berikut:
Intent i = new Intent(); i.setAction("hendra.custom.intent.action.HITUNG"); ContextWrapper context = (ContextWrapper) getApplicationContext (); context.sendBroadcast(i);

Latihan
1. Buatlah suatu Broadcast receiver yang dapat menampilkan nomor pemanggil ataupun nomor pengirim SMS. Catatan: Untuk melakukan pengujian terhadap receiver yang anda buat pada soal nomor satu anda dapat memanfaatkan fasilitas Emulator Control yang terdapat pada DDMS

Hendra, MT. & Hartono, M.Kom.

60

Pemrograman Piranti Bergerak

Atau anda dapat juga mengaktifan Emulator kedua yang berada pada folder tools yang terdapat pada folder android-sdk, kemudian menjalankan perintah emulator @namadevice, selanjutnya anda dapat melakukan panggilan ataupun sms dengan menggunakan nomor port emulator.

Hendra, MT. & Hartono, M.Kom.

61

Pemrograman Piranti Bergerak

Bagian 13, Database pada Android


Database adalah hal yang penting didalam pemrograman yang terkait dengan pengelolaan data. Android juga mendukung pemakaian database pada aplikasi, dan anda dapat menggunakan database default yang tersedia yaitu database SQLite.

Type Data SQLite


SQLite3 mendukung tipe database sebagai berikut: 1. TEXT (UTF-8 atau UTF-16 string) 2. INTEGER (signed integers) 3. REAL (floating point values) 4. BLOB (data chunk) untuk jelasnya dapat dibaca di http://www.sqlite.org/datatype3.html Pembuatan autoincrement field dapat dilakukan dengan menggunakan keyword integer primary key autoincrement.

Pembuatan Database
Pembuatan database pada Android dapat dilakukan secara langsung secara koding dengan membuat suatu class bantuan yang merupakan subclass dari SQLiteOpenHelper. Pada subclass anda perlu mengimplementasikan metode callback seperti onCreate(SQLiteDatabase) yang secara otomatis akan dipanggil untuk pembuatan database, onUpgrade(SQLiteDatabase, int, int) yang akan secara otomatis akan dipanggil pada saat upgrade database diperlukan, dan secara optional onOpen(SQLiteDatabase). Anda harus menempatkan koding untuk pembuatan dan upgrade database pada masing-masing callback yang bersesuaian. Contoh:
public class MyOpenHelper extends SQLiteOpenHelper { static final String DB_NAME = "MyDb"; static final Integer DB_VERSION = 1; public MyOpenHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE Siswa (" + "nim TEXT PRIMARY KEY," +

Hendra, MT. & Hartono, M.Kom.

62

Pemrograman Piranti Bergerak


"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); } }

Koding diatas dapat dijelaskan bahwa kita membuat suatu class MyOpenHelper yang merupakan subclass dari SQLiteOpenHelper. Pada class tersebut dibuat dua konstanta yaitu DB_NAME dan DB_VERSION. Kemudian pada class tersebut juga dibuat suatu konstruktor (memiliki nama yang sama dengan class sebagaimana yang disyaratkan pada Java, pada konstruktor ini kita perlu memanggil konstruktor pada parent class (dalam hal ini adalah SQLiteOpenHelper) dengan mengirim parameter yang bersesuaian. Secara default kita perlu melakukan Override terhadap metoda callback onCreate yang mana secara otomatis akan dipanggil jika database perlu di Create, onUpgrade yang mana secara otomatis dipanggil jika database perlu di Upgrade. Untuk menggunakan class MyOpenHelper dapat dilakukan pada Activity yang membutuhkan akses ke database dengan melakukan instantialisasi terhadap class MyOpenHelper, dan kemudian dilanjutkan dengan membuka database secara readonly (getReadableDatabase) atau secara read/write (getWriteableDatabase) contoh:
public class DatabaseActivity extends Activity { private SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.addsiswa); MyOpenHelper myOpenHelper = new MyOpenHelper( this.getApplicationContext()); db = myOpenHelper.getWritableDatabase(); } }

Koding tersebut diatas dapat kita jelaskan bahwa awalnya akan melakukan instantialiasi terhadap class MyOpenHelper, kemudian membuka database untuk read/write (getWriteableDatabase). Catatan: Pada saat instantialisasi, database tidak otomatis dibuat, tetapi database akan dibuat pada Hendra, MT. & Hartono, M.Kom. 63

Pemrograman Piranti Bergerak saat proses buka database dilakukan.= Setelah aplikasi tersebut diatas dijalankan, maka otomatis akan terbentuk database MyDb pada folder /data/data/com.hendra.testdb/database

dimana com.hendra.testdb merupakan nama package pada saat pembuatan project android. Untuk melihat database file tersebut dapat menggunakan fasilitas DDMS pada open prespektif di Eclipse.

Perangkat SQLite3
Untuk melakukan eksplorasi terhadap database MyDb kita dapat menggunakan fasilitas adb shell yang disediakan pada android-sdk, adalah proses untuk mengaktifkan perangkat SQLite3 adalah sebagai berikut: 1. Aktifkan ke command prompt 2. Ubah direktori ke c:\progra~1\android\android-sdk

Hendra, MT. & Hartono, M.Kom.

64

Pemrograman Piranti Bergerak 3. Ubah direktori ke platform-tools 4. Jalankan perintah adb shell, dan secara otomatis akan ditampilkan # prompt 5. Pada shell ubah directory ke /data/data/com.hendra.testdb/databases 6. Jalankan perintah sqlite MyDb untuk mengaktifkan perangkat SQLite3 sekaligus membuka database MyDb, dan secara otomatis akan ditampilkan sqlite> 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 Data


Pada 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 database
Untuk 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 database
Untuk menutup database dapat digunakan pemanggilan terhadap metode close. Contoh:
@Override protected void onDestroy() { super.onDestroy(); db.close(); }

Menyisip data
Untuk 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 Bergerak


Parameters 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 data
Untuk 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 Bergerak


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

Menghapus data
Untuk 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 baris


Integer hasil = db.delete("Siswa",null, null);

Membaca data
Untuk 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 Bergerak


selectionArgs 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 Siswa
Cursor 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 Siswa
Cursor 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 Provider


Pada 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.

URI
Setiap 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://<authority>/<data_path>/<id>, 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 sebagai


Phones.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 Provider


Untuk 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 Bergerak


projection, null, null, null);

dan dalam hal ini myContact merupakan uri


"content://com.android.contacts/data/phones/1",

yang mengacu kepada _ID =

1.

Pemakaian Permisi
Sebelum suatu aplikasi dapat melakukan akses query ke contact record, maka harus diregistrasi pemakaian permisi melalui file AndroidManifest.xml sebagai berikut:
<uses-permission android:name="android.permission.READ_CONTACTS" />

Menampilkan Contact dalam ListView


listcontact.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/android:list" android:layout_height="wrap_content" android:layout_width="match_parent"> </ListView> </LinearLayout>

listcontact_dtl.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="

http://schemas.android.com/apk/res/android"

android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" android:id="@+id/linearLayout1"> <TextView android:text="TextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textViewNama"> </TextView>

Hendra, MT. & Hartono, M.Kom.

75

Pemrograman Piranti Bergerak


<TextView android:text="TextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textStyle="bold" android:textSize="14px" android:id="@+id/textViewNomor"> </TextView> </LinearLayout>

ListContact.java
public 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<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>(); 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<String, String> item = new HashMap<String, String>(); 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<String, String> item = (HashMap<String, String>)

Hendra, MT. & Hartono, M.Kom.

76

Pemrograman Piranti Bergerak


l.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 Provider


Pada 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 Database
Sebagai 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 Bergerak


super(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 Provider


Setelah 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 metoda
public 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 Bergerak


case 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 = ContentUris.withAppendedId(Siswa.Siswas.CONTENT_URI, rowID); getContext().getContentResolver().notifyChange(_uri, null); return _uri; } throw new SQLException("Failed to insert row into " + uri); } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder(); sqlBuilder.setTables(TABLE_NAME); if (uriMatcher.match(uri) == SISWA_ID) sqlBuilder.appendWhere(Siswa.Siswas._ID + " = " + uri.getPathSegments().get(1)); Cursor c = sqlBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder); c.setNotificationUri(getContext().getContentResolver(), uri); return c; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count = 0; System.out.println(selection); switch (uriMatcher.match(uri)) { case SISWA: count = db.update(TABLE_NAME, values, selection, selectionArgs); break; case SISWA_ID: count = db.update(TABLE_NAME, values, Siswa.Siswas._ID + " = "

Hendra, MT. & Hartono, M.Kom.

81

Pemrograman Piranti Bergerak


+ uri.getPathSegments().get(1) + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int count = 0; switch (uriMatcher.match(uri)) { case SISWA: count = db.delete(TABLE_NAME, selection, selectionArgs); break; case SISWA_ID: String id = uri.getPathSegments().get(1); count = db.delete(TABLE_NAME, Siswa.Siswas._ID + " = " + id + (!TextUtils.isEmpty(selection) ? " AND (" + uri + ')' : ""), selectionArgs); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } getContext().getContentResolver().notifyChange(uri, null); return count; } }

Membuat Helper Class


Untuk memudahkan user untuk mengakses kepada ContentProvider yang telah kita buat, adalah lebih membuat suatu Helper Class untuk sebagai konstanta mengacu kepada URI dan masing-masing field.
public class Siswa { public Siswa() { } public static final class Siswas implements BaseColumns { private Siswas() { } public static final Uri CONTENT_URI = Uri.parse("content://" + SiswaProvider.AUTHORITY + "/siswas");

Hendra, MT. & Hartono, M.Kom.

82

Pemrograman Piranti Bergerak


public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.hendra.siswas"; public public public public } } static static static static final final final final String String String String _ID = "_id"; NIM = "nim"; NAMA = "nama"; NILAI = "nilai";

Mendaftar Content Provider


Sebagaimana pada Activity, dan Broadcast Receiver, suatu Content Provider juga harus didaftarkan pada AndroidManifest agar dapat efektif digunakan pada aplikasi.
<provider android:name=".SiswaProvider" android:authorities="com.hendra.buatcontentprovider.SiswaProvider"

android:exported="true" />

Agar Content Provider dapat digunakan pada aplikasi eksternal, kita perlu menambahkan atribut android:exported="true".

Mengakses Content Provider


Mengakses suatu content provider dari aplikasi yang sama dapat menggunakan konstanta CONTENT_URI dengan contoh sebagai berikut:
public class BuatContentProviderActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ContentResolver contentResolver = getContentResolver(); //menambah data Content Provider ContentValues initialValues = new ContentValues(); initialValues.put("nim","920403024"); initialValues.put("nama", "Hendra"); initialValues.put("nilai", "A"); contentResolver.insert( Siswa.Siswas.CONTENT_URI, initialValues); //mengupdate data Content Provider ContentValues updateValues = new ContentValues(); updateValues.put("nilai", "B"); contentResolver.update(Siswa.Siswas.CONTENT_URI,

Hendra, MT. & Hartono, M.Kom.

83

Pemrograman Piranti Bergerak


updateValues, Siswa.Siswas.NIM + "=?", new String[] {"920403024"}); //membaca data Content Provider String[] projection = new String[] { Siswa.Siswas._ID, Siswa.Siswas.NIM, Siswa.Siswas.NAMA, Siswa.Siswas.NILAI }; final Cursor cursor = contentResolver.query( Siswa.Siswas.CONTENT_URI, projection, null, null, null); if (cursor.getCount() > 0) { cursor.moveToFirst(); System.out.println(cursor.getString(cursor .getColumnIndex(Siswa.Siswas._ID))); System.out.println(cursor.getString(cursor .getColumnIndex(Siswa.Siswas.NAMA))); System.out.println(cursor.getString(cursor .getColumnIndex(Siswa.Siswas.NIM))); } //menghapus data Content Provider dengan URI Uri myContact = ContentUris.withAppendedId( Siswa.Siswas.CONTENT_URI, 1); contentResolver.delete(myContact, null, null);

} }

Akses dari Aplikasi External


Sedangkan untuk mengakses Content Provider yang kita buat dari aplikasi eksternal, maka penulisan Uri adalah menggunakan Uri.Parse(string), contoh:
public class AksesSiswaProviderActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ContentResolver contentResolver = getContentResolver(); // membaca data Content Provider String[] projection = new String[] { "_id", "nim", "nama", "nilai" }; final Cursor cursor = contentResolver .query(Uri .parse("content://com.hendra.buatcontentprovider.SiswaProvider/siswas"), projection, null, null, null); if (cursor.getCount() > 0) { cursor.moveToFirst();

Hendra, MT. & Hartono, M.Kom.

84

Pemrograman Piranti Bergerak


System.out.println(cursor.getString(1)); System.out.println(cursor.getString(2)); System.out.println(cursor.getString(3)); } } }

Tugas
1. Buatlah sebuah Content Provider yang dapat menyimpan data siswa. 2. Lakukan akses terhadap Content Provider tersebut dari aplikasi internal. 3. Bagaimana kalau akses dilakukan dari aplikasi eksternal?

Hendra, MT. & Hartono, M.Kom.

85

Pemrograman Piranti Bergerak

Bagian 17, Service


Kita telah membahas tiga dari empat komponen aplikasi Android yaitu Activity, Receiver dan Content Provider, pada bagian ini kita akan melangkah lebih lanjut pada pembuatan Service. Service merupakan aplikasi yang berjalan dilatarbelakang pada aktifitas yang sedang aktif, service tersebut dapat berjalan seterusnya untuk suatu unbound service walaupun activity yang mengaktifkannya telah berhenti, dan dapat berjalan hanya sepanjang umur dari activity mengaktifkannya untuk suatu bounded service. Pada bagian ini kita akan fokus pada unbound service.

Siklus hidup service


Suatu service memiliki siklus hidup yang berbeda dibandingkan dengan activity karena memiliki metode yang berbeda, untuk memulai suatu ubound service didalam aplikasi dilakukan dengan panggilan terhadap startService(). Panggilan terhadap startService akan mengaktifkan metode onCreate() pada service dan method onStart() pada saat service mulai dijalankan. context.startService() | ->onCreate() - >onStartCommand() [service running] dan pemanggilan metode stopService() untuk menghentikan service. context.stopService() | ->onDestroy() [service stops]

Pembuatan Service
Untuk membuat service anda perlu membuat suatu class yang merupakan subclass dari Service, dan melakukan Override terhadap beberapa metoda yaitu onBind, onCreate, onStart dan onDestroy.
public class MyService extends Service { private static final String TAG = "MyService"; MediaPlayer player; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); Log.d(TAG, "onCreate");

Hendra, MT. & Hartono, M.Kom.

86

Pemrograman Piranti Bergerak


player = MediaPlayer.create(this, R.raw.wonderful_tonight_eric_clapton); player.setLooping(false); // Set looping } @Override public void onStart(Intent intent, int startid) { Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); Log.d(TAG, "onStart"); player.start(); } @Override public void onDestroy() { Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); Log.d(TAG, "onDestroy"); player.stop(); } }

Mendaftarkan Service
Sebagaimana Activity, Receiver, maupun Content Provider, Service juga harus didaftarkan kedalam AndroidManifest.xml untuk membuatnya menjadi efektif.
<service android:name=".MyService" <intent-filter android:label="com.hendra.testservice.MyService"> </intent-filter> </service>

Menjalankan Service
Untuk menjalankan service yang berada pada aplikasi yang sama kita dapat menggunakan startService dengan mengirim Intent secara explicit.
public class TestServiceActivity extends Activity { private static final String TAG = "TestServices"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void buttonStartOnClick(View v) { Log.d(TAG, "onClick: starting service"); startService(new Intent(this, MyService.class)); } public void buttonStopOnClick(View v) {

Hendra, MT. & Hartono, M.Kom.

87

Pemrograman Piranti Bergerak


Log.d(TAG, "onClick: stopping service"); stopService(new Intent(this, MyService.class)); } }

Suatu service yang dijalankan dengan perintah startService akan tetap berjalan sampai terjadi pemanggilan terhadap stopService(), atau terjadi pemanggilan perintah stopSeft() pada internal service tersebut.

Menjalankan Service Eksternal


Sedangkan untuk menjalankan service dari aplikasi yang berbeda, perlu menggunakan permisi sesuai dengan yang didefinisikan pada Service di AndroidManifest, dan menggunakan perintah startSerice dengan mengirim Intent secara implicit.
<uses-permission android:name= "com.hendra.permission.MYSERVICE_PERMISSION"> </uses-permission> public class TestExternalServiceActivity extends Activity { private static final String TAG = "TestExternalServices"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void buttonStartOnClick(View v) { Log.d(TAG, "onClick: starting service"); Intent serviceIntent = new Intent(); serviceIntent.setAction("com.hendra.testservice.MyService"); startService(serviceIntent); } public void buttonStopOnClick(View v) { Log.d(TAG, "onClick: starting service"); Intent serviceIntent = new Intent(); serviceIntent.setAction("com.hendra.testservice.MyService"); stopService(serviceIntent); }

Latihan
1. Buatlah suatu service yang dapat memainkan suatu lagu MP3

Hendra, MT. & Hartono, M.Kom.

88

Pemrograman Piranti Bergerak

Bagian 18, Lokalisasi Aplikasi


Android dapat berjalan dibanyak peralatan dan digunakan di berbagai region, untuk mencapai kebanyakan user, aplikasi anda perlu dirancang untuk menangani tulisan, file audio, angka, mata uang dan grafik dengan cara yang sesuai dengan lokasi pemakai aplikasi anda.

Membuat Lokalisasi
Sebagaimana yang telah kita bahas bahwa Android menyimpan berbagai sumber daya tulisan pada directory /res, dan Android secara default dapat memilih dan memuat sumber daya dari direktori yang berbeda berdasarkan konfigurasi dari locale pada peralatan. Sebagai contoh, misalnya anda ingin membuat sebuah aplikasi yang mendukung beberapa bahasa berdasarkan setting locale dari pemakai, maka pada saat anda membuat aplikasi tersebut anda perlu membuat resource default dan resource untuk untuk masingmasing bahasa menurut locale, sehingga ketika aplikasi dijalankan, sistim akan memilih resource menurut locale yang bersesuaian, jika tidak tersedia, maka akan menggunakan resource standard. Agar masing-masing resource tidak bercampur satu dengan yang lain, maka resource untuk masing-masing setting locale harus disimpan pada folder yang memiliki sufiks yang berbeda. File resource /res/values-enrUS/strings.xml Keterangan Isi file Resource untuk language English Region US
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Halo dunia, PersegiActivity!</string> <string name="app_name">Persegi</string> <string name="length">panjang</string> <string name="width">lebar</string> <string name="calculate">hitung</string> <string name="result">hasil</string> </resources> <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello world, PersegiActivity!</string> <string name="app_name">Rectangle</string> <string name="length">length</string> <string name="width">width</string> <string name="calculate">calculate</string> <string name="result">result</string>

/res/values-en/strings.xml

Resource untuk language English

Hendra, MT. & Hartono, M.Kom.

89

Pemrograman Piranti Bergerak


</resources>

/res/values/strings.xml

Default resource

<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello world, PersegiActivity!</string> <string name="app_name">Rectangle</string> <string name="length">length</string> <string name="width">width</string> <string name="calculate">calculate</string> <string name="result">result</string> </resources>

Pada tabel diatas terlihat bahwa masing-masing string resource memiliki nama yang sama dengan nilai yang berbeda menurut target bahasa dan regional, dan masing-masing file xml disimpan pada folder yang memiliki sufiks sesuai dengan target bahasa dan regional. Jika pada kode maupun properties layout dimuat suatu string R.string.length, maka Android akan mencari nilai yang bersesuaian untuk string tersebut pada saat runtime berdasarkan setting language dan regional pada perangkat. Contoh:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res /android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/length"></TextView> <EditText android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/editPanjang"> <requestFocus></requestFocus> </EditText> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/width"></TextView> <EditText android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/editLebar"></EditText>

Hendra, MT. & Hartono, M.Kom.

90

Pemrograman Piranti Bergerak


<Button android:id="@+id/buttonHitung" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/calculate" android:onClick="hitungOnClick"></Button> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/result"></TextView> </LinearLayout>

Misalkan locale pada perangkat adalah 'en-US', maka android akan mencari nilai R.string.length berdasarkan aturan pencarian sebagai berikut: 1. res/values-en-rUS/strings.xml 2. res/values-en/strings.xml 3. res/values/strings.xml Jika pencarian akan berhenti sesuai dengan hasil pencarian yang ditemukan pertama kalinya berdasarkan urutan diatas. Lokalisasi juga dapat dilakukan pada resource lainnya dengan menggunakan aturan penamaan yang sama pada sufiks folder yang mengikuti standard kode ISO. Contoh: Flag image Italian French French (Canada) English (Canada) Russian US English Default (Indonesia) Target folder drawable-it-rIT/flag.png drawable-fr-rFR/flag.png drawable-fr-rCA/flag.png drawable-en-rCA/flag.png drawable-ru-rRU/flag.png drawable-en-rUS/flag.png drawable/flag.png

Kesimpulan
Agar aplikasi yang anda buat dapat mendukung banyak bahasa berdasarkan setting language dan regional, berikut ini adalah hal yang perlu anda perhatikan: 1. Jangan melakukan hard-code pada string ataupun konstanta string; sebagai gantinya gunakan definisi string tersebut pada resource string.xml dan genakan Hendra, MT. & Hartono, M.Kom. 91

Pemrograman Piranti Bergerak referensi R.string. 2. Hal yang sama juga berlaku untuk image atau layout; gunakan R.drawable dan R.layout 3. Terjemahkan masing-masign nilai pada file string.xml dan tempatkan string.xml hasil terjemahan ke folder yang sesuai.

Hendra, MT. & Hartono, M.Kom.

92

Pemrograman Piranti Bergerak

Daftar Pustaka
1. Android Developer, http://developer.android.com

Hendra, MT. & Hartono, M.Kom.

93

Pemrograman Piranti Bergerak

Lampiran :
Pada awalnya perlu dipersiapkan suatu class MyOpenHelper yang merupakan subclass dari SQLiteOpenHelper. Pada class ini didefinisikan struktur dari tabel Siswa.

Database OpenHelper
/src/com.hendra.testdb/MyOpenHelper.java
package com.hendra.testdb; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class MyOpenHelper extends SQLiteOpenHelper { static final String DB_NAME = "MyDb"; static final Integer DB_VERSION = 1; public MyOpenHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE Siswa (nim TEXT PRIMARY KEY," + "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); } }

Hendra, MT. & Hartono, M.Kom.

94

Pemrograman Piranti Bergerak

AddSiswa
Buatlah layout yang dapat menampilan tampilan berikut ini yang terdiri dari TextView (Nim, Nama, Nilai), EditText (editNim, editNama, editNilai), dan button (Simpan), set button Simpan untuk mengaktifkan simpanOnClick(View v).
/res/layout/addsiswa.xml

/src/com.hendra.testdb/AddSiswa.java package com.hendra.testdb; import android.app.Activity; import android.content.ContentValues; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class AddSiswa extends Activity { private SQLiteDatabase db; @Override

Hendra, MT. & Hartono, M.Kom.

95

Pemrograman Piranti Bergerak


protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.addsiswa); MyOpenHelper myOpenHelper = new MyOpenHelper( this.getApplicationContext()); db = myOpenHelper.getWritableDatabase(); } @Override protected void onDestroy() { super.onDestroy(); db.close(); } public void simpanOnClick(View v) { ContentValues initialValues = new ContentValues(); EditText editNim = (EditText) findViewById(R.id.editNim); EditText editNama = (EditText) findViewById(R.id.editNama); EditText editNilai = (EditText) findViewById(R.id.editNilai); initialValues.put("nim", editNim.getText().toString()); initialValues.put("nama", editNama.getText().toString()); initialValues.put("nilai", editNilai.getText().toString()); if (db.insert("Siswa", null, initialValues) != -1) { tampilToast("Berhasil simpan " + editNim.getText().toString()); editNim.setText(""); editNama.setText(""); editNilai.setText(""); editNim.requestFocus(); } else tampilToast("Gagal simpan " + editNim.getText().toString()); } private void tampilToast(String pesan) { int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(getApplicationContext(), pesan, duration); toast.show(); } }

Hendra, MT. & Hartono, M.Kom.

96

Pemrograman Piranti Bergerak

EditSiswa
/res/layout/editsiswa.xml

/src/com.hendra.testdb/EditSiswa.xml package com.hendra.testdb; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class EditSiswa extends Activity { private SQLiteDatabase db; String editingNim; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.editsiswa); MyOpenHelper myOpenHelper = new MyOpenHelper(

Hendra, MT. & Hartono, M.Kom.

97

Pemrograman Piranti Bergerak


this.getApplicationContext()); db = myOpenHelper.getWritableDatabase(); } @Override protected void onDestroy() { super.onDestroy(); db.close(); } public void ambilOnClick(View v) { EditText editNim = (EditText) findViewById(R.id.editNim); editingNim = editNim.getText().toString(); Cursor cursor = db.query(false, "Siswa", new String[] { "nama", "nilai" }, "nim=?", new String[] { editingNim }, null, null, null, null); if (cursor.getCount() > 0) { cursor.moveToFirst(); EditText editNama = (EditText) findViewById(R.id.editNama); EditText editNilai = (EditText) findViewById(R.id.editNilai); editNama.setText(cursor.getString(0)); editNilai.setText(cursor.getString(1)); } else { tampilToast(editNim.getText().toString() + " tidak ditemukan !"); } } public void simpanOnClick(View v) { EditText editNim = (EditText) findViewById(R.id.editNim); EditText editNama = (EditText) findViewById(R.id.editNama); EditText editNilai = (EditText) findViewById(R.id.editNilai); ContentValues contentValues = new ContentValues(); contentValues.put("nama", editNama.getText().toString()); contentValues.put("nilai", editNilai.getText().toString()); Integer hasil = db.update("Siswa", contentValues, "nim=?", new String[] { editingNim }); if (hasil > 0) { editNim.setText(""); editNama.setText(""); editNilai.setText(""); editNim.requestFocus(); tampilToast(editingNim + " berhasil diperbaharui !"); } else { tampilToast(editingNim + " gagal diperbaharui !");

Hendra, MT. & Hartono, M.Kom.

98

Pemrograman Piranti Bergerak


} } private void tampilToast(String pesan) { int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(getApplicationContext(), pesan, duration); toast.show(); } }

Hendra, MT. & Hartono, M.Kom.

99

Pemrograman Piranti Bergerak

DeleteSiswa
/res/layout/deletesiswa.xml

/src/com.hendra.testdb/EditSiswa.java package com.hendra.testdb; import android.app.Activity; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class DeleteSiswa extends Activity { private MyOpenHelper myOpenHelper; private SQLiteDatabase db; private String editingNim; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.deletesiswa); myOpenHelper = new MyOpenHelper(this.getApplicationContext()); db = myOpenHelper.getWritableDatabase();

Hendra, MT. & Hartono, M.Kom.

100

Pemrograman Piranti Bergerak


} @Override protected void onDestroy() { super.onDestroy(); db.close(); } public void ambilOnClick(View v) { EditText editNim = (EditText) findViewById(R.id.editNim); editingNim = editNim.getText().toString(); Cursor cursor = db.query(false, "Siswa", new String[] { "nama", "nilai" }, "nim=?", new String[] { editingNim }, null, null, null, null); if (cursor.getCount() > 0) { cursor.moveToFirst(); TextView textNim = (TextView) findViewById(R.id.textNim); TextView textNama = (TextView) findViewById(R.id.textNama); TextView textNilai = (TextView) findViewById(R.id.textNilai); textNim.setText(editingNim); textNama.setText(cursor.getString(0)); textNilai.setText(cursor.getString(1)); } else { tampilToast(editingNim + " tidak ditemukan !"); } } public void hapusOnClick(View v) { Integer hasil = db.delete("Siswa", "nim=?", new String[] {editingNim}); if (hasil > 0) { tampilToast(editingNim + " berhasil dihapus !"); } else { tampilToast(editingNim + " gagal dihapus !"); } } private void tampilToast(String pesan) { int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(getApplicationContext(), pesan, duration); toast.show(); } }

Hendra, MT. & Hartono, M.Kom.

101

Pemrograman Piranti Bergerak

ListSiswa2Baris
/res/layout/list_siswa_two_line_row.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:textSize="16px" android:textStyle="bold" android:layout_height="wrap_content" android:text="Text1" android:layout_width="match_parent" android:id="@+id/baris1"/> <TextView android:textSize="12px" android:textStyle="italic" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="Text2" android:id="@+id/baris2"/> </LinearLayout>

Hendra, MT. & Hartono, M.Kom.

102

Pemrograman Piranti Bergerak


/res/layout/listsiswa.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/android:list" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> /src/com.hendra.testdb/ListSiswa2Baris.java package com.hendra.testdb; import java.util.ArrayList; import java.util.HashMap; import com.hendra.testdb.MyOpenHelper; import com.hendra.testdb.R; import android.app.ListActivity; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast;

Hendra, MT. & Hartono, M.Kom.

103

Pemrograman Piranti Bergerak


public class ListSiswa2Baris extends ListActivity { private MyOpenHelper myOpenHelper; private SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listsiswa); myOpenHelper = new MyOpenHelper(this.getApplicationContext()); db = myOpenHelper.getWritableDatabase(); } @Override protected void onDestroy() { super.onDestroy(); db.close(); } @Override protected void onStart() { super.onStart(); ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>(); Cursor cursor = db.query(false, "Siswa", new String[] { "nim", "nama", "nilai" }, null, null, null, null, null, null); while (cursor.moveToNext()) { HashMap<String,String> item = new HashMap<String,String>(); item.put( "nim",cursor.getString(0)); item.put( "nama",cursor.getString(1)); list.add( item ); } SimpleAdapter notes = new SimpleAdapter( this, list, R.layout.listsiswa_two_line_row, new String[] { "nim","nama" }, new int[] { R.id.baris1, R.id.baris2 }); setListAdapter( notes ); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); @SuppressWarnings("unchecked")
HashMap<String, String> hashMap = (HashMap<String, String>) this.getListAdapter().getItem(position);

Hendra, MT. & Hartono, M.Kom.

104

Pemrograman Piranti Bergerak


String selectedNim = hashMap.get("nim"); tampilToast("Anda memilih: " + selectedNim); } private void tampilToast(String pesan) { int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(getApplicationContext(), pesan, duration); toast.show(); } }

Hendra, MT. & Hartono, M.Kom.

105

Pemrograman Piranti Bergerak


ListSiswa3Kolom /res/layout/listsiswa_tiga_kolom

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/linearLayout1" android:weightSum="1" android:paddingBottom="3px" android:paddingTop="3px"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" android:layout_weight="0.21" android:id="@+id/kolom1"></TextView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" android:layout_weight="0.72" android:id="@+id/kolom2"></TextView> <TextView android:text="TextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/kolom3"></TextView> </LinearLayout> /src/com.hendra.testdb/ListSiswa3Kolom.java package com.hendra.testdb; import java.util.ArrayList; import java.util.HashMap; import android.app.ListActivity; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase;

Hendra, MT. & Hartono, M.Kom.

106

Pemrograman Piranti Bergerak


import android.os.Bundle; import android.view.View; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; public class ListSiswa3Kolom extends ListActivity { private MyOpenHelper myOpenHelper; private SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listsiswa); myOpenHelper = new MyOpenHelper(this.getApplicationContext()); db = myOpenHelper.getWritableDatabase(); } @Override protected void onDestroy() { super.onDestroy(); db.close(); } @Override protected void onStart() { super.onResume();
ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();

Cursor cursor = db.query(false, "Siswa", new String[] { "nim", "nama", "nilai" }, null, null, null, null, null, null); while (cursor.moveToNext()) { HashMap<String,String> item = new HashMap<String,String>(); item.put( "nim",cursor.getString(0)); item.put( "nama",cursor.getString(1)); item.put( "nilai",cursor.getString(2)); list.add( item ); } SimpleAdapter notes = new SimpleAdapter( this, list, R.layout.listsiswa_tiga_kolom, new String[] { "nim","nama","nilai" }, new int[] { R.id.kolom1, R.id.kolom2, R.id.kolom3 }); setListAdapter( notes );

Hendra, MT. & Hartono, M.Kom.

107

Pemrograman Piranti Bergerak


} @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); @SuppressWarnings("unchecked")
HashMap<String, String> hashMap = (HashMap<String, String>) this.getListAdapter().getItem(position);

String selectedNim = hashMap.get("nim"); tampilToast("Anda memilih: " + selectedNim); } private void tampilToast(String pesan) { int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(getApplicationContext(), pesan, duration); toast.show(); } }

Hendra, MT. & Hartono, M.Kom.

108

Pemrograman Piranti Bergerak


Menu /res/layout/main.xml

/src/com.hendra.testdb/Menu.java package com.hendra.testdb; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class Menu extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void tambahOnClick(View v) { Intent addSiswa = new Intent(this.getApplicationContext(), AddSiswa.class); startActivity(addSiswa); } public void perbaikiOnClick(View v) { Intent intent = new Intent(this.getApplicationContext(), EditSiswa.class);

Hendra, MT. & Hartono, M.Kom.

109

Pemrograman Piranti Bergerak


startActivity(intent); } public void hapusOnClick(View v) { Intent intent = new Intent(this.getApplicationContext(), DeleteSiswa.class); startActivity(intent); } public void tampilOnClick(View v) { Intent intent = new Intent(this.getApplicationContext(), ListSiswa2Baris.class); startActivity(intent); } public void tampilDetailOnClick(View v) { Intent intent = new Intent(this.getApplicationContext(), ListSiswa3Kolom.class); startActivity(intent); } public void keluarOnClick(View v) { finish(); } }

Hendra, MT. & Hartono, M.Kom.

110

Anda mungkin juga menyukai