Build Gagal, App Force Close, dan Pelajaran soal Activity Lifecycle di Android

Jessi
0
\

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.

📌 Yang bakal dibahas
  • 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:

💡 Saran dari saya: tombol 🌭 di pojok kanan atas kotak kode (selain pesan error) memang ada (klik buat menyalin), tapi usahakan ketik sendiri dulu, jangan copy-paste kalau nggak kepepet. Dengan mengetik, tangan ikut hafal polanya dan kamu jadi mikir "ini fungsinya apa sih?". Pakai tombol salin cuma kalau benar-benar buntu.
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.

⚠️ Catatan penting: di Android 12 ke atas, pencet Back di root launcher Activity cuma memindahkan aplikasi ke background (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.

✅ Solusi: paksa (force) versi library yang kompatibel dengan 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)...".

✅ Solusi: Android mewajibkan method dengan signature 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.

✅ Solusi: atur 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 resolutionStrategy buat nge-force versi yang kompatibel.
  • android:onClick: setiap nilai di XML harus punya method pasangan public void nama(View view) di Activity, 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! 👇

Posting Komentar

0 Komentar

Posting Komentar (0)
3/related/default