Panduan Android Kotlin di developer.android.com/kotlin adalah pintu masuk resmi Google untuk pengembangan Android dengan Kotlin. Sejak 2019 Kotlin menjadi bahasa utama Android, dan seluruh dokumentasi Jetpack terbaru ditulis dengan contoh Kotlin terlebih dahulu. Pada chapter ini kita memetakan konsep utama yang sering muncul di panduan Android, mendemokan activity lifecycle dan ViewModel dengan simulasi JVM, serta menunjukkan stack Jetpack modern.

Konsep Inti Android #

Berikut tujuh konsep yang menjadi inti pengembangan Android modern:

KonsepPeran
Activity lifecycleState mesin CREATED → STARTED → RESUMED → PAUSED → STOPPED → DESTROYED
ViewModelMenyimpan state UI yang selamat dari rotasi layar
StateFlow / LiveDataObservable state yang UI observe untuk re-render
IntentPesan untuk pindah activity atau memicu action sistem
Jetpack ComposeUI deklaratif menggantikan XML layout
Navigation ComposeType-safe navigation antar composable
Room / DataStore / RetrofitPersistence dan networking

Demo Lifecycle, ViewModel, dan Intent #

Karena Android SDK tidak tersedia di JVM biasa, cuplikan berikut memodelkan tiga konsep utama sebagai class Kotlin murni: activity lifecycle sebagai enum + state machine, ViewModel sebagai class dengan property, dan intent sebagai data class. Perilaku dan urutan event sama dengan implementasi Android nyata:

kotlin
// panduan_android.kt
// Tour singkat Panduan Android Kotlin:
// https://developer.android.com/kotlin
//
// Mendemokan konsep yang sering muncul di pengembangan Android dengan Kotlin
// (tanpa Android SDK — dijalankan di JVM biasa).

// 1. Activity Lifecycle — simulasi state mesin status
enum class ActivityState {
    CREATED, STARTED, RESUMED, PAUSED, STOPPED, DESTROYED
}

class ActivitySimulasi {
    var state: ActivityState = ActivityState.CREATED
        private set

    fun onCreate()    { state = ActivityState.CREATED;  println("  onCreate() -> $state") }
    fun onStart()     { state = ActivityState.STARTED;  println("  onStart() -> $state") }
    fun onResume()    { state = ActivityState.RESUMED; println("  onResume() -> $state") }
    fun onPause()     { state = ActivityState.PAUSED;  println("  onPause() -> $state") }
    fun onStop()      { state = ActivityState.STOPPED; println("  onStop() -> $state") }
    fun onDestroy()   { state = ActivityState.DESTROYED; println("  onDestroy() -> $state") }
}

// 2. ViewModel — menyimpan state UI yang selamat dari rotasi
class PenggunaViewModel {
    var nama: String = ""
        private set
    var skor: Int = 0
        private set

    fun setNama(n: String) { nama = n }
    fun tambahSkor(n: Int = 1) { skor += n }
}

// 3. LiveData/StateFlow simulasi — observable state
class CounterMutable {
    private var nilai: Int = 0
    private val observers = mutableListOf<(Int) -> Unit>()

    fun observe(block: (Int) -> Unit) {
        observers.add(block)
    }

    fun setNilai(n: Int) {
        nilai = n
        observers.forEach { it(nilai) }
    }
}

// 4. Intent (pindah activity) — simulasi
data class Intent(val action: String, val extras: Map<String, String> = emptyMap())

class NavigasiActivity {
    private val stack = mutableListOf<String>("MainActivity")

    fun startActivity(intent: Intent) {
        stack.add(intent.action)
        println("  Navigasi ke ${intent.action}, extras=${intent.extras}")
    }

    fun back(): String? {
        if (stack.size > 1) {
            stack.removeAt(stack.lastIndex)
            println("  Back ke ${stack.last()}")
        }
        return stack.lastOrNull()
    }
}

