PPB I - Tugas 10 - Activity dan Intent - Aplikasi Dessert Clicker

 Activity dan Intent - Aplikasi Dessert Clicker

Link Github

    Pada pertemuan minggu ke-10 perkuliahan mata kuliah Pemrograman Perangkat Bergerak, kami membahas tentang Activity dan Intent dalam pengembangan aplikasi perangkat lunak berbasis Android. Sebagai tugas latihan, kami diminta menjalankan aplikasi Dessert Clicker dan mempelajari metode siklus proses Activity dan Intent.  Pada aplikasi ini, setiap kali pengguna mengetuk makanan penutup di layar, aplikasi akan "membeli" makanan penutup untuk pengguna. Aplikasi mengupdate nilai dalam tata letak untuk: 

  • Jumlah makanan penutup yang "dibeli"
  • Total pendapatan untuk makanan penutup "yang dibeli"

    Aplikasi ini berisi beberapa bug yang terkait dengan siklus proses Android. Misalnya, dalam keadaan tertentu, aplikasi mereset nilai makanan penutup ke 0. Dengan memahami siklus proses Android akan membantu kita dalam memahami penyebab terjadinya masalah ini, serta cara memperbaikinya. Untuk dapat menjalankan aplikasi Dessert Clicker, langkah pertama yang dilakukan adalah mendownload proyek awal dari GitHub, kemudian mengekstraknya dari zip. Setelah itu, buka proyek tersebut di Android Studio.

Mempelajari Metode Siklus Proses dan Menambahkan Logging dasar

    Untuk mengetahui aktivitas siklus proses Android, sebaiknya ketahui waktu pemanggilan berbagai metode siklus proses. Informasi ini membantu kita mengidentifikasi masalah yang terjadi di aplikasi Dessert Clicker. Cara mudah untuk menentukan informasi ini adalah dengan menggunakan fungsi logging Android. Logging memungkinkan kita menulis pesan singkat ke konsol saat aplikasi berjalan dan menggunakannya untuk melihat saat callback yang berbeda dipicu. Langkah yang dapat dilakuan adalah dengan memodifikasi file MainActivity.kt dan meng-override method dari setiap proses siklus Activity. Perubahannya dapat kita lihat pada kode dibawah ini.

    Class Log menulis pesan ke Logcat. Logcat merupakan konsol untuk mencatat pesan. Pesan dari Android tentang aplikasi Anda akan muncul di sini, termasuk pesan yang Anda kirim secara eksplisit ke log dengan metode Log.d() atau metode class Log lainnya. Ada tiga aspek penting dari instruksi Log:

  • Prioritas pesan log, yaitu seberapa penting pesan. Dalam hal ini, Log.v() mencatat pesan panjang ke dalam log. Metode Log.d() menulis pesan debug. Metode lain di class Log mencakup Log.i() untuk pesan informasi, Log.w() untuk peringatan, dan Log.e() untuk pesan error.
  • Log tag (parameter pertama), dalam hal ini adalah "MainActivity". Tag adalah string yang memungkinkan Anda menemukan pesan log dengan lebih mudah di Logcat. Tag biasanya berupa nama class.
  • Log pesan yang sebenarnya, yang disebut msg (parameter kedua), adalah string pendek, yang dalam kasus ini adalah "onCreate Called".

    Langkah selanjutnya adalah menjalankan aplikasi Dessert Clicker dan memeriksa log pada Logcat.

    Perhatikan bahwa kali ini, selain onCreate() dan onStart(), ada pesan log untuk callback siklus proses onResume(). Saat aktivitas dimulai dari awal, Anda akan melihat ketiga callback siklus proses ini dipanggil secara berurutan: 

  • onCreate() saat sistem membuat aplikasi.
  • onStart() membuat aplikasi terlihat di layar, tetapi pengguna belum dapat berinteraksi dengan aplikasi.
  • onResume() membawa aplikasi ke latar depan, dan pengguna kini dapat berinteraksi dengannya.

    Terlepas dari namanya, metode onResume() akan dipanggil saat startup meskipun tidak ada yang dapat dilanjutkan.

Mempelajari Kasus Penggunaan Siklus Proses

    Setelah menyiapkan aplikasi Dessert Clicker untuk logging, Kita siap untuk mulai menggunakan aplikasi dan mempelajari cara callback siklus proses dipicu.

