82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

113
PEMROGRAMAN PIRANTI BERGERAK BERBASIS ANDROID DIKTAT KULIAH Oleh: Hendra, MT. Hartono, M.Kom. PROGRAM STUDI TEKNIK INFORMASI STMIK IBBI MEDAN 2011

Transcript of 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Page 1: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

PEMROGRAMAN PIRANTI BERGERAKBERBASIS ANDROID

DIKTAT KULIAH

Oleh:

Hendra, MT.

Hartono, M.Kom.

PROGRAM STUDI TEKNIK INFORMASISTMIK IBBI

MEDAN2011

Page 2: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 3: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 4: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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 AndroidPlatform Android merupakan produk dari Open Handset Alliance yang merupakan suatu kelompok organisasi yang berkolaborasi untuk membangun mobile phone yang lebih baik. Kelompok ini dipimpin oleh Google, operator mobile, pabrikan, pabrikan komponen, dan software provider, serta perusahaan marketing.

Perangkat Android pertama dipasaran adalah G1 yang dipabrikasi oleh HTC.

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

Hendra, MT. & Hartono, M.Kom. 1

Page 5: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

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

Gambar 1. Arsitektur lapisan perangkat lunak Android

Arsitektur AplikasiAndroid berjalan diatas kernel Linux, dan aplikasi Android ditulis dengan bahasa pemrograman Java, dan dijalankan didalam DVM yang merupakan teknologi open source4, masing-masing aplikasi Android dijalankan didalam suatu instant dari DVM, 2 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.

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

4 Android is an open-source software stack for mobile devices, and a corresponding open-source project led by Google. We created Android in response to our own experiences launching mobile apps. We wanted to make sure that there was no central point of failure, so that no industry player can restrict or control the innovations of any other. That's why we created Android, and made its source code open

Hendra, MT. & Hartono, M.Kom. 2

Page 6: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

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

Gambar 2. Arsitektur eksekusi aplikasi Android

Aplikasi AndroidSuatu aplikasi Android dapat berupa salah satu dari empat komponen yang klasifikasi berikut ini :

1. Activities, merupakan suatu aplikasi yang berfokus pada aktifitas pemakai dan memiliki user interface (UI), suatu activity diaktifkan ketika pemakai mengaktifkan sebuah aplikasi dari home screen atau launcher aplikasi.

2. Services, suatu service berjalan dilatarbelakang dan digunakan untuk kegiatan yang membutuhkan existensi untuk jangka waktu yang lama dan tidak memiliki UI, seperti suatu monitoring jaringan, atau aplikasi pemeriksaan update.

3. Content providers, suatu penyimpan dan penyedia yang bersifiat tetap dan dapat tersedia antar aplikasi, jika aplikasi anda sangat sederhana, anda tidak perlu membuat content provider, jika anda membuat aplikasi yang lebih besar, atau membuat sesuatu data tersedia untuk banyak aktivitas ataupun aplikasi, tentu suatu content provider dibutuhkan.

4. Broadcast dan Intent receivers, suatu aplikasi Android yang menerima message sistem dan melakukan tanggapan respon, seperti menerima suatu pesan teks.

Kecuali Content providers, komponen lainnya diaktifkan melalui asynchronus message yang dikenal dengan intent, dan intent dapat memiliki bundle yang mendukung informasi terkait dengan komponen, dan digunakan untuk pertukaran data antar komponen.

Apa itu Android SDK?Android SDK menyediakan tools dan APIs yang dibutuhkan untuk mengembangkan aplikasi pada platform Android dengan menggunakan bahasa pemrograman Java.

Hendra, MT. & Hartono, M.Kom. 3

Page 7: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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 AndroidUntuk dapat melakukan pengembangan aplikasi yang berbasis Android membutuhkan beberapa pengetahuan dasar tentang :

1. Pemrograman Java dan OOP

2. Pengelolaan dokumen XML

3. Memahami dan mengerti IDE Eclipse

Latihan

Instalasi Komputer untuk Pemrograman Android1. Instalasi JDK

Download dan install JDK dari http://java.sun.com/javase/downloads/index.jsp

Hendra, MT. & Hartono, M.Kom. 4

Page 8: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

2. Instalasi EclipseDownload dan unzip Eclipse dari http://www.eclipse.org/downloads/

direkomendasikan "Eclipse Classic"

Lakukan unzip, misalnyua C:\Eclipse

3. Instalasi SDK Starter PackageDownload dan instalasi SDK Starter Package dari http://developer.android.com/sdk/index.html

Catatan: Jika pada saat instalasi, gagal dengan pesan Java SE JDK tidak ditemukan, maka lakukan klik pada Back dan klik pada Next kembali.

Setelah instalasi, maka aktifkan SDK manager untuk mendownload SDK Platform Tools, anda membutuhkan koneksi internet dalam hal ini.

Hendra, MT. & Hartono, M.Kom. 5

Page 9: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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\android-sdk (akan digunakan pada langkah 5, dan diketik sebagai C:\PROGRA~1\Android\android-sdk )

Hendra, MT. & Hartono, M.Kom. 6

Page 10: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

4. Installing the ADT Plugin untuk Eclipse

Aktifkan Eclipse, kemudian pada menu Help, pilih Install New Software …

Klik pada Add, pada sisi kanan atas

Pada dialog Add Site, ketikan http://dl-ssl.google.com/android/eclipse/

Alternatif: anda dapat mendownload manual pada alamat http://dl.google.com/android/ADT-12.0.0.zip

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

Hendra, MT. & Hartono, M.Kom. 7

Page 11: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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 NextPada jendela berikutnya, anda akan melihat daftar dari tools yang telah didownload, dan klik NextBaca dan terima “license agreements”, dan klik Finish

Catatan : Jika anda mendapatkan security warning yang mengatakan bahwa authenticity atau validity dari software tidak dapat dilakukan, klik OK

Ketika instalasi selesai, restart Eclipse

5. Konfigurasi ADT Plugin

Setelah anda berhasil mendownload ADT sebagaimana yang diterangkan diatas, maka langkah berikutnya adalah melakukan modifikasi terhadap “ADT preferences pada Eclipse untuk menunjuk pada Android SDK directory.

Pada Eclipse, menu Window, pilih Preferences, Pilih Android dari panel sebelah kiri Pada SDK Location pada panel utama, klik Browse... dan tempatkan SDK directory, klik Apply dan Ok.

