RUMPI IT
1. INTRODUCTION
Apa itu Android
Android adalah sistem operasi yang dikeluarkan oleh Google. Android dibuat
khusus untuk smartphone dan tablet. Berbagai macam produsen telah
menggunakan Android sebagai sistem operasi untuk peranti (device) yang
mereka produksi. Android juga mempunyai store dengan lebih dari 2 miliar
pengguna aktif, per Januari 2018 ketika tulisan ini dibuat.
Store
Aplikasi Android bisa di distribusikan menggunakan web, copy APK,
dan store. Store Android, yaitu Google Play, merupakan cara termudah bagi
para developer untuk medistribusikan aplikasinya ke pasar yang memiliki
miliaran pengguna.
Google play merupakan store resmi Android yang dikelola oleh Google.
Pengguna bisa mencari dan mengunduh aplikasi yang dikembangkan dengan
menggunakan Android Software Development Kit.
Tidak hanya aplikasi yang ditawarkan di Google Play. Ada beragam konten
lainnya yang dapat dinikmati pengguna, misalnya media digital, musik, buku,
majalah, film dan program televisi.
Bagaimana para developer memonetisasi aplikasi yang ada di dalam Google
Play?
Strategi monetisasi aplikasi yang ditawarkan Google Play ada bermacam-
macam. Dimulai dari app berbayar (paid distribution), pembelian dalam
aplikasi (in-app purchase), langganan (subscriptions), dan iklan (ads).
Tentunya developer harus mengikuti aturan yang ada untuk memastikan
3
https://source.android.com/devices/tech/dalvik/
Beberapa bacaan dasar yang dapat menambah wawasan Anda, antara lain:
https://www.android.com/history/
https://en.wikipedia.org/wiki/Android_version_history
7
2. HOW TO INSTALL
Java
Salah satu bahasa yang bisa digunakan untuk mengembangkan Android
adalah Java. Selain Java, ada beberapa Bahasa lain yang bisa digunakan
seperti C/C++, Go. Pada Mei 2017, Google resmi mendukung bahasa
pemrograman Kotlin.
Pada akademi ini kita hanya akan fokus menggunakan Java. Dan sebelum
memulai menuliskan kode, ada beberapa hal yang perlu disiapkan.
Pertama, instal Java Development Kit. Anda dapat memperolehnya pada
tautan berikut:
http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-
138363.html
Biasanya muncul pertanyaan? Apakah JRE cukup? Tidak! JRE adalah Java
Runtime Environment yang berfungsi sebagai virtual machine untuk
menjalankan program Java.
Sementara itu, JDK adalah singkatan dari Java SE Development Kit. Ketika
kita menggunakan JDK, maka kita dapat menemukan JRE di dalamnya. Yang
lebih penting lagi, JDK memiliki compiler dan beragam alat untuk mendukung
proses kompilasi.
Sederhananya JRE digunakan untuk menjalankan program. Sedangkan JDK
digunakan untuk membuatnya.
Mari kita mulai dengan proses instalasi dari JDK.
JDK.
9
2. Lalu pilihlah yang sesuai dengan peranti dan sistem operasi yang Anda
pakai.
Android Studio
Pada akademi ini kita akan menggunakan Android Studio versi 3.1 sebagai
IDE (Integrated Development Environment). Android Studio dirilis 16 Mei 2013
pada Google IO. Android Studio berbasiskan JetBrains Intellij IDEA, dan
dikhususkan untuk mengembangkan aplikasi berplatform Android.
Semua versi dari Android Studio dapat Anda unduh pada tautan ini:
https://developer.android.com/studio/archive.html
https://developer.android.com/studio/index.html#downloads
Virtualization
Untuk menjalankan emulator di dalam Android Studio, pastikan aspek
virtualization. Sistem Anda harus memenuhi persyaratannya, yakni ketentuan
prosesor dan sistem operasi dari laptop / PC yang Anda gunakan.
11
Processor
Sistem Operasi
Menggunakan Emulator
Setelah Anda memastikan bahwa virtualization bisa berjalan di komputer
Anda, ikuti langkah-langkah berikut untuk menjalankan aplikasi kita dengan
menggunakan emulator built-in dari Android Studio.
1. Jalankan ikon , kemudian akan muncul dialog seperti ini. Mari kita
coba buat emulator baru dengan memilih Create New Virtual Device.
13
Pada dialog ini Anda akan memilih versi android dari emulator yang
akan anda buat. Pada dialog tersebut, Anda perlu memilih versi yang
sudah diunduh yaitu Nougat. Tombol download di sebelah kanan versi
menunjukkan bahwa anda perlu mengunduhnya terlebih dahulu jika
ingin menggunakannya.
5. Selanjutnya klik Next. Akan muncul dialog verify configuration. Pada
dialog ini, Anda bisa memeriksa konfigurasi dari emulator yang Anda
15
pilih.
sebelah kanan.
Lebih cepat;
Fitur seperti geo-location, push notif bisa digunakan;
Bisa mengetahui daya serap baterai terhadap aplikasi.
Lebih mudah
1. Pastikan peranti yang akan dipakai sesuai dengan target SDK atau
paling tidak mendukung versi SDK terendah yang digunakan aplikasi.
17
2. Buka setting dan masuk ke dalam menu About. Pada halaman menu
ini, Anda perlu menemukan informasi tentang Build number.
18
4. Kembali ke menu setting di awal dan akan muncul menu baru di bawah
about yaitu Developer Options.
21
22
3. TEORI ACTIVITY
Teori
https://developer.android.com/guide/components/activities/
24
Activity Lifecycle
Developer yang baik harus mengetahui secara detail tentang life cycle sebuah
activity. Terutama untuk melakukan aksi yang tepat, saat terjadi
perubahan state activity. Callback methods yang ada dapat digunakan untuk
melakukan beragam proses terkait state dari activity. Misalnya melakukan
semua inisialisasi komponen di onCreate(), melakukan disconnect terhadap
koneksi ke server pada onStop() atau onDestroy() dan lain sebagainya.
25
1. Gambar 1
Jika Anda memiliki sebuah aplikasi yang terdiri dari 2 activity, maka
26
2. Gambar 2
Activity kedua sudah muncul di layar sekarang. Ketika Anda menekan
tombol back pada physical button menu utama atau menjalankan
metode finish(), maka activity kedua Anda akan dikeluarkan dari stack.
Pada kondisi di atas, state activity kedua akan berada pada destroy.
Oleh karenanya, metode onDestroy() akan dipanggil.
Kejadian keluar dan masuk stack pada proses di atas menandakan
sebuah model Last In, First Out. Activity kedua menjadi yang terakhir
masuk stack (Last In) dan yang paling pertama keluar dari stack (First
Out).
3. Gambar 3
Activity Pertama akan dimunculkan kembali di layar setelah melalui
beberapa state dengan rangkaian callback method yang terpanggil,
onStop → onRestart → onStart → onResume.
Dengan menjaga state dari activity, maka ketika activity tersebut ditampilkan,
kondisinya akan tetap sama dengan kondisi sebelumnya.
Akan tetapi ketika sistem menghancurkan activity untuk keperluan memori
misalnya karena memori habis, maka obyek activity dihancurkan. Alhasil,
ketika activity ingin ditampilkan kembali diperlukan proses re-create activity
yang dihancurkan tadi.
Kejadian di atas adalah hal yang lumrah terjadi. Oleh karena itu, perubahan
yang terjadi pada activity perlu disimpan terlebih dahulu sebelum ia
dihancurkan. Disinilah metode onSaveInstanceState() digunakan.
Dalam onSaveInstanceState terdapat bundle yang dapat digunakan untuk
menyimpan informasi. Informasi dapat disimpan dengan memanfaatkan
fungsi seperti putString() dan putInt().
Ketika activity di-restart, bundle akan diberikan kepada
metode onCreate dan onRestoreInstanceState. Bundle tersebut akan
dimanfaatkan untuk mengembalikan kembali perubahan yang telah terjadi
sebelumnya.
Logika Dasar
1. Buat proyek baru dengan klik File → New → New Project pada
Android Studio Anda.
2. Setelah muncul jendela Create New Project, atur nama aplikasi dan
domain perusahaan/website Anda. Sebaiknya jangan sama dengan apa
yang ada di contoh. Dan jangan lupa pula untuk menentukan lokasi
proyek.
3. Kemudian pilih tipe peranti (device) untuk aplikasi beserta target
minimum SDK yang akan digunakan. Pilihan target Android SDK akan
31
4. Pada bagian ini kita akan memilih tipe activity awal dari template yang
telah disediakan. Saat ini Android Studio sudah menyediakan berbagai
macam template activity dari yang paling sederhana hingga yang paling
kompleks seperti :
Add No Activity : Tidak ada activity yang ditambahkan
Basic Activity : Activity dengan template komponen
material design seperti FloatingActionButton
Bottom Navigation Activity : Activity dengan tampilan side bar menu
di bagian bawah
Empty Activity : Activity dalam bentuk yang paling
dasar
Fragment + ViewModel : Activity dengan
menerapkan architecture component
Fullscreen Activity : Activity fullscreen tanpa status bar
Google AdMob Ads Activity : Activity dengan
konfigurasi default iklan Admob
Google Maps Activity : Activity dengan menyediakan
konfigurasi dasar Google Maps
Login Activity : Activity untuk halaman login
Master / Detail Flow : Activity yang diperuntukan untuk alur
aplikasi master detail pada peranti tablet
Navigation Drawer Activity : Activity dengan tampilan side bar menu
Scrolling Activity : Activity dengan kemampuan scroll
32
5. Selanjutnya, tentukan nama Activity pertama kita, saat ini kita biarkan
pada kondisi apa adanya. Ingat, jika suatu saat nanti kita ingin
melakukan penambahan Activity , maka sebaiknya nama
untuk Activity tersebut disamakan dengan nama kelasnya dan diakhiri
dengan activity . Misal: ProfileActivity, SettingsActivity dan lain
33
Selamat ngoding!
Perlu diperhatikan root layout (tag layout terluar) yang dipakai di sini
adalah LinearLayout. Jika kita menggunakan Android Studio versi 3
maka secara default root yang dipakai adalah ConstraintLayout, jadi
agar sesuai dengan latihan ini tinggal ganti menjadi LinearLayout.
37
Ini karena kita melakukan hardcoding pada nilai string-nya. Mari kita
hilangkan code warning tersebut dengan menekan Alt+Enter (option +
return pada Mac) atau menekan lampu kuning yang muncul pada
attribut android:text.
Akan muncul dialog seperti ini, pilihlah extract string resource.
38
5. <string name="calculate">Hitung</string>
6. <string name="result">Hasil</string>
7. <string name="length">Panjang</string>
8. </resources>
Langsung saja tambahkan dengan cara klik kanan pada directory res.
Akan muncul dialog seperti ini.
40
4. @Override
5. protected void onCreate(Bundle savedInstanceState) {
6. super.onCreate(savedInstanceState);
7. setContentView(R.layout.activity_main);
8.
9. edtWidth = findViewById(R.id.edt_width);
10. edtHeight = findViewById(R.id.edt_height);
11. edtLength = findViewById(R.id.edt_length);
12. btnCalculate = findViewById(R.id.btn_calculate);
13. tvResult = findViewById(R.id.tv_result);
14.
15. }
Jangan khawatir! Silakan klik di atas baris merah tersebut dan klik pada
ikon bola lampu. Atau dengan tekan tombol Alt + Enter (option +
return pada Mac) atau menekan lampu merah yang muncul lalu
pilih implement methods.
42
Maka,
secara otomatis akan ditambahkan metode onClick di
kelas MainActivity. Tambahkan kode berikut ini.
22. @Override
23. protected void onCreate(Bundle savedInstanceState) {
24. super.onCreate(savedInstanceState);
25. setContentView(R.layout.activity_main);
26.
27. ...
28.
29. btnCalculate.setOnClickListener(this);
30. }
31.
32. @Override
33. public void onClick(View v) {
34. if (v.getId() == R.id.btn_calculate) {
35. String inputLength = edtLength.getText().toString().trim();
36. String inputWidth = edtWidth.getText().toString().trim();
37. String inputHeight = edtHeight.getText().toString().trim();
38.
39. boolean isEmptyFields = false;
40. boolean isInvalidDouble = false;
41.
42. if (TextUtils.isEmpty(inputLength)) {
43. isEmptyFields = true;
44. edtLength.setError("Field ini tidak boleh kosong");
45. }
46.
47. if (TextUtils.isEmpty(inputWidth)) {
48. isEmptyFields = true;
49. edtWidth.setError("Field ini tidak boleh kosong");
50. }
51.
52. if (TextUtils.isEmpty(inputHeight)) {
53. isEmptyFields = true;
54. edtHeight.setError("Field ini tidak boleh kosong");
55. }
56.
57. Double length = toDouble(inputLength);
58. Double width = toDouble(inputWidth);
43
98. super.onCreate(savedInstanceState);
99. setContentView(R.layout.activity_main);
100.
101. edtWidth = findViewById(R.id.edt_width);
102. edtHeight = findViewById(R.id.edt_height);
103. edtLength = findViewById(R.id.edt_length);
104. btnCalculate = findViewById(R.id.btn_calculate);
105. tvResult = findViewById(R.id.tv_result);
106.
107. btnCalculate.setOnClickListener(this);
108. }
109.
110. @Override
111. public void onClick(View v) {
112. if (v.getId() == R.id.btn_calculate) {
113. String inputLength = edtLength.getText().toString().trim
();
114. String inputWidth = edtWidth.getText().toString().trim()
;
115. String inputHeight = edtHeight.getText().toString().trim
();
116.
117. boolean isEmptyFields = false;
118. boolean isInvalidDouble = false;
119.
120. if (TextUtils.isEmpty(inputLength)) {
121. isEmptyFields = true;
122. edtLength.setError("Field ini tidak boleh kosong");
123. }
124.
125. if (TextUtils.isEmpty(inputWidth)) {
126. isEmptyFields = true;
127. edtWidth.setError("Field ini tidak boleh kosong");
128. }
129.
130. if (TextUtils.isEmpty(inputHeight)) {
131. isEmptyFields = true;
132. edtHeight.setError("Field ini tidak boleh kosong");
133. }
134.
135. Double length = toDouble(inputLength);
136. Double width = toDouble(inputWidth);
137. Double height = toDouble(inputHeight);
138.
139. if (length == null) {
140. isInvalidDouble = true;
141. edtLength.setError("Field ini harus berupa nomer yan
g valid");
142. }
143.
144. if (width == null) {
145. isInvalidDouble = true;
146. edtWidth.setError("Field ini harus berupa nomer yang
valid");
147. }
45
148.
149. if (height == null) {
150. isInvalidDouble = true;
151. edtHeight.setError("Field ini harus berupa nomer yan
g valid");
152. }
153.
154. if (!isEmptyFields && !isInvalidDouble) {
155. double volume = length * width * height;
156. tvResult.setText(String.valueOf(volume));
157. }
158. }
159. }
160.
161. Double toDouble(String str) {
162. try {
163. return Double.valueOf(str);
164. } catch (NumberFormatException e) {
165. return null;
166. }
167. }
168. }
pada MainActivity.java.
10. @Override
11. protected void onCreate(Bundle savedInstanceState) {
12. super.onCreate(savedInstanceState);
13. setContentView(R.layout.activity_main);
14.
15. ...
16.
17. if (savedInstanceState != null) {
18. String result = savedInstanceState.getString(STATE_RESULT);
19. tvResult.setText(result);
20. }
21. }
4. Silakan jalankan kembali aplikasinya. Ulangi proses perhitungan seperti
sebelumnya. Kemudian ganti orientasi peranti Anda. Jika sudah benar
maka hasil perhitungan tidak akan hilang.
Bedah Kode
1. xmlns:android="http://schemas.android.com/apk/res/android"
49
Macam Views
Di sini kita menggunakan beberapa komponen user interface yang disebut
view. Diantaranya:
TextView : Komponen view untuk menampilkan teks ke layar
EditText : Komponen view untuk memberikan input teks
Button : Komponen view untuk melakukan sebuah aksi klik
LinearLayout : Komponen view bertipe viewgroup yang
menjadi parent dari semua sub komponen view (sub view) di dalamnya.
Komponen ini bersifat sebagai kontainer untuk komponen lain dengan
orientasi secara vertikal atau horizontal.
Cara membaca :
1. <TextView
2. android:layout_width="match_parent"
3. android:layout_height="wrap_content"
4. android:text="@string/calculate"
5. android:layout_marginBottom="@dimen/activity_vertical_margin"/>
1. <Button
51
2. android:id="@+id/btn_calculate"
3. android:layout_width="match_parent"
4. android:layout_height="wrap_content"
5. android:text="@string/calculate"
6. android:layout_marginBottom="@dimen/activity_vertical_margin"/>
1. android:id="@+id/btn_calculate"
1. implements View.OnClickListener
Ini adalah listener yang kita implementasikan untuk memantau kejadian klik
pada komponen tombol (button).
Views
1. @Override
2. protected void onCreate(Bundle savedInstanceState) {
3. super.onCreate(savedInstanceState);
4. setContentView(R.layout.activity_main);
5. edtWidth = (EditText)findViewById(R.id.edt_width);
6. edtHeight = (EditText)findViewById(R.id.edt_height);
7. edtLength = (EditText)findViewById(R.id.edt_length);
8. btnCalculate = (Button)findViewById(R.id.btn_calculate);
9. tvResult = (TextView)findViewById(R.id.tv_result);
10.
11. btnCalculate.setOnClickListener(this);
12.
13. }
komponen view yang kita telah deklarasikan sebelumnya, agar dapat kita
manipulasi.
SetContentView
1. setContentView(R.layout.activity_main);
1. edtWidth = findViewById(R.id.edt_width);
Maksud dari baris diatas adalah obyek edittext edtWidth disesuaikan (cast)
dengan komponen edittext ber-ID edt_width di layout xml melalui
metode findViewById().
SetOnClickListener
1. btnCalculate.setOnClickListener(this);
Pembahasan saveInstanceState
1. @Override
2. protected void onSaveInstanceState(Bundle outState) {
3. outState.putString(STATE_RESULT, tvResult.getText().toString());
4.
5. super.onSaveInstanceState(outState);
6. }
1. if (savedInstanceState != null){
2. String hasil = savedInstanceState.getString(STATE_RESULT);
55
3. tvResult.setText(hasil);
4. }
Pada onCreate inilah kita menggunakan nilai bundle yang telah kita simpan
sebelumnya pada onSaveInstanceState. Nilai tersebut kita isikan kembali
pada tvResult.
56
INTENT TEORI
Teori
1. Explicit Intent
Adalah tipe Intent yang digunakan untuk menjalankan komponen dari
dalam sebuah aplikasi. Explicit intent bekerja dengan menggunakan
nama kelas yang dituju misal : com.dicoding.activity.DetailActivity.
Umumnya intent ini digunakan untuk mengaktifkan komponen pada
satu aplikasi.
2. Implicit Intent
Adalah tipe intent yang tidak memerlukan detail nama kelas yang ingin
diaktifkan. Model ini memungkinkan komponen dari aplikasi lain bisa
merespon request intent yang dijalankan.
Penggunaan tipe intent ini umumnya diperuntukan untuk menjalankan
fitur/fungsi dari komponen aplikasi lain. Contohnya ketika kita
membutuhkan fitur untuk mengambil foto. Daripada membuat sendiri
fungsi kamera, lebih baik kita menyerahkan proses tersebut pada
aplikasi kamera bawaan dari peranti atau aplikasi kamera lain yang
telah terinstal sebelumnya di peranti.
Hal yang sama misalnya ketika kita membutuhkan fungsi berbagi
konten. Kita bisa memanfaatkan intent untuk menampilkan aplikasi
mana saja yang bisa menangani fitur tersebut.
Implementasi implicit intent ini akan sangat memudahkan bagi
57
pengembang agar tetap fokus pada proses bisnis inti dari aplikasi yang
dikembangkan.
Tujuan
Logika Dasar
20. <resources>
21. <!-- Default screen margins, per the Android Design guidelines. -->
22. <dimen name="activity_horizontal_margin">16dp</dimen>
23. <dimen name="activity_vertical_margin">16dp</dimen>
24. </resources>
25. <resources>
26. <string name="app_name">MyIntentApp</string>
27. <string name="move_activity">Pindah Activity</string>
28. <string name="move_with_data">Pindah Activity dengan Data</string>
29. <string name="move_with_object">Pindah Activity dengan Object</strin
g>
30. <string name="dial_number">Dial a Number</string>
31. <string name="move_with_result">Pindah Activity untuk Result</string
>
32. <string name="result_from_activity">Hasil dari Activity</string>
33. <string name="choose_number">Pilih angka yang kamu suka</string>
34. <string name="_50">50</string>
35. <string name="_100">100</string>
36. <string name="_150">150</string>
37. <string name="_200">200</string>
38. <string name="choose">Pilih</string>
39. <string name="data_received">Data Diterima</string>
40. <string name="object_received">Object Diterima</string>
41. <string name="this_is_moveactivity">Ini MoveActivity</string>
42. </resources>
0. Button btnMoveActivity;
1.
2. @Override
3. protected void onCreate(Bundle savedInstanceState) {
60
4. super.onCreate(savedInstanceState);
5. setContentView(R.layout.activity_main);
6.
7. btnMoveActivity = findViewById(R.id.btn_move_activity);
8. }
0. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/androi
d"
1. xmlns:tools="http://schemas.android.com/tools"
2. android:layout_width="match_parent"
3. android:layout_height="match_parent"
4. android:paddingBottom="@dimen/activity_vertical_margin"
5. android:paddingLeft="@dimen/activity_horizontal_margin"
6. android:paddingRight="@dimen/activity_horizontal_margin"
7. android:paddingTop="@dimen/activity_vertical_margin"
8. tools:context="com.dicoding.picodiploma.myintentapp.MoveActivity">
9.
10. <TextView
11. android:layout_width="match_parent"
12. android:layout_height="wrap_content"
13. android:text="@string/this_is_moveactivity" />
14. </RelativeLayout>
63
0. @Override
1. public void onClick(View v) {
2. switch (v.getId()){
3. case R.id.btn_move_activity:
4. Intent moveIntent = new Intent(MainActivity.this, MoveActivi
ty.class);
5. startActivity(moveIntent);
6. break;
7. }
8. }
Bedah Kode
Register Activity
Kita telah belajar bagaimana membuat suatu activity baru. Di materi
sebelumnya, syarat suatu activity haruslah terdaftar pada
berkas AndroidManifest.xml. Karena menggunakan Android Studio, proses
pendaftaran tersebut dilakukan secara otomatis.
Intent Filter
Berikutnya, perhatikan pada kode dengan tag intent-filter yang ada di dalam
MainActivity.
1. <intent-filter>
2. <action android:name="android.intent.action.MAIN" />
3. <category android:name="android.intent.category.LAUNCHER" />
4. </intent-filter>
Pindah Activity
Selanjutnya, perhatikan kode berikut.
Kita membuat suatu obyek Intent dengan cara seperti di atas dengan
memberikan kelas Activity asal (MainActivity.this) dan kelas Activity tujuan
(MoveActivity.class) pada konstruktor kelas Intent.
Kelas asal selalu menggunakan .this yang menandakan obyek kelas saat ini.
Kelas tujuan selalu menggunakan .class.
Jika kita menggunakan code assistant (tekan ctrl + spasi) dari Android Studio,
maka akan tampil rekomendasi (code hint) sebagai berikut:
Pada konteks di atas kita memilih Context packageContext, Class cls sebagai
inputan untuk nilai constructor intent.
Pada modul ini kita telah berhasil memindahkan satu Activity ke Activity lain
dengan tidak membawa data. Pada bagian selanjutnya kita akan membuat
suatu Intent yang di dalamnya akan membawa data ke Activity tujuan.
INTENT Explisit
Selanjutnya kita akan membuat sebuah intent yang didalamnya akan
membawa data ke activity tujuan. Anda Siap?
di MainActivity.java.
3. Selanjutnya, buat Activity baru lagi seperti cara sebelumnya dan beri
nama MoveWithDataActivity.
15. android:layout_height="wrap_content"
16. android:text="@string/data_received" />
17. </RelativeLayout>
1. @Override
2. public void onClick(View v) {
3. switch (v.getId()){
4. case R.id.btn_move_activity:
5. Intent moveIntent = new Intent(MainActivity.this, MoveAct
ivity.class);
6. startActivity(moveIntent);
7. break;
8. case R.id.btn_move_activity_data:
9. Intent moveWithDataIntent = new Intent(MainActivity.this,
MoveWithDataActivity.class);
10. moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NA
ME, "DicodingAcademy Boy");
11. moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AG
E, 5);
12. startActivity(moveWithDataIntent);
13. break;
14. }
15. }
23. break;
24. case R.id.btn_move_activity_data:
25. Intent moveWithDataIntent = new Intent(MainActivity.this
, MoveWithDataActivity.class);
26. moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_N
AME, "DicodingAcademy Boy");
27. moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_A
GE, 5);
28. startActivity(moveWithDataIntent);
29. break;
30. }
31. }
32. }
9. Silakan jalankan aplikasi Anda, kemudian coba klik pada tombol Pindah
Activity dengan Data. Seharusnya Anda sudah bisa memindahkan
satu activity ke activity lain dengan membawa data.
73
Bedah Kode
Put Extra
Perhatikan kode di bawah ini.
1. moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME, "DicodingAcademy
Boy");
2. moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5);
Hampir semua tipe data untuk input value didukung oleh metode putExtra().
1. moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME,"DicodingAcademy B
oy");
Get Data
Setelah data dikirimkan, selanjutnya adalah mengambil data tersebut.
Di sini kita akan mengirimkan data bertipe string ke MoveWithDataActivity. Di
dalam MoveWithdataActivity kita akan mengambil nilai data
berdasarkan key yang dikirimkan dengan menggunakan metode
getIntent().getStringExtra(key). Implementasinya sebagai berikut:
ternyata datanya kosong. Data kosong atau nilainya null bisa terjadi ketika
datanya memang tidak ada, atau key-nya tidak sama.
Selamat! Anda telah mempelajari dua intent explicit dengan atau tidak
membawa data.
Bagi yang belum mengenal apa itu Plain Old Java Object (POJO), berikut
penjelasan singkatnya. POJO adalah sebuah kelas Java biasa yang tidak
bergantung dengan kelas lain. Umumnya kelas POJO ini disebut sebagai
kelas Java yang memiliki properti/variabel dan metode setter-getter. Seperti di
bawah ini.
7. }
8.
9. public void setSomeProperty(String someProperty) {
10. this.someProperty = someProperty;
11. }
12. }
Lalu apa kegunaan obyek POJO? POJO akan membantu kita saat aplikasi
semakin kompleks. Contohnya, POJO bisa kita gunakan untuk melakukan
koneksi ke server untuk request API atau akses ke database lokal dengan
SQLite.
Selain POJO, Android juga memiliki obyek parcelable POJO. Obyek ini akan
lebih memudahkan kita untuk melakukan pengiriman data dari satu activity ke
activity lainnya.
2. Pada dialog, isikan nama kelas dengan ‘Person’. Lalu klik OK.
Anda tidak perlu menulis satu per satu metode setter-getter nya, di
Android Studio tersedia fasilitas generator untuk hal tersebut. Caranya,
setelah Anda menentukan variabel apa saja yang akan digunakan
lakukan, lakukan beberapa langkah sebagai berikut :
77
30.
31. public String getCity() {
32. return city;
33. }
34.
35. public void setCity(String city) {
36. this.city = city;
37. }
38. }
6. Pilih Parcelable.
83
7. Pada dialog box yang tampil, pilih semua variable yang ada lalu klik OK.
Sekarang
Anda bisa menemukan beragam metode parcelable untuk
kelas Person. Sekarang kelas Person sudah sah menjadi kelas
parcelable dan dapat dikirimkan ke activity lain melalui intent.
1. <Button
2. android:id="@+id/btn_move_activity_object"
3. android:layout_width="match_parent"
4. android:layout_height="wrap_content"
5. android:layout_marginBottom="@dimen/activity_vertical_margin"
6. android:text="@string/move_with_object" />
1. ...
2. Button btnMoveWithObject;
3.
4. @Override
5. protected void onCreate(Bundle savedInstanceState) {
6. super.onCreate(savedInstanceState);
7. setContentView(R.layout.activity_main);
8.
9. ...
10.
11. btnMoveWithObject = findViewById(R.id.btn_move_activity_object);
12. btnMoveWithObject.setOnClickListener(this);
13. }
14. ...
85
14. Setelah kita membuat activity tujuan, sekarang kita tinggal kita
tambahkan beberapa baris kode pada bagian switch… case di
mainactivity.
1. @Override
87
Bedah Kode
Put Parcelable
5. person.setCity("Bandung");
Di atas kita menciptakan sebuah obyek Person bernama person yang mana
kelas tersebut adalah Parcelable. Kita atur semua data sesuai dengan
propertinya. Setelah selesai kita akan mengirimkan obyek tersebut
ke MoveWithObjectActivity melalui sebuah intent di bawah ini.
Metode putExtra() yang kita pilih saat ini adalah putExtra(String name,
Parcelable value).
Get Parcelable
Dengan EXTRA_PERSON merupakan variabel static bertipe data string dan
bernilai “extra_person”.
Selanjutnya pada MoveWithObjectActivity akan dilakukan pengambilan nilai
seperti berikut :
Dan ini yang seru, karena obyek ini terdiri dari beragam tipe data pada atribut
atau propertinya, kita hanya cukup membungkus itu semua kedalam obyek
parcelable. Melalui getIntent().getParcelableExtra(Key) Anda dapat
mengambil nilai obyek Person yang sebelumnya telah dikirim dan
menampilkannya seperti ini.
Rows of Data
Lalu, bagaimana jika kita ingin mengirimkan kumpulan obyek parcelable ke
activity lain? Untuk mengirimkan kumpulan data, kita bisa memanfaatkan
arraylist dan metode putParcelableArrayListExtra.
Contoh kode ketika put extra adalah seperti ini.
1. <Button
2. android:id="@+id/btn_dial_number"
3. android:layout_width="match_parent"
4. android:layout_height="wrap_content"
5. android:layout_marginBottom="@dimen/activity_vertical_margin"
92
6. android:text="@string/dial_number" />
1. Button btnDialPhone;
2.
3. @Override
4. protected void onCreate(Bundle savedInstanceState) {
5. super.onCreate(savedInstanceState);
6. setContentView(R.layout.activity_main);
7.
8. ...
9.
10. btnDialPhone = findViewById(R.id.btn_dial_number);
11. btnDialPhone.setOnClickListener(this);
12. }
1. @Override
2. public void onClick(View v) {
3. switch (v.getId()){
4.
5. ...
6.
7. case R.id.btn_dial_number:
8. String phoneNumber = "081210841382";
9. Intent dialPhoneIntent = new Intent(Intent.ACTION_DIAL, U
ri.parse("tel:"+phoneNumber));
10. startActivity(dialPhoneIntent);
11. break;
12. }
13. }
8. super.onCreate(savedInstanceState);
9. setContentView(R.layout.activity_main);
10.
11. btnMoveActivity = findViewById(R.id.btn_move_activity);
12. btnMoveActivity.setOnClickListener(this);
13.
14. btnMoveWithDataActivity = findViewById(R.id.btn_move_activity_da
ta);
15. btnMoveWithDataActivity.setOnClickListener(this);
16.
17. btnMoveWithObject = findViewById(R.id.btn_move_activity_object);
18. btnMoveWithObject.setOnClickListener(this);
19.
20. btnDialPhone = findViewById(R.id.btn_dial_number);
21. btnDialPhone.setOnClickListener(this);
22. }
23.
24. @Override
25. public void onClick(View v) {
26. switch (v.getId()){
27. case R.id.btn_move_activity:
28. Intent moveIntent = new Intent(MainActivity.this, MoveAc
tivity.class);
29. startActivity(moveIntent);
30. break;
31. case R.id.btn_move_activity_data:
32. Intent moveWithDataIntent = new Intent(MainActivity.this
, MoveWithDataActivity.class);
33. moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_N
AME, "DicodingAcademy Boy");
34. moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_A
GE, 5);
35. startActivity(moveWithDataIntent);
36. break;
37. case R.id.btn_move_activity_object:
38. Person person = new Person();
39. person.setName("DicodingAcademy");
40. person.setAge(5);
41. person.setEmail("academy@dicoding.com");
42. person.setCity("Bandung");
43.
44. Intent moveWithObjectIntent = new Intent(MainActivity.th
is, MoveWithObjectActivity.class);
45. moveWithObjectIntent.putExtra(MoveWithObjectActivity.EXT
RA_PERSON, person);
46. startActivity(moveWithObjectIntent);
47. break;
48. case R.id.btn_dial_number:
49. String phoneNumber = "081210841382";
50. Intent dialPhoneIntent = new Intent(Intent.ACTION_DIAL,
Uri.parse("tel:"+phoneNumber));
51. startActivity(dialPhoneIntent);
52. break;
53. }
54. }
95
55. }
5. Setelah selesai, silakan jalankan lagi aplikasi anda. Yeay, Anda sudah
bisa men-dial sebuah nomor telepon melalui aplikasi bawaan dari
peranti anda. Selamat!
96
Bedah Kode
Intent Implicit
Intent
Dimana “tel” adalah sebuah skema yang disepakati untuk sumber daya
telepon dan phoneNumber adalah variabel string yang bernilai
“081210841382”. Skema lain dari Uri seperti “geo” untuk peta, “http” untuk
browser sisanya bisa dilihat di halaman ini :
Common Intents
Anda sudah mempelajari 3 buah intent secara eksplisit dan 1 buah intent
secara implicit. Selamat!
Pada modul ini, kita akan membedah hubungan activity dan intent dalam
menerima nilai balik. Kadang kala, ketika kita menjalankan sebuah activity
dari activity lain, kita mengharapkan ada nilai hasil balik dari activity yang
dijalankan ketika ia ditutup.
Contohnya kita memiliki activity A yang menjalankan activity B untuk
melakukan sebuah proses. Lalu nilai hasil dari proses tersebut dikirimkan
kembali ke activity A sebelum activity B ditutup dengan pemanggilan
metode finish(). Itulah yang dinamakan sebuah activity menerima nilai hasil
balik dari activity yang dia jalankan. Untuk memperjelas, ayo kita lanjutkan
lagi proses ngodingnya.
99
5. android:layout_height="match_parent"
6. android:orientation="vertical"
7. android:paddingBottom="@dimen/activity_vertical_margin"
8. android:paddingLeft="@dimen/activity_horizontal_margin"
9. android:paddingRight="@dimen/activity_horizontal_margin"
10. android:paddingTop="@dimen/activity_vertical_margin"
11. tools:context="com.dicoding.picodiploma.myintentapp.MoveForResultAct
ivity">
12.
13. <TextView
14. android:layout_width="match_parent"
15. android:layout_height="wrap_content"
16. android:layout_marginBottom="@dimen/activity_vertical_margin"
17. android:text="@string/choose_number" />
18.
19. <RadioGroup
20. android:id="@+id/rg_number"
21. android:layout_width="match_parent"
22. android:layout_height="wrap_content"
23. android:orientation="vertical">
24.
25. <RadioButton
26. android:id="@+id/rb_50"
27. android:layout_width="match_parent"
28. android:layout_height="wrap_content"
29. android:layout_marginBottom="@dimen/activity_vertical_margin
"
30. android:text="@string/_50" />
31.
32. <RadioButton
33. android:id="@+id/rb_100"
34. android:layout_width="match_parent"
35. android:layout_height="wrap_content"
36. android:layout_marginBottom="@dimen/activity_vertical_margin
"
37. android:text="@string/_100" />
38.
39. <RadioButton
40. android:id="@+id/rb_150"
41. android:layout_width="match_parent"
42. android:layout_height="wrap_content"
43. android:layout_marginBottom="@dimen/activity_vertical_margin
"
44. android:text="@string/_150" />
45.
46. <RadioButton
47. android:id="@+id/rb_200"
48. android:layout_width="match_parent"
49. android:layout_height="wrap_content"
50. android:layout_marginBottom="@dimen/activity_vertical_margin
"
51. android:text="@string/_200" />
52. </RadioGroup>
53.
54. <Button
101
55. android:id="@+id/btn_choose"
56. android:layout_width="match_parent"
57. android:layout_height="wrap_content"
58. android:text="@string/choose" />
59. </LinearLayout>
4. Kemudian kita beri aksi pada button dengan menuliskan kode sebagai
berikut :
1. <Button
2. android:id="@+id/btn_move_for_result"
3. android:layout_width="match_parent"
4. android:layout_height="wrap_content"
5. android:layout_marginBottom="@dimen/activity_vertical_margin"
6. android:text="@string/move_with_result" />
7.
8. <TextView
9. android:id="@+id/tv_result"
10. android:layout_width="match_parent"
11. android:layout_height="wrap_content"
12. android:gravity="center"
13. android:text="@string/result_from_activity"
14. android:textSize="24sp" />
25. tools:context="com.dicoding.picodiploma.myintentapp.MainActivity">
26.
27. <Button
28. android:id="@+id/btn_move_activity"
29. android:layout_width="match_parent"
30. android:layout_height="wrap_content"
31. android:layout_marginBottom="@dimen/activity_vertical_margin"
32. android:text="@string/move_activity" />
33.
34. <Button
35. android:id="@+id/btn_move_activity_data"
36. android:layout_width="match_parent"
37. android:layout_height="wrap_content"
38. android:layout_marginBottom="@dimen/activity_vertical_margin"
39. android:text="@string/move_with_data" />
40.
41. <Button
42. android:id="@+id/btn_move_activity_object"
43. android:layout_width="match_parent"
44. android:layout_height="wrap_content"
45. android:layout_marginBottom="@dimen/activity_vertical_margin"
46. android:text="@string/move_with_object" />
47.
48. <Button
49. android:id="@+id/btn_dial_number"
50. android:layout_width="match_parent"
51. android:layout_height="wrap_content"
52. android:layout_marginBottom="@dimen/activity_vertical_margin"
53. android:text="@string/dial_number" />
54.
55. <Button
56. android:id="@+id/btn_move_for_result"
57. android:layout_width="match_parent"
58. android:layout_height="wrap_content"
59. android:layout_marginBottom="@dimen/activity_vertical_margin"
60. android:text="@string/move_with_result" />
61.
62. <TextView
63. android:id="@+id/tv_result"
64. android:layout_width="match_parent"
65. android:layout_height="wrap_content"
66. android:gravity="center"
67. android:text="@string/result_from_activity"
68. android:textSize="24sp" />
69. </LinearLayout>
1. ...
2.
3. @Override
4. public void onClick(View v) {
5. switch (v.getId()) {
6. ...
7. case R.id.btn_move_for_result:
8. Intent moveForResultIntent = new Intent(MainActivity.thi
s, MoveForResultActivity.class);
9. startActivityForResult(moveForResultIntent, REQUEST_CODE
);
10. break;
11. }
12. }
13.
14.
15. @Override
16. protected void onActivityResult(int requestCode, int resultCode, Int
ent data) {
17. super.onActivityResult(requestCode, resultCode, data);
18.
106
textiew tvResult.
108
Bedah Kode
Pada baris diatas, kita akan menjalankan sebuah activity melalui intent untuk
nilai balik ke activity yang menjalankan di mana
nilai REQUEST_CODE adalah 110. Penentuan nilai 110 itu dibebaskan dan
kalau bisa disesuaikan dengan kebutuhan pengembangan aplikasi.
Result Activity
Kemudian, pada MoveForResultActivity kita memilih satu angka yang kita
suka, Sebagai contoh angka 150. Kemudian tekanlah tombol ‘Pilih’. Maka
baris kode dibawah ini akan dijalankan.
1. @Override
2. public void onClick(View v) {
3. if (v.getId() == R.id.btn_choose){
4. if (rgNumber.getCheckedRadioButtonId() != 0){
5. int value = 0;
6. switch (rgNumber.getCheckedRadioButtonId()){
7. case R.id.rb_50:
8. value = 50;
9. break;
10. case R.id.rb_100:
11. value = 100;
12. break;
13. case R.id.rb_150:
14. value = 150;
15. break;
16. case R.id.rb_200:
17. value = 200;
18. break;
19. }
20. Intent resultIntent = new Intent();
21. resultIntent.putExtra(EXTRA_SELECTED_VALUE, value);
22. setResult(RESULT_CODE, resultIntent);
23. finish();
109
24. }
25. }
26. }
1. <RadioGroup
2. android:id="@+id/rg_number"
3. android:layout_width="match_parent"
4. android:layout_height="wrap_content"
5. android:orientation="vertical">
6. <RadioButton
7. android:id="@+id/rb_50"
8. android:layout_width="match_parent"
9. android:layout_height="wrap_content"
10. android:text="50"
11. android:layout_marginBottom="@dimen/activity_vertical_margin"/>
12. <RadioButton
13. android:id="@+id/rb_100"
14. android:layout_width="match_parent"
15. android:layout_height="wrap_content"
16. android:text="100"
17. android:layout_marginBottom="@dimen/activity_vertical_margin"/>
18. <RadioButton
19. android:id="@+id/rb_150"
20. android:layout_width="match_parent"
21. android:layout_height="wrap_content"
22. android:text="150"
23. android:layout_marginBottom="@dimen/activity_vertical_margin"/>
24. <RadioButton
25. android:id="@+id/rb_200"
26. android:layout_width="match_parent"
27. android:layout_height="wrap_content"
28. android:text="200"
29. android:layout_marginBottom="@dimen/activity_vertical_margin"/>
30. </RadioGroup>
Selanjutnya, ketika sudah didapatkan nilainya, maka baris ini akan dieksekusi:
4. finish();
1. @Override
2. protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
3. super.onActivityResult(requestCode, resultCode, data);
4. if (requestCode == REQUEST_CODE){
5. if (resultCode == MoveForResultActivity.RESULT_CODE){
6. int selectedValue = data.getIntExtra(MoveForResultActivity.EXTRA_SE
LECTED_VALUE, 0);
7. tvResult.setText("Hasil : "+selectedValue);
8. }
9. }
10. }
8.
9. }
10. } else if (requestCode == REQUEST_2) {
11. if (resultCode == RESULT_OK) {
12.
13. } else if (resultCode == RESULT_CANCELED) {
14.
15. } else {
16. // do nothing
17. }
18. } else {
19. // do something
20. }
21. }
Pada realita sehari-hari, konsep yang barusan kita pelajari ini akan
bersinggungan dengan aplikasi native lainnya. Misalnya, jika aplikasi kita
membutuhkan gambar yang diambil dari kamera atau gallery photo. Tentu kita
mengharapkan nilai balik berupa alamat foto yang dapat diterima oleh activity
yang menjalankan. Begitu juga jika kita membutuhkan data kontak yang
berasal dari aplikasi phonebook bawaan peranti Android.
Untuk lebih dalam lagi silakan pelajari materi pada link berikut:
Intent Result
Intent Filters
Untuk source code materi bisa Anda unduh di tautan berikut ini :
https://github.com/dicodingacademy/a14-made-
labs1/tree/master/02.Intent/MyIntentApp
112
Android PDFViewer
Pada kali ini kita akan belajar membuat aplikasi untuk menampilkan file pdf
1. Tambahkan library pada build.gradle
implentation 'com.github.barteksc:android-pdf-viewer:2.8.2'
<com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdfView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
3. Buat Folder asset pada File -> New -> folder -> Assets Folder
4.
113
pdfView.fromAsset("rumpiit.pdf")
.enableSwipe(true) // allows to block changing pages using swipe
.swipeHorizontal(false)
.enableDoubletap(true)
.defaultPage(0)
// allows to draw something on the current page, usually visible in the middle of the
screen
.enableAnnotationRendering(false) // render annotations (such as comments, colors
or forms)
.password(null)
.scrollHandle(null)
.enableAntialiasing(true) // improve rendering a little bit on low-res screens
// spacing between pages in dp. To define spacing color, set view background
.spacing(0)
.load();
7. Run Aplikasi
114
SELESAI
115
Soucre :
https://www.dicoding.com/academies/14 Menjadi Android Developer
Expert
https://github.com/barteksc/AndroidPdfViewer Android Pdf Viewer