PEMROGRAMAN UNTUK
PERANGKAT BERGERAK 1
1. Overview ........................................................................................................................................... 2
2. Getting Started.................................................................................................................................. 3
3. Task ................................................................................................................................................... 3
4. Summary ......................................................................................................................................... 12
Modul 13: Activity & Fragment Lifecycle
1. Overview
Pada modul kali ini kita akan coba memahami siklus hidup (lifecycle) dari activity & fragment. Hal ini
penting, karena kita perlu mengetahui kapan komponen aplikasi seperti animasi, audio, atau sensor
harus dijalankan. Contoh, ketika seseorang sedang bermain game, lalu keluar sebentar dari aplikasi
dengan menekan tombol Home, musik latar game tersebut harus mati secara otomatis, baru
kemudian hidup lagi setelah orang tersebut kembali ke game-nya.
Pada kasus lain, ketika terjadi perubahan orientasi layar (rotate screen), state dari aplikasi secara
default akan kembali seperti saat aplikasi pertama kali dijalankan. Bayangkan dalam aplikasi simulasi
ujian yang sudah menampilkan nomor ke-10, dan pengguna harus mengulang kembali mengerjakan
dari nomor 1 ketika rotate screen terjadi secara tidak sengaja. Tentu ini akan membuat jengkel
pengguna aplikasi tersebut, dan ini tentunya tidak kita inginkan.
Akan tercipta sebuah branch baru di project kita. Task-task pada modul harus dikerjakan di branch ini.
3. Task
3.1. Mempelajari daur hidup Activity
Di task ini, kita akan mempelajari daur hidup activity dengan menggunakan Log. Logging merupakan
proses memunculkan catatan/pesan pendek pada Logcat ketika aplikasi berjalan. Hal ini sudah pernah
kita lakukan beberapa kali pada modul sebelumnya dengan menggunakan keyword Log.d. Langkah
pertama yang kita lakukan yaitu menambahkan Log pada method onCreate:
Informasi ini muncul ketika method onCreate dipanggil, sedangkan pemanggilan dari method ini
berkaitan dengan daur hidup Activity yang diperlihatkan seperti berikut.
Dengan memperhatikan gambar di atas, dapat kita pahami bahwa tulisan “onCreate dijalankan” pada
log muncul karena method onCreate dieksekusi saat project di-run. Daur hidup ini terdiri dari stage
initialized → created → started → resumed → started → created → destroyed. Setiap staging ini
diwakili oleh method-nya masing-masing mulai dari onCreate hingga onDestroyed.
Secara default, saat project Android Studio pertama kali dibentuk, hanya method onCreate yang
muncul, sedangkan method lainnya tidak tertulis pada MainActivity.kt. Method-method lifecycle ini
dapat kita tambahkan dengan cara melakukan penulisan method override. Berikutnya, kita akan
membuat method onStart pada MainActivity.kt, dan menuliskan log “onStart Called” dan memastikan
tulisan tersebut muncul pada Logcat.
Caranya, tekan Ctrl+O pada keyboard, cari method onStart() dan klik Enter. Setelah method onStart
terbentuk, tambahkan kode log dengan tulisan “onStart Called”. Lakukan hal yang sama untuk empat
method lifecycle lainnya. Kode akhir yang terbentuk pada MainActivity.kt setelah semua beres
ditunjukkan pada kode di bawah ini.
Ya, benar.. Tiga method lifecycle lainnya baru akan muncul setelah kita menekan tombol Back dan
keluar dari aplikasi. Berikut screenshot Logcat-nya:
Sekarang kita akan melakukan percobaan lain. Jalankan kembali ke aplikasi, maka akan terlihat tiga
method lifecycle awal. Apa yang terjadi ketika pengguna keluar dari aplikasi dengan cara menekan
tombol Home? Method lifecycle apa yang tidak dipanggil? Ada yang tahu kenapa bisa begitu? Hehe..
Masih menyambung percobaan sebelumnya, sekarang kita lihat apa yang terjadi ketika pengguna
masuk ke aplikasi melalui menu Recent Apps. Coba cek Logcat, method lifecycle apa yang tidak
dipanggil? Adakah yang tahu kenapa bisa begitu?
Sebagai bantuan, kamu dapat membuat tabel pengamatan seperti contoh di bawah ini:
Pertama kali … …
dijalankan dan
ditutup secara
normal
Pertama kali … …
dijalankan & ditutup
dengan menekan
home button
Aplikasi dijalankan … …
dari Recent App &
ditutup dengan
menekan tombol
Back
Pertama kali … …
dijalankan & dirotasi
<tuliskan … …
kemungkinan atau
skenario lain jika
ada>
Menarik bukan..? Setelah selesai mengisi tabel di atas, silahkan lakukan commit sesuai judul task ini.
Jika sudah sama, cobalah keluar dari aplikasi. Apakah method-method lifecycle lainnya muncul?
Lakukan beberapa percobaan sebagaimana yang telah kita lakukan di task 3.1, lalu catat hasilnya di
tabel pengamatan. Bandingkan juga method lifecycle Fragment dengan Activity, siapa yang akan
dipanggil terlebih dahulu? Setelah selesai meng-explore daur hidup Fragment dan Activity, silahkan
lakukan commit dengan commit message sesuai dengan judul task ini.
Pada package baru di atas, klik kanan lalu pilih New → Kotlin Class/File, lalu masukkan nama MyTimer.
Di kelas ini kita akan membuat dua buah method, yaitu startTimer dan stopTimer. Sesuai namanya,
startTimer akan memulai timer, kemudian memunculkan waktu yang berjalan pada log setiap detik.
Adapun method stopTimer akan menghentikan timer yang sedang berjalan tersebut. Kode akhir kelas
diperlihatkan sebagai berikut.
class MyTimer {
fun startTimer() {
runnable = Runnable {
secondsCount++
Log.i("Timer", "Detik ke: $secondsCount")
handler.postDelayed(runnable, 1000)
}
handler.postDelayed(runnable, 1000)
}
fun stopTimer() {
handler.removeCallbacks(runnable)
}
}
Gunakan method dari class MyTimer pada MainActivity.kt dengan menuliskan objeknya sebagai
property class, dan memanggil konstruktornya pada method onCreate.
myTimer = MyTimer()
Log.i("MainActivity", "onCreate dipanggil.")
}
...
}
Berikutnya, kita harus memperkirakan di mana tepatnya pemanggilan startTimer dan stopTimer
diberikan. Bayangkan timer adalah animasi/audio/sensor yang berjalan pada sebuah aplikasi. Animasi
ini sebaiknya diputar ketika aplikasi sedang dalam kondisi on screen (terlihat oleh pengguna) dan
dihentikan ketika aplikasi dalam kondisi off screen (tidak terlihat oleh pengguna). Sebagai percobaan
awal, kita akan mencoba melakukan pemanggilan seperti ini.
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
myTimer = MyTimer()
myTimer.startTimer()
Log.i("MainActivity", "onCreate dipanggil.")
}
...
override fun onDestroy() {
Log.i("MainActivity", "onDestroy dipanggil.")
myTimer.stopTimer()
super.onDestroy()
}
Test case #2, bagaimana jika pengguna keluar dengan menekan tombol Home? Untuk mengujinya,
jalankan kembali aplikasi. Kita akan melihat timer berjalan di Logcat. Sekarang tekan tombol Home.
Aplikasi telah tertutup dan masuk ke Recent Apps. Namun perhatikan Logcat nya.. Ternyata timer kita
masih tetap berjalan. Test case #2 gagal. Kode harus diperbaiki.
Sesuai percobaan di task 3.1, kita tahu bahwa ketika pengguna menekan tombol Home, method
onDestroy tidak akan dijalankan. Method lifecycle yang dipanggil terakhir adalah onStop. Oleh karena
itu, kita dapat menaruh kode pemanggilan stopTimer pada method onStop. Pindahkan kode sehingga
menjadi seperti ini, jalankan kembali aplikasi, lalu cek Logcat.
...
override fun onStop() {
Log.i("MainActivity", "onStop dipanggil.")
myTimer.stopTimer()
super.onStop()
}
Sekarang kita bisa lihat bahwa ketika aplikasi dijalankan, timer akan berjalan. Ketika kita menekan
tombol Home, timer akan berhenti. Apakah aplikasi kita sudah benar? Untuk menjawabnya, coba
perhatikan apa yang terjadi ketika pengguna masuk ke aplikasi lagi melalui menu Recent Apps. Timer
kita ternyata tidak berjalan kembali seperti seharusnya
Hal ini dikarenakan startTimer dipanggil di onCreate, sedangkan ketika pengguna masuk kembali ke
aplikasi melalui Recent Apps, method lifecycle tersebut tidak dipanggil. Sebagai solusi dari masalah
ini, pindahkan kode startTimer pada method onStart seperti ini.
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
myTimer = MyTimer()
myTimer.startTimer()
Log.i("MainActivity", "onCreate dipanggil.")
}
Run project, dan cek di bagian Log, akan terlihat timer yang berjalan. Tekan tombol Home, maka timer
akan berhenti. Masuk lagi ke aplikasi melalui Recent Apps, maka timer akan berjalan kembali. Jadi
aplikasi kita sudah benar sekarang. Silahkan lakukan commit dengan commit message berupa judul
dari task 3.3 ini, kemudian push ke repository praktikum.
4. Summary
Pada modul kali ini kita telah mengetahui lifecycle atau daur hidup dari Activity dan Fragment. Kita
juga sudah mempraktekkan penempatan background proses (timer) yang salah akan menyebabkan
proses tersebut tetap berjalan walaupun aplikasi sudah tidak digunakan lagi. Ini tentunya akan
membebani smartphone pengguna sehingga kurang baik. Oleh sebab itu, sebagai developer, kita
harus memahami lifecycle, sehingga aplikasi yang kita kembangkan akan berjalan seperti yang
diharapkan oleh pengguna kita, apapun kondisinya