Kasus penggunaan 1: Membuka dan menutup aktivitas

    Kita dapat memulai dengan kasus penggunaan yang paling dasar, yaitu memulai aplikasi untuk pertama kalinya lalu menutup aplikasi.

    Seperti yang Anda lihat, callback onCreate(), onStart(), dan onResume() dipanggil saat aktivitas dimulai pertama kali. Ketuk cupcake beberapa kali. Ketuk tombol Kembali yang ada di perangkat. Perhatikan dalam Logcat bahwa onPause() dan onStop() dipanggil dalam urutan tersebut.

    Dalam hal ini, menggunakan tombol Kembali akan menyebabkan aktivitas (dan aplikasi) dihapus dari layar dan dipindahkan ke bagian belakang tumpukan aktivitas. 

    OS Android mungkin menutup aktivitas jika kode memanggil metode finish() aktivitas secara manual atau jika pengguna menutup aplikasi secara paksa. Misalnya, pengguna dapat menutup atau keluar dari aplikasi secara paksa di layar Terbaru. OS mungkin juga dapat menghentikan aktivitas jika aplikasi tidak digunakan dalam waktu yang lama. Android melakukannya untuk menghemat masa pakai baterai dan untuk mengklaim kembali resource yang digunakan aplikasi sehingga tersedia untuk aplikasi lain. Ini hanyalah beberapa contoh alasan sistem Android menghancurkan aktivitas. Ada kasus tambahan saat sistem Android menghancurkan aktivitas tanpa memberikan peringatan.

Kasus penggunaan 2: Bernavigasi dari dan kembali ke aktivitas

    Pada langkah ini, kita dapat melihat siklus proses aktivitas saat aplikasi muncul di latar belakang dan kembali lagi ke latar depan. Saat aplikasi Dessert Clicker sedang berjalan, klik cupcake beberapa kali. Tekan tombol Layar Utama di perangkat dan amati Logcat di Android Studio. Saat Anda kembali ke layar utama, aplikasi tersebut tidak akan dimatikan, tetapi akan tetap berjalan di latar belakang. Perhatikan bahwa metode onPause() dan onStop() dipanggil.

    Saat onPause() dipanggil, aplikasi tidak lagi memiliki fokus. Setelah onStop(), aplikasi tidak lagi akan terlihat di layar. Meskipun aktivitas dihentikan, objek Activity masih ada di memori di latar belakang. Android OS belum menghancurkan aktivitas. Pengguna mungkin kembali ke aplikasi. Jadi karena alasan ini, Android menyimpan resource aktivitas Anda. Sekarang coba kembali buka aplikasi.

    Perhatikan bahwa di sini Anda melihat callback yang juga Anda lihat di Logcat saat Anda menekan tombol Layar Utama. onPause() dan onStop() dipanggil saat aplikasi beralih ke latar belakang, lalu onRestart(), onStart(), dan onResume() dipanggil saat aplikasi kembali.

    Metode ini dipanggil saat aplikasi berhenti dan berpindah ke latar belakang atau saat aplikasi dimulai ulang dan kembali ke latar depan. Jika Anda perlu melakukan beberapa pekerjaan di aplikasi selama proses ini, ganti metode callback siklus proses yang relevan.

Kasus penggunaan 3: Menyembunyikan sebagian aktivitas

    Saat aplikasi berpindah ke latar belakang, fokus akan hilang setelah onPause(), dan aplikasi tidak lagi terlihat setelah onStop(). Perbedaan antara fokus dan visibilitas itu penting. Ada kemungkinan aktivitas terlihat sebagian di layar, tetapi tidak memiliki fokus pengguna. Pada langkah ini, kita dapat melihat satu kasus saat aktivitas terlihat sebagian, tetapi tidak memiliki fokus pengguna. Dengan aplikasi Dessert Clicker masih berjalan, klik tombol Bagikan di kanan atas layar. Aktivitas berbagi muncul di paruh bawah layar, tetapi aktivitas tersebut juga masih terlihat di paruh atas. Periksa Logcat dan perhatikan bahwa hanya onPause() yang dipanggil.

    Dalam kasus penggunaan ini, onStop() tidak dipanggil karena aktivitas masih terlihat sebagian. Namun, aktivitas tersebut tidak mendapatkan fokus pengguna, dan pengguna tidak dapat berinteraksi dengannya—aktivitas "berbagi" yang ada di latar depan mendapatkan fokus pengguna. Kode apa pun yang berjalan di onPause() akan memblokir aplikasi lain agar tidak ditampilkan. Jadi, pastikan kode dalam mode onPause() selalu ringan. Misalnya, jika panggilan telepon masuk, kode dalam onPause() dapat menunda notifikasi panggilan masuk. Klik di luar dialog berbagi untuk kembali ke aplikasi, dan perhatikan bahwa onResume() dipanggil.

    Baik onResume() maupun onPause() harus memiliki fokus. Metode onResume() dipanggil saat aktivitas mendapatkan fokus, dan onPause() dipanggil saat aktivitas kehilangan fokus.

