Tugas 10: Memahami Siklus Proses Aktivitas di Android melalui Aplikasi Dessert Clicker

Nama     : Helsa Nesta Dhaifullah
NRP       : 5025201005
Kelas      : PPB I - 2024

Tentang Siklus Aktivitas

Apakah kalian tahu tentang siklus aktivitas dalam pengembangan Android? Saat aplikasi aktif, aktivitas berpindah-pindah dan bisa kembali ke berbagai status. Di Android, aktivitas adalah titik awal interaksi dengan pengguna. Siklus hidup aktivitas mencakup mulai dari pembuatan hingga penghancuran, di mana sistem mengambil kembali sumber daya. Penting bagi pengembang untuk memahami siklus hidup aktivitas agar aplikasi responsif dan efisien.

Ringkasan Aplikasi

Dalam tutorial kali ini, kalian akan menggunakan aplikasi awal yang disebut Dessert Clicker. Di Dessert Clicker, setiap kali kalian mengetuk makanan penutup di layar, aplikasi akan "membeli" makanan penutup untuk kalian. Aplikasi mengupdate nilai dalam tata letak untuk:
  • Jumlah makanan penutup yang "dibeli"
  • Total pendapatan untuk makanan penutup "yang dibeli"
Pratinjau Aplikasi Dessert Clicker

Aplikasi ini berisi beberapa bug yang terkait dengan siklus proses Android. Misalnya, dalam keadaan tertentu, aplikasi mereset nilai makanan penutup ke 0. Memahami siklus proses Android akan membantu kalian memahami penyebab terjadinya masalah ini, serta cara memperbaikinya.

Sebelum masuk ke tutorial, kalian dapat mendownload kode awal yang akan kita gunakan untuk membuka aplikasi Dessert Clicker.

Download Zip Kode Awal

Belajar Metode Siklus Proses dengan Logging Dasar

Siklus aktivitas melibatkan status yang dilewati dari awal hingga penghancuran, dengan titik awal biasanya adalah metode main(). Untuk aktivitas Android, titik awalnya adalah onCreate(). Pada perubahan status, callback siklus aktivitas dipanggil untuk memungkinkan perubahan perilaku. Android menyediakan serangkaian callback yang dapat diganti untuk merespons perubahan status, memungkinkan penyesuaian perilaku aktivitas. Mengetahui kapan dan bagaimana callback dipanggil penting, meskipun dapat membingungkan. Dalam tutorial ini, tujuannya adalah memahami siklus aktivitas dan penggunaan callback dengan logging.
Siklus Proses Aktivitas Android

Periksa metode onCreate() dan tambahkan logging

Kalian pasti familiar dengan metode onCreate() dari siklus aktivitas karena sering menggunakannya sebelumnya; ini wajib dalam setiap aktivitas. Di onCreate(), kalian bisa melakukan inisialisasi aktivitas, seperti memanggil setContent() untuk menetapkan tata letak UI. Method onCreate() dipanggil sekali oleh sistem operasi setelah inisialisasi aktivitas, menandai pembuatan objek Activity baru di memori.
  1. Jalankan aplikasi Dessert Clicker, lalu ketuk gambar makanan penutup beberapa kali. Perhatikan perubahan nilai dari Makanan penutup yang terjual dan jumlah total uang dalam dolar.
  2. Buka MainActivity.kt dan periksa metode onCreate().
  3. Tambahkan konstanta berikut di tingkat teratas MainActivity.kt, di atas deklarasi class class MainActivity.
  4. private const val TAG = "MainActivity"
  5. Dalam metode onCreate(), tepat setelah panggilan ke super.onCreate(), tambahkan baris berikut serta jangan lupa untuk impor Log.
    import android.util.Log
    ...
    Log.d(TAG, "onCreate Called")
    Class Log digunakan untuk menulis pesan ke Logcat, yang merupakan konsol untuk mencatat pesan. Di sini, pesan Android tentang aplikasi kalian dan pesan yang kalian kirim secara eksplisit ke log menggunakan metode Log.d() atau metode lainnya akan ditampilkan.

    Instruksi Log memiliki tiga aspek penting:
    📌 Prioritas Pesan: Log.v() untuk pesan panjang, Log.d() untuk debug, Log.i() untuk informasi, Log.w() untuk peringatan, dan Log.e() untuk error.
    📌 Log Tag: Parameter pertama, sering kali nama class, membantu identifikasi pesan.
    📌 Log Pesan: Parameter kedua, berisi pesan yang akan dicatat.
    Format Class Log
  6. Kompilasi dan jalankan aplikasi Dessert Clicker. Di bagian bawah layar Android Studio, klik tab Logcat.
  7. Di jendela Logcat, ketik tag:MainActivity pada kolom penelusuran.

    Hasil Logcat untuk Pemanggilan Metode onCreate()