Hendra, MT. & Hartono, M.Kom. 8

Page 12: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

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

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

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

Pembuatan Project Android dengan EclipseSecara ringkas pembuatan project Android dengan Eclipse dilakukan dengan langkah-langkah sebagai berikut:

1. Pada menu File, pilih New, dan pilih Android Project atau jika tidak ada pilihan Android Project, maka dipilih Project, kemudian akan tampil jendela

2.

Setelah pementuan workspace, maka akan tampil IDE dari Eclipse, dan untuk membuat project Android anda yang pertama, pada menu File, pilih New, pilih Android Project

Hendra, MT. & Hartono, M.Kom. 9

Page 13: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

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

Isikan detail dari Project meliputi:1. Project name : HelloAndroid2. Build Target: Android 2.23. Application name: Hello, Android4. Package name: com.hendra.helloandroid5. Create Activity: HelloAndroidActivity6. 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

Page 14: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 15: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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\android-sdk\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-sdkdimana 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

Page 16: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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-toolsadb shell#ls#rm com.hendra.helloworld.apk#exit

atau

adb uninstall com.hendra.helloworld

Shortcut untuk Emulator AndroidTabel 1, Tombol kendali emulator Android

Tombol Fungsi emulatorEscape Tombol backHome Tombol homeF2, PageUp Tombol menuShift-F2, PageDown Tombol startF3 Tombol call/dialF4 Tombol hangup/endcallF5 Tombol searchF7 Tombol powerCtrl-F11 Rotasi layar

Hendra, MT. & Hartono, M.Kom. 13

Page 17: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Pengembangan dengan perangkat AndroidJika anda memiliki perangkat Android, maka anda dapat menjalankan aplikasi pada perangkat Android dari IDE Eclipse dengan menghubungkan perangkat anda ke PC dengan data cable, kemudian menginstalasi USB Driver yang sesuai dengan perangkat anda.

Setting pada perangkat anda:

1. Mengaktifkan fitur untuk memperbolehkan instalasi aplikasi dari sumber yang tidak dikenal, dengan klik pada Setting, pilih Applications, kemudian aktifkan Unknown sources.

2. Mengaktifkan “USB Debugging” pada perangkat, dengan klik pada Setting, pilih Applications, kemudian pilih Development, dan aktifkan USB debugging.

Setelah perangkat anda terkoneksi ke PC dan setting tersebut diatas, maka anda dapat memeriksa apakah perangkat anda telah dikenal oleh ADT, dengan menjalankan perintah berikut dari DOS prompt.

cd \progra~1\android\android-sdk\platform-toolsadb device

Secara otomatis akan ditampilkan nama perangkat anda, dan ketika anda menjalankan aplikasi dari Eclipse, otomatis aplikasi terinstall dan di run.

Mempublikasi aplikasi andaAgar aplikasi anda dapat diterima pada Android Market, maka aplikasi tersebut perlu ditandatangani secara digital dengan menggunakan kunci private yang digenerate dan disimpan pada lokasi yang aman. Sebelum aplikasi tersebut ditandatangani maka aplikasi tersebut perlu dipaket dalam modus pelepasan dengan klik kanan pada project yang akan dilepas pada project explorer, kemudian pilih Export Signed Application Package..., dan lakukan langkah sebagai berikut:

1. Isikan nama project yang akan diekspor pada isian Project, kemudian klik Next

2. Pilih Use existing keystore jika anda telah memiliki kunci private, dan pilih Create new keystore jika belum. Isikan lokasi penyimpanan keystore, isikan password dan confirm password sekali lagi, dan klik next.

3. Isikan

Alias: KunciKu

Password: hendra

Confirm: hendra

Hendra, MT. & Hartono, M.Kom. 14

Page 18: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Validity years: 25

First and Lastname: Hendra Soewarno

Organizational unit: STMIK

Organization: IBBI

City or Locality: Medan

State or Province:Sumut

Country Code XX: ID

Kemudian klik next,

4. Isikan lokasi dimana APK akan disimpan (APK modus pelepasan dan sudah ditandatangani secara digital)

Ketika suatu aplikasi diupgrade, kunci (file keystore) yang sama diperlukan untuk menandatanganinya untuk memastikan update yang transparant kepada pemakai. File keystore harus disimpan secara aman untuk mencegah kemungkinan pemanfaatan file keystore anda oleh pihak yang tidak berhak dan beresiko terhadap reputasi anda.

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

Hendra, MT. & Hartono, M.Kom. 15

Page 19: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

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

Gambar 1, Tampilan Project Explorer pada Eclipse

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

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

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

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

Hendra, MT. & Hartono, M.Kom. 16

Page 20: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

LayoutResource Layout merupakan rancangan antarmuka Activity pada program Android yang ditulis dalam format XML. Pada proyek HelloWorld, forder /res/layout terdapat file main.xml yang berisi rancangan antarmuka.<?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

Page 21: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Source code (/src)Merupakan folder yang berisi source code java class untuk masing-masing activity, service, content provider dan broadcast receiver pada aplikasi Android, dalam hal ini adalah file HelloWorldActivity.java.package com.hendra.helloworld;import android.app.Activity;import android.os.Bundle;

public class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }}

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

AndroidManifest.XMLMerupakan file XML yang berisi informasi mengenai aplikasi Android.<?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

Page 22: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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.

Latihan1. Buatlah aplikasi Android yang menampilkan pesan Hello World !2. Lakukan explorasi terhadap struktur project aplikasi tersebut dengan mempelajari

masing-masing folder pada proyek.3. Tuliskan kembali dalam kata-kata anda sendiri struktur suatu program android

terkait dengan folder /src, /gen, /res/drawable, /res/layout, /res/values.4. Tuliskan kembali dalam kata-kata anda fungsi dari AndroidManifest.XML

Hendra, MT. & Hartono, M.Kom. 19

Page 23: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

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

Gambar 1, Dua peralatan berbeda mengunakan sumber daya default

Gambar 2, Dua peralatan berbeda mengunakan sumber daya berbeda

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

Hendra, MT. & Hartono, M.Kom. 20

