Jadi ceritanya saya lagi asik ngoding aplikasi Android, tinggal pencet Run... dan layar langsung penuh tulisan merah. Build gagal. Pas akhirnya berhasil jalan, aplikasinya malah force close begitu tombol diklik.
Dari situ saya belajar dua hal sekaligus: gimana sebenarnya Activity Lifecycle bekerja, dan gimana ngadepin error kompatibilitas SDK yang bikin pusing. Saya tulis di sini biar kalian nggak perlu ngalamin hal yang sama.
- Lifecycle
Activity+ cara mantaunya lewat Logcat - Error Gradle: AAR Metadata Check
- Aplikasi force close gara-gara
android:onClick - Peringatan touch target 48dp
🏠 Activity Lifecycle: Anggap Aja Kayak Rumah
Activity itu satu layar di aplikasi kamu, misalnya layar login. Aplikasi biasanya punya beberapa Activity yang ditumpuk sistem lewat back stack (prinsip Last-In, First-Out: yang terakhir masuk, yang pertama keluar).
Nah, Android nggak diem aja. Setiap Activity punya "siklus hidup", dan tiap perubahannya dikabarin lewat fungsi callback. Biar gampang kebayang, bayangin kamu keluar-masuk rumah:
| Callback | Kapan dipanggil | Analogi rumah |
|---|---|---|
onCreate() |
Pertama kali dibuat; UI di-inflate lewat setContentView() |
Rumah baru selesai dibangun |
onStart() |
Mulai terlihat oleh pengguna | Pintu dibuka |
onResume() |
Foreground, siap berinteraksi | Kamu udah duduk santai di dalam |
onPause() |
Kehilangan fokus (misalnya muncul dialog) | Ada tamu masuk, kamu berdiri sebentar |
onStop() |
Sudah tidak terlihat sama sekali | Kamu keluar rumah, pintu ditutup |
onRestart() |
Activity yang berhenti ditampilkan lagi, sebelum onStart() |
Balik lagi ke rumah |
onDestroy() |
Dihancurkan, lewat finish() atau karena sistem butuh memori |
Rumahnya dirobohkan |
🔍 Eksperimen: Intip Lifecycle Lewat Logcat
Teori doang nggak seru, jadi saya pasang Log.v() di setiap callback di MainActivity.java. Baris log-nya saya tandain kuning:
public class MainActivity extends AppCompatActivity {
static final String TAG = "Main";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
Log.v(TAG, "ini di onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.v(TAG, "ini di onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.v(TAG, "ini di onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.v(TAG, "ini di onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.v(TAG, "ini di onStop");
}
@Override
protected void onRestart() {
super.onRestart();
Log.v(TAG, "ini di onRestart");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.v(TAG, "ini di onDestroy");
}
}
Terus saya coba dua skenario klasik:
Skenario 1: Pencet tombol Home
Log yang muncul: onPause() → onStop(). Aplikasi cuma pindah ke background, nggak dihancurkan. Pas dibuka lagi dari Recent Apps, urutannya onRestart() → onStart() → onResume(). Ibarat kamu keluar rumah sebentar, terus balik lagi.
Skenario 2: Pencet tombol Back
Log yang muncul: onPause() → onStop() → onDestroy(). Activity dihapus dari back stack dan memorinya dibebaskan. Kalau dibuka lagi, mulai dari onCreate(). Rumahnya udah dirobohkan, jadi bangun dari nol.
onPause() → onStop()), tanpa onDestroy(). Jadi kalau di HP baru kamu onDestroy()-nya nggak muncul, itu bukan bug. Perilaku di atas berlaku untuk Android versi lama dan untuk Activity yang bukan root.
🔥 Drama Troubleshooting
Setup saya: Android Studio dengan Android Gradle Plugin (AGP) 8.4.2 dan compileSdk 34. Dari sini mulai ada drama.
Drama #1: Build Gagal gara-gara AAR Metadata
Pas build, muncul error ini:
Dependency 'androidx.activity:activity:1.13.0' requires compileSdk 36 or later.
Dependency 'androidx.core:core:1.16.0' requires Android Gradle plugin 8.6.0 or higher.
Penyebabnya: transitive dependency AndroidX otomatis narik versi terbaru, dan versi itu butuh SDK serta AGP yang lebih tinggi dari yang saya pakai. Jadi saya nggak salah ngetik apa-apa, tapi tetap kena.
compileSdk 34 lewat resolution strategy di build.gradle.kts (modul :app).
configurations.all {
resolutionStrategy {
force("androidx.core:core:1.13.1")
force("androidx.core:core-ktx:1.13.1")
force("androidx.activity:activity:1.9.0")
}
}
Keuntungannya, kompatibilitas aman tanpa harus buru-buru upgrade SDK dan AGP.
Drama #2: Klik Tombol, Aplikasi Langsung Force Close
Build udah sukses, aplikasi jalan, saya klik tombol Login... dan aplikasinya langsung tutup sendiri. Di layout XML saya pakai android:onClick="login", android:onClick="register", dan android:onClick="resetpass". Masalahnya, method-nya belum saya bikin di Activity. Logcat nunjukin IllegalStateException dengan pesan "Could not find a method login(View)...".
public void namaMethod(View view). Tambahin handler berikut, lengkap dengan Toast biar kelihatan kalau tombolnya jalan:
public void login(View view) {
Toast.makeText(this, "Tombol Login diklik", Toast.LENGTH_SHORT).show();
}
public void register(View view) {
Toast.makeText(this, "Register Here diklik", Toast.LENGTH_SHORT).show();
}
public void resetpass(View view) {
Toast.makeText(this, "Reset It diklik", Toast.LENGTH_SHORT).show();
}
Drama #3: Peringatan Touch Target Size
Ini bukan error, cuma peringatan dari Lint. TextView yang saya set clickable="true" tingginya di bawah 48dp, yaitu batas minimal accessibility supaya gampang disentuh jari.
android:minHeight="48dp", atau kasih paddingTop dan paddingBottom sekitar 12dp. Jangan langsung pakai tools:ignore="TouchTargetSizeCheck", karena itu cuma nyembunyiin peringatan tanpa benerin masalahnya. Simpan sebagai pilihan terakhir.
🎯 Kesimpulan
- Lifecycle: pasang
Log.v()di setiap callback dan lihat sendiri hasilnya di Logcat. Jauh lebih nempel di kepala daripada cuma baca teori. - Error AAR Metadata: kalau dependency "terlalu baru" buat proyek kamu, pakai
resolutionStrategybuat nge-force versi yang kompatibel. android:onClick: setiap nilai di XML harus punya method pasanganpublic void nama(View view)diActivity, kalau nggak mau force close.
Semoga membantu, dan semoga build kamu hijau terus. Kalau ada yang mau ditanyain atau punya error lain yang lebih aneh, tulis di kolom komentar ya! 👇