Mempelajari Perubahan Konfigurasi

    Perubahan konfigurasi terjadi saat status perangkat berubah secara drastis sehingga cara termudah bagi sistem untuk menyelesaikan perubahan adalah dengan benar-benar menonaktifkan dan membangun ulang aktivitas. Misalnya, jika pengguna mengubah bahasa perangkat, seluruh tata letak mungkin perlu diubah untuk mengakomodasi arah teks dan panjang string yang berbeda. Jika pengguna mencolokkan perangkat ke dok atau menambahkan keyboard fisik, tata letak aplikasi mungkin perlu memanfaatkan ukuran tampilan atau tata letak yang berbeda. Selain itu juga, jika orientasi perangkat berubah—jika perangkat diputar dari mode potret ke mode lanskap atau kembali sebaliknya—tata letak mungkin perlu diubah agar sesuai dengan orientasi baru. Mari lihat perilaku aplikasi dalam skenario ini.

    Rotasi layar adalah salah satu jenis perubahan konfigurasi yang menyebabkan aktivitas dihentikan dan dimulai ulang. Untuk menyimulasikan perubahan konfigurasi ini dan memeriksa efeknya, selesaikan langkah-langkah berikut. Kompilasikan dan jalankan aplikasi Anda. Klik cupcake beberapa kali dan perhatikan bahwa makanan penutup terjual dan total pendapatan tidak nol. Putar perangkat ke mode lanskap. Periksa output di Logcat.

    Perhatikan bahwa saat perangkat atau emulator memutar layar, sistem akan memanggil semua callback siklus proses untuk menghentikan aktivitas. Kemudian, saat aktivitas dibuat ulang, sistem akan memanggil semua callback siklus proses untuk memulai aktivitas. Saat perangkat diputar, dan aktivitas dihentikan serta dibuat ulang, aktivitas dimulai ulang dengan nilai default—gambar hidangan penutup, jumlah makanan penutup yang terjual, dan total pendapatan direset ke nol.

    Saat status aplikasi berubah, rekomposisi dijadwalkan. Rekomposisi adalah saat Compose mengeksekusi fungsi composable yang statusnya mungkin telah berubah dan membuat UI yang diupdate. Komposisi diupdate untuk mencerminkan perubahan ini. Agar Compose dapat melacak dan memicu rekomposisi, perlu mengetahui kapan status telah berubah. Untuk menunjukkan kepada Compose bahwa objek harus melacak status objek, objek harus berjenis State atau MutableState. Jenis State tidak dapat diubah dan hanya dapat dibaca. Jenis MutableState dapat diubah dan memungkinkan baca dan tulis.

    Untuk membuat variabel revenue yang dapat diubah, Anda mendeklarasikannya menggunakan mutableStateOf. 0 adalah nilai default awalnya. Meskipun Compose mengingat status pendapatan selama rekomposisi, Compose tidak mempertahankan status ini selama perubahan konfigurasi. Agar Compose dapat mempertahankan status selama perubahan konfigurasi, kita harus menggunakan rememberSaveable. 

        Langkah selanjutnya yang dapat dilakukan adalah memodifikasi composable DessertClickerApp pada file MainActivity.kt, mengupdate grup yang terdiri dari lima variabel yang saat ini menggunakan remember untuk rememberSaveable. Perubahannya dapat kita lihat pada kode dibawah ini.

    Kompilasikan dan jalankan aplikasi Anda. Klik cupcake beberapa kali dan perhatikan bahwa makanan penutup terjual dan total pendapatan tidak nol. Putar perangkat ke mode lanskap.

    Perhatikan bahwa setelah aktivitas dihancurkan dan dibuat ulang, gambar makanan penutup, makanan penutup yang terjual, dan total pendapatan dipulihkan ke nilai sebelumnya.

Arief Badrus Sholeh
5025201228
Pemrograman Perangkat Bergerak I
2023/2024

Komentar