Page 24: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Mengakses Resources dari XMLUntuk mengakses resources dapat dilakukan melalui file XML maupun melalui koding, adapun syntax untuk mengacu pada suatu resources pada file XML adalah : @[<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 KodingUntuk mengakses resources dari file XML kita menggunakan konstruksi seperti @string/hello, tetapi untuk mengakses resources dari dalam kode Java kita menggunakan integer dari R.java.Contoh pemakaian:

public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);TextView textHello = (TextView) findViewById(R.id.helloText);textHello.setText(getString(R.string.helloHendra));

}

Hendra, MT. & Hartono, M.Kom. 21

Page 25: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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 Reference from XML Reference from Java

res/layout/main.xml @layout/main R.layout.main

res/drawable-hdpi/file.png @drawable/file R.drawable.file

<string name="helloHendra"> @string/helloHendra R.string.helloHendra

@+id//helloText @id/helloText R.id.helloText

String ResourceSebuah resource string menyediakan teks string untuk aplikasi anda, ada tiga jenis dari resources yang dapat tersedia bagi aplikasi anda yaitu String (XML resource yang menyediakan string tunggal), String Array (XML resource yang menyediakan array dari string)lokasi file:

res/values/filename.xml

Syntax:

Syntax Contoh<?xml version="1.0" encoding="utf-8"?><resources> <string name="string_name"> text_string</string></resources>

<?xml version="1.0" encoding="utf-8"?><resources> <string name="hello"> Hello!</string></resources>

<?xml version="1.0" encoding="utf-8"?><resources> <string-array name="array_name"> <item> text_string</item> </string-array></resources>

<?xml version="1.0" encoding="utf-8"?><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

Page 26: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

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

Contoh:<TextView

android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello" />

Akses String dengan JavaString resource yang telah kita siapkan pada resources, dapat digunakan pada saat progra, java dengan format R.string.name.

Contoh:String string = getString(R.string.hello);

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

Akses Array String dengan JavaSedangkan untuk mengakses string-array dapat menggunakan perintah getStringArray yang merupakan metoda dari suatu objek resource.

Contoh:Resources res = getResources();String[] planets = res.getStringArray(R.array.planets_array);

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

Latihan1. Buatlah String resource sebagai berikut dan simpan pada file pesan.xml:

String name Text string

Hendra, MT. & Hartono, M.Kom. 23

Page 27: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

selamat_belajar Selamat belajar

program_android Pemrograman android

mata_kuliah Di Mata kuliah pemrograman piranti bergerak

2. Tampilkan masing-masing String resource pada TextView.

TextView String name

pesan1 selamat_belajar

pesan2 program_android

pesan3 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

Page 28: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Bagian 5, LinearLayoutLayout merupakan salah satu resource yang digunakan yang mendefinisikan antarmuka suatu activity yang digambarkan di layar. Memahami layout merupakan hal yang penting untuk merancang suatu aplikasi Android yang baik. Secara khususnya layout resource ditempatkan pada folder /res/layout/filename.xml.

Referensi terhadap suatu layout resource secara Java adalah R.layout.filename dan secara XML adalah @[package:]layout/filename.

Adapun syntax penulisan untuk sebuah layout resource adalah sebagai berikut ini:

<?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).

<View> Suatu komponen UI tunggal yang umunya disebut dengan suatu “widget”, suatu object View dapat terdiri dari TextView, Button,

Hendra, MT. & Hartono, M.Kom. 25

Page 29: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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 ViewPada masing-masing ViewGroup maupunView dapat memiliki atribut yang nantinya digunakan untuk mengacu terhadap elemen tersebut dari aplikasi, maupun digunakan untuk menentukan dimensi dari masing-masing elemen.

android:id Merupakan ID resource yang bersifat unik yang digunakan untuk mengacu terhadap elemen tersebut dari aplikasi anda.

android:layout_height Merupakan dimensi yang menentukan ukuran tinggi dari elemen, dapat berupa fill_parent atau wrap_content.

android:layout_width Merupakan dimensi yang menentukan ukuran lebar dari elemen, dapat berupa fill_parent atau wrap_content.

<requestFocus> Salah satu objek view dapat mengikutsertakan elemen ini untuk sebagai fokus awal pada layar.

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

Page 30: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Merancang layout dengan EclipseADT plug-in pada Eclipse menyediakan suatu designer untuk merancang dan menampilkan layout resource. Tool ini terdiri dari dua tab yaitu Graphical view dan XML view. Graphical view berfungsi untuk merancang dan menampilkan layout secara visual, sedangan XML view digunakan untuk merancang layout dengan pengetikan text XML, anda dapat beralih dari Graphical view ke XML view dan sebaliknya.

Membuat layout resource dengan menggunakan Graphical View:

1. Pada jendela Palette, pilih Layouts, dan drag Linear Layout ke canvas, dan klik pada set vertical orientation (susunan kebawah secara vertikal)

2. Double klik pada linearLayout1 pada jendela Outline dan akan dimuncul jendela properties, dan set Layout Width ke Match Parent, lakukan hal sama terhadap Layout Height

3. Pada jendela Palette, pilih Form Widget, dan drag TextView ke layout, kemudian set Layout Width dan Layout Height ke Match Parent, kemudian set properti text ke "Hello, I am a TextView" dengan klik kanan pada TextView dan pilih properties dan pilih text.

4. Tambahkan juga Widget Button ke Layout, dan lakukan setting yang sesuai.

5. Klik pada XML view untuk melihat hasilnya.

Catatan :

Untuk membantu pemformatan text XML, tekan Ctrl+A, dan kemudian tekan Ctrl+Shift+F.

Latihan1. Buatlah layout resource yang dapat menghasilkan

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

Petunjuk :

Hendra, MT. & Hartono, M.Kom. 27

Page 31: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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 masing-masing 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 masing-masing view, dan fokus pertama pada EditText panjang.

Hendra, MT. & Hartono, M.Kom. 28

Page 32: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Bagian 6, Pengaturan LayoutPada bagian sebelumnya kita telah membahas pembuatan layout resource, dan pada bagian ini kita akan membahas beberapa jenis layout yang sering digunakan, dan contoh pemanfaatannya.

• FrameLayout – adalah objek layout yang paling sederhana, dirancang untuk menampilkan suatu tumpukan dari control View, anda tidak dapat menentukan lokasi dari child view, sebagai konsekuensinya child view akan ditampilkan menimpa view sebelumnya.