fun main() {
    println("=== Panduan Android dengan Kotlin ===")
    println("Sumber: https://developer.android.com/kotlin")
    println()

    println("--- 1. Activity Lifecycle ---")
    val act = ActivitySimulasi()
    act.onCreate()
    act.onStart()
    act.onResume()
    act.onPause()
    act.onStop()
    act.onDestroy()

    println()
    println("--- 2. ViewModel state ---")
    val vm = PenggunaViewModel()
    vm.setNama("Budi")
    vm.tambahSkor(5)
    vm.tambahSkor(3)
    println("  ViewModel: nama=${vm.nama}, skor=${vm.skor}")
    println("  (State selamat dari rotasi layar)")

    println()
    println("--- 3. Observable state (mirip StateFlow) ---")
    val counter = CounterMutable()
    counter.observe { println("  Observer 1: nilai = $it") }
    counter.observe { println("  Observer 2: nilai = $it (x2 = ${it * 2})") }
    counter.setNilai(10)
    counter.setNilai(25)

    println()
    println("--- 4. Intent dan navigasi ---")
    val nav = NavigasiActivity()
    nav.startActivity(Intent("DetailActivity", mapOf("id" to "42")))
    nav.startActivity(Intent("EditActivity", mapOf("id" to "42", "mode" to "edit")))
    nav.back()
    nav.back()

    println()
    println("--- 5. Stack Android modern ---")
    val stack = listOf(
        "Jetpack Compose   -> UI deklaratif (replace XML layout)",
        "ViewModel         -> state yang selamat dari rotasi",
        "Navigation Compose -> type-safe navigation",
        "Room              -> ORM SQLite dengan @Dao",
        "Hilt              -> dependency injection",
        "Retrofit          -> HTTP client dengan @GET, @POST",
        "Coroutines        -> async programming (Dispatchers.Main)",
        "DataStore         -> pengganti SharedPreferences (async)"
    )
    stack.forEach { println("  $it") }

    println()
    println("--- 6. Resource Android ---")
    val res = listOf(
        "res/layout/         -> XML layout (legacy)",
        "res/values/strings.xml -> string terjemahan",
        "res/drawable/       -> gambar (PNG, Vector)",
        "res/mipmap/         -> app icon",
        "AndroidManifest.xml -> deklarasi komponen app"
    )
    res.forEach { println("  $it") }

    println()
    println("--- 7. Cara belajar Android Kotlin ---")
    val cara = listOf(
        "1. Install Android Studio (bundled Kotlin + emulator)",
        "2. Buat project 'Empty Compose Activity'",
        "3. Pelajari Jetpack Compose (UI modern)",
        "4. Tambahkan ViewModel + Room untuk state persistence",
        "5. Tambahkan Retrofit untuk network call",
        "6. Deploy ke device fisik via USB debugging"
    )
    cara.forEach { println("  $it") }
}

Output yang Dihasilkan:

text
=== Panduan Android dengan Kotlin ===
Sumber: https://developer.android.com/kotlin

--- 1. Activity Lifecycle ---
  onCreate() -> CREATED
  onStart() -> STARTED
  onResume() -> RESUMED
  onPause() -> PAUSED
  onStop() -> STOPPED
  onDestroy() -> DESTROYED

--- 2. ViewModel state ---
  ViewModel: nama=Budi, skor=8
  (State selamat dari rotasi layar)

--- 3. Observable state (mirip StateFlow) ---
  Observer 1: nilai = 10
  Observer 2: nilai = 10 (x2 = 20)
  Observer 1: nilai = 25
  Observer 2: nilai = 25 (x2 = 50)

--- 4. Intent dan navigasi ---
  Navigasi ke DetailActivity, extras={id=42}
  Navigasi ke EditActivity, extras={id=42, mode=edit}
  Back ke DetailActivity
  Back ke MainActivity

--- 5. Stack Android modern ---
  Jetpack Compose   -> UI deklaratif (replace XML layout)
  ViewModel         -> state yang selamat dari rotasi
  Navigation Compose -> type-safe navigation
  Room              -> ORM SQLite dengan @Dao
  Hilt              -> dependency injection
  Retrofit          -> HTTP client dengan @GET, @POST
  Coroutines        -> async programming (Dispatchers.Main)
  DataStore         -> pengganti SharedPreferences (async)

--- 6. Resource Android ---
  res/layout/         -> XML layout (legacy)
  res/values/strings.xml -> string terjemahan
  res/drawable/       -> gambar (PNG, Vector)
  res/mipmap/         -> app icon
  AndroidManifest.xml -> deklarasi komponen app

--- 7. Cara belajar Android Kotlin ---
  1. Install Android Studio (bundled Kotlin + emulator)
  2. Buat project 'Empty Compose Activity'
  3. Pelajari Jetpack Compose (UI modern)
  4. Tambahkan ViewModel + Room untuk state persistence
  5. Tambahkan Retrofit untuk network call
  6. Deploy ke device fisik via USB debugging

Perhatikan empat kelompok yang dicetak: activity lifecycle lengkap dari CREATED ke DESTROYED, ViewModel yang menyimpan nama dan skor, observable state yang mengabari dua observer tiap perubahan, dan navigasi activity dengan back stack.

Stack Jetpack Modern #

Pengembangan Android hari ini tidak lepas dari Jetpack. Compose menggantikan XML untuk UI, ViewModel menyimpan state lintas rotasi, Room memetakan tabel SQLite ke data class Kotlin, Hilt menyuntikkan dependency di compile-time, Retrofit mempermudah HTTP, dan Coroutines mengatur asinkron. DataStore menggantikan SharedPreferences dengan API async berbasis Flow.

Referensi Lanjutan #

Selanjutnya #

Android adalah satu target; target lain yang sama pentingnya adalah backend. Chapter berikutnya membahas panduan backend Kotlin — Ktor dan Spring Boot, dua framework utama untuk membangun server.