Penempatan di Android

Kesadaran Activity dan lifecycle bagi pelajar Kotlin.

Daftar isi

Banyak pelajar Kotlin menemukan bahasa ini melalui Android, karena Android menjadikan Kotlin sebagai bahasa resmi pengembangan aplikasinya. Topik ini membahas tempat kode Kotlin berada di dalam aplikasi Android, yaitu Activity sebagai penyusun layar beserta siklus hidup (lifecycle) dan rangkaian callback yang menyertainya. Setelah membacanya, urutan callback dari onCreate sampai onDestroy dikenali, begitu pula alasan kode aplikasi tidak boleh menganggap bahwa sebuah layar selalu terlihat.

Dari bytecode Kotlin ke aplikasi Android#

Android tidak menjalankan bytecode JVM secara langsung. Hasil kompilasi kotlinc diproses lebih lanjut oleh toolchain Android menjadi format DEX yang dimengerti runtime Android bernama ART. Prosesnya berlapis, tetapi kode sumber yang ditulis tetap Kotlin biasa, dan sebagian besar pustaka standar JVM yang digunakan sejauh ini juga tersedia di sana.

Kecocokannya tidak sepenuhnya satu banding satu. Sebagian API milik JVM tidak tersedia di Android, sehingga library JVM lama perlu dicek dahulu sebelum dipakai di ponsel. Sebaliknya, library Kotlin modern seperti coroutine menyasar Android sebagai salah satu target utamanya, sehingga kode yang ditulis dengan pola Kotlin pada umumnya berjalan mulus.

Pembagian kerjanya mirip program terminal, yaitu kode aplikasi ditulis Kotlin, sementara kerangka aplikasinya disediakan sistem operasi. Perbedaan terbesarnya ada pada sifat aplikasi Android yang berinteraksi dengan pengguna lewat layar, sehingga sistem operasi ikut mengatur kapan kode itu mulai dan berhenti bekerja. Aturan pengaturan itulah yang dibahas pada bagian-bagian berikut.

Activity sebagai layar aplikasi#

Activity adalah komponen aplikasi yang mewakili satu layar dengan antarmuka, misalnya layar daftar catatan atau layar pengaturan. Aplikasi biasanya terdiri atas beberapa Activity, dan satu di antaranya ditetapkan sebagai titik masuk ketika aplikasi dibuka. Kelas Activity bawaan Android tidak ditulis Kotlin, tetapi subclass-nya ditulis Kotlin, dan di situlah kode aplikasi berada.

kotlin Ilustrasi: Activity sederhana dengan onCreate
// tidak-dijalankan
class CatatanActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_catatan)
    }
}

Fungsi onCreate dipanggil sistem ketika Activity baru akan dibuat, dan di dalamnya kode aplikasi memanggil setContentView untuk menempelkan tata letak layar. Parameter savedInstanceState bertipe Bundle? membawa keadaan layar yang tersimpan bila Activity dibangun ulang, misalnya setelah perangkat diputar. Kelas R yang memuat R.layout.activity_catatan dihasilkan otomatis oleh build Android dari berkas resource proyek, sehingga kode cukup merujuknya tanpa menuliskan nama tampilan secara manual.

Subclass Activity juga tidak dibuat dengan pemanggilan konstruksi bebas, melainkan oleh sistem. Kode aplikasi tidak pernah memanggil CatatanActivity() secara langsung, karena sistem yang menentukan kelas mana yang tampil di depan, dan kode aplikasi cukup mendaftarkan kelasnya pada manifes aplikasi. Pola ini menjelaskan mengapa lifecycle menempati posisi penting, yaitu seluruh kehidupan Activity dipicu oleh sistem, bukan oleh keputusan kode aplikasi sendiri.

Urutan callback lifecycle#

Setiap Activity menjalani urutan panggilan yang tetap dari sistem, dan urutan itu disebut lifecycle. Sistem memanggil callback seperti onStart atau onPause pada waktu-waktu tertentu, sehingga kode aplikasi dapat menyiapkan dan melepas sesuatu tepat pada momennya. Diagram berikut memperlihatkan alur lengkapnya.

onCreate()onStart()onResume()onPause()onStop()onDestroy()onRestart()
Alur siklus hidup Activity
CallbackKejadian pemicuKegunaan yang lazim
onCreate()Activity dibuatMenyiapkan tampilan dan data awal
onStart()Activity menjadi terlihatMemulai hal yang terikat tampilan
onResume()Activity berada di depan dan menerima interaksiMemulai pembaruan yang butuh fokus layar
onPause()Fokus berpindah, misalnya dialog munculMenjeda pembaruan yang butuh fokus
onStop()Activity tidak terlihat sama sekaliMelepas resource yang berat
onDestroy()Activity dihancurkanPembersihan terakhir

Jalur yang tidak digambar lurus adalah onRestart. Callback itu dipanggil ketika Activity yang pernah berhenti kembali terlihat, dan urutannya dilanjutkan dari onStart, bukan dari awal. Pemisahan onRestart dari onCreate memberi kode kesempatan membedakan pembukaan yang benar-benar baru dari pembukaan yang sekadar kembali.

Kode yang peka lifecycle#

Kesalahan yang sering ditemui pemula adalah memulai pekerjaan di tempat yang kurang tepat. Memuat data di onCreate wajar, tetapi pembaruan berkala seperti penghitung waktu sebaiknya dimulai pada onResume dan dijeda pada onPause, karena hanya rentang itu layar benar-benar digunakan. Pekerjaan yang dibiarkan berjalan setelah layar tak terlihat memboroskan baterai, dan dapat berujung error ketika mencoba mengubah tampilan yang sudah tidak ada.

Kesadaran lifecycle juga menjelaskan pola yang ditemui di library Android modern. Banyak library menyediakan cara berlangganan yang otomatis berhenti mengikuti status Activity, dan coroutine pada Android punya scope yang terikat lifecycle untuk keperluan yang sama. Untuk tahap belajar, kebiasaan sederhananya cukup satu, yaitu setiap hal yang dimulai ketika layar tampil harus punya pasangan pemberhentian ketika layar berhenti.

Keadaan sederhana yang perlu bertahan melewati rotasi layar dapat disimpan melalui pasangan onSaveInstanceState dan parameter savedInstanceState yang sudah muncul pada Activity di atas. Sistem menyimpan Bundle itu di luar proses aplikasi, sehingga isinya selamat meskipun prosesnya dihentikan sementara oleh sistem. Batasannya juga jelas, yaitu hanya cocok untuk nilai kecil seperti pilihan tab atau isi pencarian, sedangkan data besar tetap disimpan di penyimpanan permanen.

Ringkasan#

  • Android mengubah bytecode hasil kotlinc menjadi format DEX dan menjalankannya di runtime ART, sehingga kode sumbernya tetap Kotlin biasa.
  • Activity mewakili satu layar aplikasi, dan subclass-nya yang ditulis Kotlin adalah tempat kode antarmuka berada.
  • Lifecycle menetapkan urutan callback dari onCreate sampai onDestroy, termasuk jalur onRestart untuk Activity yang kembali terlihat.
  • Pekerjaan yang terikat tampilan dimulai dan dihentikan mengikuti pasangan callback, karena sistem dapat menghentikan proses kapan saja saat aplikasi berada di latar belakang.

Referensi#