• LinearLayout – mengatur semua kontrol child view pada satu baris ataupun kolom tunggal (horizontal/vertical orientation), layout ini sangat sesuai untuk pembuatan form.

• RelativeLayout – mengatur tampilan dari kontrol child View secara relatif satu terhadap lainnya (dengan acuan ID), anda dapat meratakan dua elemen berdasarkan border kanan, atau membuat satunya berada dibawah lainnya, berada ditengah layar, dll.

• TableLayout – mengatur semua kontrol child View kedalam sejumlah baris dan kolom (berbentuk tabel). Pada layout tabel tidak menampilkan garis border untuk masing-masing baris, kolom atau sel. Masing-masing kolom dan baris memiliki jumlah sel yang sama, anda dapat mengosongkan sel tertentu, dan sel dapat melakukan span kolom seperti yang dapat dilakukan pada HTML.

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

Hendra, MT. & Hartono, M.Kom. 29

Page 33: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

android:foreground.

Linear LayoutSebagaimana yang telah dijelaskan sebelumnya bahwa pada linear layout, objek-objek view akan disusun secara vertikal ke bawah ataupun secara horizontal ke samping. Pengaturan ukuran dari masing-masing object child view dapat dilakukan dengan mengatur properti android:layout_width dan android:layout_height 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 LayoutSebagaimana 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/android"

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

Page 34: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Table LayoutSesuai 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

Page 35: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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>

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

Hendra, MT. & Hartono, M.Kom. 32

Page 36: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Bagian 7, Pembuatan ActivityPada bagian sebelumnya kita telah membahas tentang pembuatan layout yang merupakan UI untuk Activity, pada bagian ini kita akan melangkah lebih lanjut dengan pembuatan Activity.

Suatu Activity mewakili satu layar tunggal sebagai UI, sebagai contoh, suatu aplikasi email dapat saja memiliki beberapa activity, yaitu activity untuk menampilkan suatu daftar dari email baru, activity untuk membuat email, dan activity lainnya untuk membaca email. Walaupun activity-activity tersebut bekerja sama untuk membentuk suatu user experience pada aplikasi email, tetapi masing-masing activity sebenarnya berdiri sendiri dan tidak tergantung dengan activity lainnya.

Secara umum langkah sederhana untuk membuat suatu Activity adalah sebagai berikut:

1. Membuat Layout yang akan menjadi UI dari Activit

2. Membuat Activity Class yang merupakan subclass dari android.app.Activity

3. Mendaftarkan Activity ke AndroidManifest

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

Contoh persegi.xml:

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

package com.hendra.helloworld;

import android.app.Activity;import android.os.Bundle;

Hendra, MT. & Hartono, M.Kom. 33

Page 37: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

public class Persegi extends Activity {@Overridepublic 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

Page 38: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Siklus hidup activityUntuk lebih memahami cara bekerjanya suatu Activity, maka kita harus memahami siklus hidup dari suatu Activity. Activity-activity dalam sistim diatur pada suatu activity stack. Ketika suatu activity dijalankan, dia akan ditempatkan pada posisi teratas di stack dan menjadi activity yang sedang berjalan – dan activity sebelumnya berada dibawahnya di dalam stack, dan dia tidak akan kembali ke foreground sampai dengan Activity diatasnya berakhir.

Suatu activity memiliki empat state penting yaitu:

1. Jika suatu activity berada di foreground dari layar (pada bagian teratas dari stack), dia adalah aktif dan sedang running.

2. Jika suatu activity kehilangan fokus tetapi masih visible (dimana, merupakan activity yang tidak berukuran penuh atau ada activity transparant mendapat fokus diatas activity anda), maka dia sedang dalam kondisi pause. Suatu pause activity masih hidup (dia tetap menangani semua state dan informasi serta tetap berada pada window manager), tetapi dapat diakhiri oleh sistim jika berada dalam situasi sangat kekurangan memori.

3. Jika suatu activity benar-benar tidak kelihatan oleh aplikasi lainnya, dia adalah berada pada kondisi stop. Dia tetap mempertahankan semua state dan informasi, tetapi tidak lagi visible bagi pemakai sehingga jendelanya tersembunyi dan akan diakhir oleh sistim ketika memori diperlukan oleh aplikasi yang lain.

4. Jika suatu activity dalam kondisi pause atau stop, sistim dapat membuang activity tersebut dari memori baik dengan meminta dia untuk selesai, atau dengan membuangnya dari memori, ketika dia ditampilkan kembali ke user, dia harus benar-benar mulai dari awal dan mengembalikan dirinya ke state sebelumnya.

Diagram berikut menunjukan alur penting dari suatu activity.

Hendra, MT. & Hartono, M.Kom. 35

Page 39: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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.

Hendra, MT. & Hartono, M.Kom. 36

Page 40: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Suatu activity dapat berulang kali melalui resume dan pause state – sebagai contoh ketika device dalam kondisi sleep, ketika suatu hasil activity disampaikan, ketika suatu intent baru disampaikan – sehingga kode yang berada pada metode ini harus cukup ringan.

Anda dapat melakukan hook terhadap callback dari masing-masing tahapan siklus hidup dengan melakukan Override pada pada metode yang bersesuaian. Semua activity perlu mengimplementasikan onCreate(Bundle) untuk melakukan persiapan awal; dan banyak yang melakukan implementasi terhadap onPause() untuk memastikan penulisan perubahan data. Anda perlu selalu melakukan pemanggilan terhadap superclass ketika melakukan implementasi terhadap metode ini.

public class Activity extends ApplicationContext {protected void onCreate(Bundle savedInstanceState);protected void onStart();protected void onRestart();protected void onResume();protected void onPause();protected void onStop();protected void onDestroy();

}

Latihan1. Buatlah sebuah activity yang dapat menampilkan tahapan siklus hidup dari

Activity tersebut pada saat dijalankan dengan melakukan Override terhadap metode callback onCreate, onStart, onRestart, onResume, onPause, onStop, onDestroy.

@Override public void onStart() { super.onStart(); tampilToast("onStart"); } private void tampilToast(String pesan) {

int duration = Toast.LENGTH_SHORT;Toast toast = Toast.makeText(getApplicationContext(),

pesan, duration);toast.show();

}

Hendra, MT. & Hartono, M.Kom. 37

Page 41: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

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

Contoh:

package com.hendra.persegi;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;import 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

Page 42: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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 {@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.persegi);

}