Terapkan Metode onStart()

Metode siklus proses onStart() dipanggil setelah onCreate(), menandai saat aktivitas menjadi terlihat di layar. Berbeda dengan onCreate() yang hanya terjadi sekali, onStart() dapat dipanggil berkali-kali. Perlu diperhatikan bahwa onStart() berhubungan erat dengan onStop(), di mana saat pengguna meninggalkan aplikasi, aktivitas akan dihentikan dan tidak terlihat lagi di layar.
  1. Di Android Studio, dengan MainActivity.kt terbuka dan kursor ada di dalam class MainActivity, pilih Code > Override Methods... atau tekan Control+O. Dialog akan muncul dan menampilkan daftar panjang berisi semua metode yang dapat Anda ganti di class ini.
    Pilihan Override/Implement dari Class MainActivity
  2. Pilih onStart() dari daftar, lalu klik OK untuk menyisipkan kode pengganti boilerplate. Kode terlihat seperti contoh berikut:
  3. override fun onStart() {
        super.onStart()
    }
  4. Di dalam metode onStart(), tambahkan pesan log:
  5. override fun onStart() {
        super.onStart()
        Log.d(TAG, "onStart Called")
    }
  6. Kompilasi dan jalankan aplikasi Dessert Clicker, dan buka panel Logcat.
  7. Ketikkan tag:MainActivity di kolom penelusuran untuk memfilter log. Perhatikan bahwa metode onCreate() dan onStart() dipanggil satu demi satu, dan aktivitas Anda akan terlihat di layar.
  8. Tekan tombol Layar Utama di perangkat, lalu gunakan layar Terbaru untuk kembali ke aktivitas. Perhatikan bahwa aktivitas dilanjutkan dari tempat terakhirnya, dengan semua nilai yang sama, dan onStart() dicatat dalam log untuk kedua kalinya di Logcat. Perhatikan juga bahwa metode onCreate() tidak dipanggil lagi.

    Hasil Logcat untuk Pemanggilan Metode onStart()

Menambahkan laporan log lainnya

  1. Ganti sisa metode siklus proses di MainActivity Anda dan tambahkan laporan log untuk setiap metode, seperti yang ditunjukkan dalam kode berikut:
  2. override fun onResume() {
        super.onResume()
        Log.d(TAG, "onResume Called")
    }
    
    override fun onRestart() {
        super.onRestart()
        Log.d(TAG, "onRestart Called")
    }
    
    override fun onPause() {
        super.onPause()
        Log.d(TAG, "onPause Called")
    }
    
    override fun onStop() {
        super.onStop()
        Log.d(TAG, "onStop Called")
    }
    
    override fun onDestroy() {
        super.onDestroy()
        Log.d(TAG, "onDestroy Called")
    }
  3. Kompilasi dan jalankan lagi aplikasi Dessert Clicker dan periksa Logcat.
    Perhatikan bahwa kali ini, selain onCreate() dan onStart(), ada pesan log untuk callback siklus proses onResume().

    Hasil Logcat untuk Pemanggilan Metode onStart() dan 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.

Mempelajari kasus penggunaan siklus proses

Kasus penggunaan 1: Membuka dan menutup aktivitas

Kita mulai dengan kasus penggunaan yang paling dasar, yaitu saat kalian membuka aplikasi untuk pertama kalinya dan kemudian menutupnya.
  1. Kompilasi dan jalankan aplikasi Dessert Clicker jika belum berjalan. Seperti yang Anda lihat, callback onCreate(), onStart(), dan onResume() dipanggil saat aktivitas dimulai pertama kali.
  2. Ketuk cupcake beberapa kali.
  3. 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.

    Hasil Logcat untuk Pemanggilan Metode onPause() dan onStop()

Kasus penggunaan 2: Bernavigasi dari dan kembali ke aktivitas