public void hitungOnClick(View target) {TextView panjang = (TextView) findViewById(R.id.panjang);TextView lebar = (TextView) findViewById(R.id.lebar);TextView hasil = (TextView) findViewById(R.id.hasil);Double nPanjang = Double.

parseDouble(panjang.getText().toString());Double nLebar = Double.

parseDouble(lebar.getText().toString());Double nHasil = nPanjang * nLebar;hasil.setText("Hasil : " + nHasil.toString());

}}

Event ListenerSuatu event listener adalah suatu interface didalam class view yang mengandung suatu metode callback tunggal. Metode ini akan dipanggil oleh framework Android ketika View dimana listener tersebut didaftarkan dipicu oleh interaksi pemakai melalui UI, beberapa metode callback yang terkait dengan penanganan event pemakai adalah sebagai berikut:

Callback Parameter Return

onClick (View v) v merupakan objek view yang diklik void

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

Hendra, MT. & Hartono, M.Kom. 39

Page 43: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

apakah callback dikonsumsi (false berarti event lanjutan tidak dilakukan)

onFocusChange (View v, boolean hasFocus)

v merupakan objek view yang mengalami 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)

boolean, mengembalikan true jika event dikonsumsi, dan false untuk sebaliknya.

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.

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

Page 44: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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)

Latihan1. Buatlah aplikasi Android yang berfungsi menghitung luas persegi berdasarkan

ukuran panjang dan lebar yang diberikan pemakai.

2. Buatlah aplikasi yang menampilkan sebuah icon dengan ImageView pada suatu Relative Layout, kemudian gunakan penangan event OnTouch untuk mengatur perpindahan ImageView berdasarkan lokasi yang ditunjuk oleh MotionEvent.

Hendra, MT. & Hartono, M.Kom. 41

Page 45: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Bagian 8, Mengaktifkan ActivitySecara default suatu aplikasi Andorid hanya dapat memiliki satu Activity yang memiliki action “MAIN” dengan kategori “LAUNCHER”, sehingga Activity tersebut dapat diaktifkan oleh user melalui launcher sistim aplikasi, pada perkembangan selanjutnya tidak jarang kita membuat aplikasi yang memiliki lebih dari satu Activity untuk menciptakan pengalaman pemakai. Misalnya kita ingin membuat aplikasi yang terdiri dari Activity utama yang menampilkan beberapa menu pilihan kepada pemakai, kemudian berdasarkan pilihan dari pemakai akan diaktifkan Activity yang bersesuaian.

Pada bagian sebelumnya kita telah membahas tentang penanganan event pada suatu objek view, pada bagian ini kita akan memanfaatkan fasilitas tersebut untuk mengaktifkan Activity secara pemrograman melalui intent dengan perintah startActivity().Secara umum ada dua bentuk pemakaian intent untuk mengaktifkan Activity yaitu:

1. Explicit intent, dimana kita menentukan komponen yang akan dijalankan dengan perintah setClass(Context, Class) dimana class merupakan Activity class yang akan dijalankan. Explicit intent hanya efektif untuk menjalankan Activity yang berada pada aplikasi yang sama.

2. Implicit intent, dimana kita tidak perlu menentukan komponen yang akan dijalankan, tetapi kita perlu memberikan informasi tambahan seperti Action dan Uri. Explicit intent efektif untuk menjalankan Activity yang berada pada aplikasi yang sama maupun pada aplikasi eksternal.

Pada bagian ini kita akan memfokuskan pada pembahasan tentang Explicit intent.

Explicit intentPemakaian Explicit intent dilakukan dengan menentukan class dari Activity yang akan diaktifkan oleh intent dengan contoh sebagai berikut:

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

Hendra, MT. & Hartono, M.Kom. 42

Page 46: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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() {@Overridepublic void onClick(View v) {

Intent intent = new Intent(); intent.setClass(this, Persegi.class5);

startActivity(intent);}

});}

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

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

5 Merupakan type class dari activity yang akan diluncurkan oleh intent

Hendra, MT. & Hartono, M.Kom. 43

Page 47: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Gambar 1 Activity stack yang mengatur visible Activity

Ketika Activity Persegi berakhir, maka Activity Persegi akan kembali ke foreground.

Mengakhiri activitySecara program anda dapat mengakhir suatu Activity dengan memanggil metode finish().

Contoh:

Button buttonSelesai = (Button) findViewById(R.id.buttonSelesai);

buttonSelesai.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {

finish();}

});

Latihan1. Buatlah aplikasi android yang menampilkan pilihan Persegi, Segitiga, Lingkaran,

Selesai dalam bentuk button, kemudian buatlah masing-masing activity yang dapat melakukan perhitungan yang dimaksud dan diaktifkan melalui masing-masing 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

Page 48: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

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

Menulis data pada intentSebagaimana yang telah dibahas pada bagian sebelumnya bahwa pengaktifan Activity adalah melalui Intent, dan pada objek Intent tersedia fasilitas Bundle ataupun menyimpan data yang kirim bersamaan dengan Intent tersebut. Misalnya pada contoh bagian sebelumnya pada saat mengaktifkan Activity Persegi.class kita juga ingin mengirim data awal untuk panjang adalah 100 dan lebar adalah 200 dan sebuah pesan “kirim data” secara koding sebagai berikut:

buttonPersegi.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) {

Intent intent = new Intent();intent.setClass(this, Persegi.class6);

//mengirim data melalui bundlesintent.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

Page 49: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

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

@Overrideprotected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState); setContentView(R.layout.persegi);

Intent intent = getIntent(); Bundle bundle = intent.getExtras();

//pastikan bundle tidak kosong if (bundle != null) { Integer panjang = bundle.getInt("panjang"); Integer lebar = bundle.getInt("lebar"); String pesan = bundle.getString("Pesan"); }}

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

Mengembalikan data melalui intentSelain digunakan untuk mengirim data ke target Activity, Intent juga dapat digunakan untuk mengirim data kembalian kepada kepada Activity yang mengaktifkannya, contoh:

buttonKembalian.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {

Intent intent = new Intent(); intent.putExtra("hasil", 2000); this.setResult(RESULT_OK, intent); finish();

}});

Hendra, MT. & Hartono, M.Kom. 46

Page 50: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

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

Mengambil data kembalianPada bagian sebelumnya kita telah membahas bagaimana kita memanfaatkan intent untuk mengembalikan data kepada Activity yang mengaktifkan Activity tersebut, dan pada bagian ini kita akan membahas bagaimana Acitivity tersebut menerima hasil kembalian tersebut. Untuk mengaktifkan suatu activity yang mengembalikan hasil proses kita dapat menggunakan perintah StartActivityForResult (intent, requestCode). Adapun fungsi requestCode dalam hal ini adalah suatu identifier yang nantinya akan kita gunakan untuk mengenali nilai kembalian dari Activity tersebut, selanjutnya data kembalian akan ditangkap dengan sub rutin onActivityResult(int requestCode, int resultCode, Intent data).

buttonPersegi.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(this, Persegi.class7); startActivityForResult(intent,1); }});

Berdasarkan contoh tersebut diatas dapat dijelaskan bahwa awalnya akan dibuat suatu Intent baru, kemudian ditentukan komponen yang akan diaktifkan adalah Persegi.class, dan diakhir dengan pengaktifan target Activity dengan perintah startActivityForResult(intent, 1), dimana 1 merupakan requestCode yang akan digunakan untuk mengenali hasil dari Activity ini.

Selanjutnya kita mempersiapkan suatu callback rutin onActivityResult yang otomatis akan dipanggil jika target Activity berakhir dan mengembalikan data melalui intent.

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode,7 Merupakan type class dari activity yang akan diluncurkan oleh intent

Hendra, MT. & Hartono, M.Kom. 47

Page 51: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Latihan1. Buatlah aplikasi android yang menampilkan pilihan Persegi, Segitiga, Lingkaran,

Selesai dalam bentuk button, kemudian buatlah masing-masing Activity yang dapat melakukan perhitungan yang dimaksud dan diaktifkan melalui masing-masing 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

Page 52: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

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

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

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

Page 53: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Implicit IntentPengaktifkan 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

Page 54: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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 uriPada 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 UriData yang dilewatkan dengan menggunakan getQueryParameter pada target Activity dengan contoh sebagai berikut:

@Overridepublic 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

Page 55: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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.

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

Page 56: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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 PermisiUntuk 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 CallSebagaimana 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

Page 57: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 58: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Mengirim emailUntuk 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[]{"[email protected]"});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 SMSUntuk 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 MedanUntuk 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

Page 59: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Mengaktifkan Google Map IBBI Kampus TopazIntent 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

Page 60: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

private static final int CAMERA_PIC_REQUEST = 1337; @Overridepublic 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);}

});}

@Overridepublic 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" />

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

Page 61: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Bagian 12, Broadcast recieverPada 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 recieverSebagaimana 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 extendsBroadcastReceiver {

@Overridepublic 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

Page 62: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 63: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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"></uses-permission>

Mengirim BroadcastAnda 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);

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

Page 64: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 65: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Bagian 13, Database pada AndroidDatabase 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 SQLiteSQLite3 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 DatabasePembuatan 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

Page 66: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

"nama TEXT, nilai char(1))");}

@Overridepublic 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

Page 67: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 68: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 69: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

CREATE TABLE Siswa (nim PRIMARY KEY,nama TEXT, nilai char(1));

CREATE TABLE android_metadata (locale TEXT);

sqlite> .tables

.tables

Siswa android_metadata

sqlite> .quit

.quit

#

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

Page 70: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 71: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

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

Membuka databaseUntuk membuka suatu objek database secara readonly dapat menggunakan metode getReadableDatabase(), dan secara read/write dapat menggunakan metode getWriteableDatabase(), karena pemakaian getWriteableDatabase(). Suatu SQLiteException akan dilempar jika database gagal dibuka.

Contoh:

@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.editsiswa); MyOpenHelper myOpenHelper =

new MyOpenHelper(this); db = myOpenHelper.getWritableDatabase();}

Menutup databaseUntuk menutup database dapat digunakan pemanggilan terhadap metode close.

Contoh:

@Overrideprotected void onDestroy() {

super.onDestroy();db.close();

}

Menyisip dataUntuk melakukan insert data dapat menggunakan metoda insert yang terdapat pada objek SQLiteDatabase, dengan syntax sebagai berikut:

public long insert (String table, String nullColumnHack, ContentValues values)

Hendra, MT. & Hartono, M.Kom. 68

Page 72: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Parameters

table Nama tabel dimana baris akan ditambahkan

nullColumnHack

optional; dapat bernilai null. Digunakan jika anda bermaksud menyisip suatu baris kosong, karena SQL tidak memperbolehkan penyisipan suatu baris yang kosong tanpa 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

• Mengembalikan row ID dari baris yang baru disisipkan, atau -1 jika terjadi kesalahan

Contoh:ContentValues initialValues = new ContentValues();initialValues.put("nim", "920403024");initialValues.put("nama","Hendra");initialValues.put("nilai", "A");Integer hasil = db.insert("MyDb", null, initialValues);

Memperbaharui dataUntuk melakukan pembaharuan data, anda dapat menggunakan metode update sebagai berikut:

public int update (String table, ContentValues values, String whereClause, String[] whereArgs)

Parameters

table Nama tabel dimana proses update akan dilakukan

values Suatu data map dimana terdiri dari nama kolom dan nilai, null merupakan nilai yang valid dimana akan diterjemahkan menjadi NULL.

whereClause Suatu WHERE clause optional yang diaplikasikan pada update. Nilai null berarti update terhadap seluruh baris dalam tabel.

whereArgsAnda dapat mengikutsertakan ? Pada bagian whereClause, yang mana akan diganti dengan nilai yang berasal dari whereArgs.

Returns

• Jumlah baris yang terpengaruh.

Contoh:

ContentValues initialValues = new ContentValues();initialValues.put("nim", "9224");

Hendra, MT. & Hartono, M.Kom. 69

Page 73: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

initialValues.put("nilai", "B");Integer hasil = db.update("Siswa", initialValues,

"nim=?", new String[] {"920403024"});

Menghapus dataUntuk melakukan penghapusan data, anda dapat menggunakan metode delete sebagai berikut:

public int delete (String table, String whereClause, String[] whereArgs)

Parameters

Table Nama tabel dimana proses hapus dilakukan