Setelah membuka dan menutup aplikasi, kalian telah melihat sebagian besar status siklus proses saat aktivitas dibuat dan ditutup. Saat pengguna berinteraksi dengan perangkat Android, aktivitas dapat dipindahkan ke latar belakang atau berada di latar depan saat terlihat di layar. Saat kembali ke aplikasi, aktivitas akan dimulai ulang, yang merupakan bagian dari siklus proses aplikasi yang terlihat. Untuk mengoptimalkan penggunaan sumber daya dan masa pakai baterai, Anda dapat menggunakan siklus proses Activity dan callback untuk mengatur operasi yang sedang berlangsung saat aplikasi berpindah antara latar belakang dan latar depan.
  1. Saat aplikasi Dessert Clicker sedang berjalan, klik cupcake beberapa kali.
  2. 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.
    Hasil Logcat untuk Kasus Menutup Aplikasi dengan Kembali ke Layar Utama

    Saat onPause(), aplikasi kehilangan fokus, dan setelah onStop(), aplikasi tidak lagi terlihat di layar. Meskipun dihentikan, objek Activity tetap ada di memori, memungkinkan pengguna untuk kembali ke aplikasi. Android menyimpan resource aktivitas Anda untuk memfasilitasi pengembalian ke aktivitas tersebut.
  3. Gunakan layar Terbaru untuk kembali ke aplikasi seperti gambar di bawah.
    Pratinjau Layar Terbaru saat Aplikasi Belum Ditutup
    Perhatikan dalam Logcat bahwa aktivitas dimulai ulang dengan onRestart() dan onStart(), lalu dilanjutkan dengan onResume().
    Hasil Logcat untuk Kasus Kembali Masuk ke Aplikasi dari Layar Utama

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, Anda melihat satu kasus saat aktivitas terlihat sebagian, tetapi tidak memiliki fokus pengguna.
  1. Dengan aplikasi Dessert Clicker masih berjalan, klik tombol Bagikan di kanan atas layar.

    Pratinjau Aplikasi saat Button "Bagikan" Ditekan

  2. Periksa Logcat dan perhatikan bahwa hanya onPause() yang dipanggil.

    Hasil Logcat untuk Kasus Aplikasi Terlihat di Layar Namun Kehilangan Fokus Pengguna

  3. Klik di luar dialog berbagi untuk kembali ke aplikasi, dan perhatikan bahwa onResume() dipanggil.

Mempelajari perubahan konfigurasi

Perubahan konfigurasi menyebabkan onDestroy() dipanggil

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:
  1. Kompilasikan dan jalankan aplikasi Anda.
  2. Pastikan kunci rotasi layar di emulator dinonaktifkan.
  3. Putar perangkat atau emulator ke mode lanskap. Anda dapat memutar emulator ke kiri atau kanan menggunakan tombol rotasi.
  4. Periksa Logcat dan pahami bahwa saat dihentikan, aktivitas akan memanggil onPause(), onStop(), dan onDestroy(), dalam urutan tersebut.

    Hasil Logcat untuk Kasus Perubahan Konfigurasi (Rotasi Layar)

Kehilangan data di rotasi perangkat

  1. Kompilasi dan jalankan aplikasi Anda, lalu buka Logcat.
  2. Klik cupcake beberapa kali dan perhatikan bahwa makanan penutup terjual dan total pendapatan tidak nol.
  3. Pastikan kunci rotasi layar di emulator dinonaktifkan.
  4. Putar perangkat atau emulator ke mode lanskap. Anda dapat memutar emulator ke kiri atau kanan menggunakan tombol rotasi.
  5. Periksa output di Logcat.

    Hasil Logcat untuk Kasus Kehilangan Data Akibat Perubahan Konfigurasi (Rotasi Layar)
Berikut adalah pratinjau video ketika aplikasi kehilangan data karena perubahan konfigurasi (rotasi layar).

Menggunakan rememberSaveable untuk menyimpan nilai di seluruh perubahan konfigurasi

Kalian menggunakan rememberSaveable untuk menyimpan nilai yang diperlukan jika Android OS menghancurkan dan membuat ulang aktivitas. Untuk menyimpan nilai selama rekomposisi, kalian perlu menggunakan remember. Gunakan rememberSaveable untuk menyimpan nilai selama rekomposisi dan perubahan konfigurasi.
  1. Di MainActivity, update grup yang terdiri dari lima variabel yang saat ini menggunakan remember untuk rememberSaveable.

    Potongan Kode Hasil Perubahan "Remember" dengan "RememberSaveable"

  2. Kompilasikan dan jalankan aplikasi Anda.
  3. Klik cupcake beberapa kali dan perhatikan bahwa makanan penutup terjual dan total pendapatan tidak nol.
  4. Putar perangkat atau emulator ke mode lanskap.
  5. Perhatikan bahwa setelah aktivitas dihancurkan dan dibuat ulang, gambar makanan penutup, makanan penutup yang terjual, dan total pendapatan dipulihkan ke nilai sebelumnya.
Berikut adalah pratinjau video ketika aplikasi sudah dapat menyimpan data mesikipun terjadi perubahan konfigurasi (rotasi layar).

Mendapatkan Kode Solusi

Untuk melihat kode secara lebih lengkap dan jelas, Anda dapat menggunakan perintah git ini:
$ git clone https://github.com/helsanesta/DessertClicker-AndroidApp.git
Atau,kalian dapat mengunjungi link github berikut.

          Komentar

          Postingan Populer