whereClause Suatu WHERE clause optional yang diaplikasikan pada penghapusan. Nilai null artinya penghapusan dilakukan terhadap semua baris.

Returns

• 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 dataUntuk membaca data dari Tabel dapat menggunakan perintah query yang akan mengembalikan suatu objek Cursor, adapun syntax penulisan untuk query adalah sebagai berikut:

public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

Parameters

distinct true jika anda ingin menampilkan masing-masing baris secara unik, dan sebaliknya false.table Nama dari tabel yang akan dikompilasi pada query.

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

selectionSuatu filter yang mendeklarasikan baris mana yang akan dikembalikan, dengan format penulisan seperti WHERE clause pada SQL, lewatkan null akan mengembalikan semua baris pada tabel.

Hendra, MT. & Hartono, M.Kom. 70

Page 74: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

selectionArgs Anda dapat mengikutsertakan ? Pada bagian selection, yang mana akan diganti dengan nilai yang berasal dari selectionArgs.

groupBy Suatu filter yang mendeklarasikan bagaimana baris dikelompokan, sebagaimana format pada clause GROUP BY pada SQL, lewatkan null berarti tidak ada baris yang dikelompokan.

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

orderBy Bagaimana baris akan diurutkan dengan format sebagaimana pada clause ORDER BY pada SQL, lewatkan null berarti tidak ada pengaturan urutan.

limit Membatasi jumlah dari baris yang akan dikembalikan oleh query, format sebagaimana clause LIMIT pada SQL, lewatkan null berarti tidak ada LIMIT clause.

Returns

• 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 SiswaContoh 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

Page 75: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Hapus data siswa.

Hendra, MT. & Hartono, M.Kom. 72

Page 76: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

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

URISetiap Content Provider diekspos dengan menggunakan suatu public URI (yang dibungkus sebagai suatu object Uri) yang mana merupakan identitas unik, sehingga untuk dapat mengakses suatu Content Provider, maka kita perlu mengetahui URI dari Content Provider tersebut, dan semua URI memiliki format penulisan string content://<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

Page 77: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Query Content ProviderUntuk melakukan query terhadap suatu Content Provider anda membutuhkan tiga potongan informasi sebagai berikut:

• URI yang mengidentifikasikan provider tersebut

• Nama dari field data yang ingin anda terima

• Tipe data dari field-field tersebut.

Untuk melakukan query terhadap suatu content provider, anda dapat menggunakan metode Activity.managedQuery() yang akan mengembalikan suatu objek Cursor. Suatu managed Cursor menangani semua dengan baik, seperti melakukan unload dirinya ketika aktifitas di-pause, dan melakukan requery ketika aktifitas di-restart.

public class ContentproviderActivityextends Activity {@Overridepublic 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

Page 78: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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 PermisiSebelum 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 ListViewlistcontact.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

Page 79: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.listcontact);

}

@Overrideprotected 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);}

@Overrideprotected 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

Page 80: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 81: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Bagian 16, Membuat Content ProviderPada bagian sebelumnya kita telah membahas tentang Content Provider dan bagaimana mengakses Content Provider bawaan dari Android. Pada bagian ini kita akan melangkah lebih jauh untuk membahas pembuatan Content Provider. Untuk membuat content provider anda sendiri di Android segala sesuatu yang anda perlukan adalah membuat class yang merupakan subclass dari ContentProvider dan melakukan override terhadap beberapa metode yang terdefinisi didalamnya.

Metode yang perlu anda implementasi adalah:

• getType(): mengembalikan data MIME type dari URI yang diberikan.

• onCreate(): dipanggil ketika provider sedang dimulai, pada bagian ini dapat anda gunakan untuk membuka database yang menyimpan data.

• query(): menerima permintaan dari suatu klien. Hasilnya akan dikembalikan sebagai suatu objek Cursor.

• insert(): menyisip suatu record bari ke content provider.

• delete(): menghapus record yang ada dari content provider.

• update(): mengupdate suatu record yang ada dari content provider.

Metode query() harus mengembalikan suatu objek Cursor yang aman dan dapat diiterasi sepanjang data yang diminta. Cursor sendirinya adalah suatu interface dan Android, dan Android telah menyediakan suatu objek Cursor yang dapat anda gunakan, sebagai contoh SQLiteCursor dapat yang dapat diiterasi melalui data yang tersimpan pada SQLite database. Anda dapat memanggil objek tersebut dengan metode query() pada class SQLiteDatabase.

Membuat DatabaseSebagai langkah awal pembuatan Content Provider adalah mempersiapkan fasilitas penyimpan data, dalam hal ini kita akan menggunakan database SQLite yang secara default telah disediakan pada platform Android. Sebagaimana yang pernah kita bahas pada bagian sebelumnya, untuk memudahkan akses ke database kita perlu membuat suatu class bantuan yang merupakan subclass dari SQLiteOpenHelper dan melakukan override terhadap beberapa callback yang berfungsi untuk membuat dan menguprade database.

public class MyOpenHelper extends SQLiteOpenHelper { static final String DB_NAME = "MyDb"; static final Integer DB_VERSION = 1;

public MyOpenHelper(Context context) {

Hendra, MT. & Hartono, M.Kom. 78

Page 82: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

super(context, DB_NAME, null, DB_VERSION);}

@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE Siswa (_id integer primary key autoincrement, "

+"nim Text," +"nama TEXT, nilai char(1))");

}

@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

{Log.w("Upgrade", "Proses akan drop dan buat ulang tabel.");db.execSQL("DROP TABLE IF EXISTS Siswa");onCreate(db);

}}

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

Membuat class ProviderSetelah fasilitas penyimpanan data telah disediakan dan didefinisikan, maka Langkah selanjutnya adalah membuat suatu class Provider yang merupakan subclass dari ContentProvider, serta melakukan Override terhadap beberapa metode yang ada, berikut ini adalah template dari metoda yang harus dioverride dan aksi yang perlu dilakukan pada masing-masing metoda

public class SiswaProvider extends ContentProvider {@Overridepublic boolean onCreate() {

//disini anda melakukan proses pembukaan database//dan mengembalian boolean keberhasilan pembukaan database

}

@Overridepublic String getType(Uri uri) {

//disini anda melakukan pemeriksaan URI//dan mengembalian tipe dari URI

}

@Overridepublic Uri insert(Uri uri, ContentValues values) {

//disini anda mengimplementasikan penambahan data//dan mengembalikan hasil dalam bentuk URI

}

Hendra, MT. & Hartono, M.Kom. 79

Page 83: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

@Overridepublic 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

}

@Overridepublic int update(Uri uri, ContentValues values, String selection,

String[] selectionArgs) {//disini anda mengimplementasikan update data pada database//dan mengembalikan data jumlah record yang terpengaruhi

}

@Overridepublic 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);

}

@Overridepublic boolean onCreate() {

Context context = getContext();MyOpenHelper myOpenHelper = new MyOpenHelper(context);db = myOpenHelper.getWritableDatabase();return (db == null) ? false : true;

}

@Overridepublic 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

Page 84: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

case SISWA_ID:return "vnd.android.cursor.item/vnd.hendra.siswa ";

default:throw new IllegalArgumentException("Unsupported URI: " +

uri);}

}

@Overridepublic 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);

}

@Overridepublic 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;

}

@Overridepublic 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

Page 85: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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;

}

@Overridepublic 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 ClassUntuk 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

Page 86: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

public static final String CONTENT_TYPE ="vnd.android.cursor.dir/vnd.hendra.siswas";

public static final String _ID = "_id";public static final String NIM = "nim";public static final String NAMA = "nama";public static final String NILAI = "nilai";

}}

Mendaftar Content ProviderSebagaimana 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 ProviderMengakses 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 ProviderContentValues 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 ProviderContentValues updateValues = new ContentValues();updateValues.put("nilai", "B");contentResolver.update(Siswa.Siswas.CONTENT_URI,

Hendra, MT. & Hartono, M.Kom. 83

Page 87: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

updateValues,Siswa.Siswas.NIM + "=?",new String[] {"920403024"});

//membaca data Content ProviderString[] 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 URIUri myContact = ContentUris.withAppendedId(

Siswa.Siswas.CONTENT_URI, 1);contentResolver.delete(myContact, null, null);

}}

Akses dari Aplikasi ExternalSedangkan untuk mengakses Content Provider yang kita buat dari aplikasi eksternal, maka penulisan Uri adalah menggunakan Uri.Parse(“string”), contoh:

public class AksesSiswaProviderActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.main);

ContentResolver contentResolver = getContentResolver();

// membaca data Content ProviderString[] 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

Page 88: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

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

}}

}

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

Page 89: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Bagian 17, ServiceKita 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 serviceSuatu 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 ServiceUntuk 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;

@Overridepublic IBinder onBind(Intent intent) {

// TODO Auto-generated method stubreturn null;

}

@Overridepublic void onCreate() {

Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();

Log.d(TAG, "onCreate");

Hendra, MT. & Hartono, M.Kom. 86

Page 90: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

player = MediaPlayer.create(this, R.raw.wonderful_tonight_eric_clapton);

player.setLooping(false); // Set looping}

@Overridepublic void onStart(Intent intent, int startid) {

Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();

Log.d(TAG, "onStart");player.start();

}

@Overridepublic void onDestroy() {

Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();

Log.d(TAG, "onDestroy");player.stop();

}}

Mendaftarkan ServiceSebagaimana 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 ServiceUntuk 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

Page 91: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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 EksternalSedangkan 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";@Overridepublic 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);

}}

Latihan1. Buatlah suatu service yang dapat memainkan suatu lagu MP3

Hendra, MT. & Hartono, M.Kom. 88

Page 92: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Bagian 18, Lokalisasi AplikasiAndroid 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 LokalisasiSebagaimana 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 masing-masing 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 Keterangan Isi file/res/values-en-rUS/strings.xml

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>

/res/values-en/strings.xml Resource untuk language English

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

Hendra, MT. & Hartono, M.Kom. 89

Page 93: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 94: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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 Target folderItalian drawable-it-rIT/flag.pngFrench drawable-fr-rFR/flag.pngFrench (Canada) drawable-fr-rCA/flag.pngEnglish (Canada) drawable-en-rCA/flag.pngRussian drawable-ru-rRU/flag.pngUS English drawable-en-rUS/flag.pngDefault (Indonesia) drawable/flag.png

KesimpulanAgar 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

Page 95: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 96: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

Daftar Pustaka1. Android Developer, http://developer.android.com

Hendra, MT. & Hartono, M.Kom. 93

Page 97: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

}

@Overridepublic void onCreate(SQLiteDatabase db) {

db.execSQL("CREATE TABLE Siswa (nim TEXT PRIMARY KEY," +"nama TEXT, nilai char(1))");

}

@Overridepublic 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

Page 98: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

AddSiswaBuatlah 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

Page 99: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.addsiswa);MyOpenHelper myOpenHelper = new MyOpenHelper(

this.getApplicationContext());db = myOpenHelper.getWritableDatabase();

}

@Overrideprotected 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();

} elsetampilToast("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

Page 100: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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;

@Overrideprotected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.editsiswa);MyOpenHelper myOpenHelper = new MyOpenHelper(

Hendra, MT. & Hartono, M.Kom. 97

Page 101: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

this.getApplicationContext());db = myOpenHelper.getWritableDatabase();

}

@Overrideprotected 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

Page 102: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 103: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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;

@Overrideprotected 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

Page 104: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

}

@Overrideprotected 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

Page 105: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 106: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 107: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

public class ListSiswa2Baris extends ListActivity {private MyOpenHelper myOpenHelper;private SQLiteDatabase db;

@Overrideprotected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.listsiswa);myOpenHelper = new MyOpenHelper(this.getApplicationContext());db = myOpenHelper.getWritableDatabase();

}

@Overrideprotected void onDestroy() {

super.onDestroy();db.close();

}

@Overrideprotected 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 );}

@Overrideprotected 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

Page 108: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 109: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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

Page 110: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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;

@Overrideprotected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.listsiswa);myOpenHelper = new MyOpenHelper(this.getApplicationContext());db = myOpenHelper.getWritableDatabase();

}

@Overrideprotected void onDestroy() {

super.onDestroy();db.close();

}

@Overrideprotected 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

Page 111: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

Pemrograman Piranti Bergerak

}

@Overrideprotected 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

Page 112: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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 {@Overridepublic 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

Page 113: 82186108 Diktat Pemrograman Piranti Bergerak Dengan Android

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