WakeLock: apa itu, jenis dan pengelolaan kunci tidur

Penulis: IT Sectr Diterbitkan: 2026-03-28 Waktu membaca: 9 mnt

WakeLock adalah mekanisme Android yang mencegah perangkat masuk ke mode tidur, dengan menjaga prosesor atau layar tetap aktif. Tugas latar belakang seperti mengunduh file, memutar audio, atau merekam data memerlukan WakeLock untuk eksekusi terjamin tanpa gangguan. Menurut spesifikasi Android Developers, 2025, penggunaan WakeLock yang tidak benar menyebabkan baterai cepat habis dan dapat menyebabkan aplikasi diblokir di Google Play.

Poin Utama

  • WakeLock — kunci tidur, menjaga perangkat tetap aktif
  • Jenis — PARTIAL_WAKE_LOCK, FULL_WAKE_LOCK, SCREEN_DIM_WAKE_LOCK dan lainnya
  • Izin — WAKE_LOCK diperlukan di manifes, tetapi tidak diminta saat runtime
  • Risiko — WakeLock yang tidak dilepaskan menguras baterai dan memperburuk pengalaman pengguna
  • Alternatif — WorkManager, Foreground Service, JobScheduler mengurangi kebutuhan WakeLock

Apa itu WakeLock

WakeLock adalah kunci sistem yang melarang Android memindahkan perangkat ke mode konsumsi daya rendah. Biasanya Android setelah beberapa detik tidak ada aktivitas pengguna mematikan layar dan memindahkan prosesor ke kondisi tidur nyenyak (deep sleep), di mana thread latar belakang dijeda. WakeLock mencegah transisi ini dengan menjaga CPU tetap aktif.

Mekanisme WakeLock dikelola melalui layanan sistem PowerManager, yang diakses melalui metode getSystemService(Context.POWER_SERVICE). Pengembang membuat objek WakeLock dengan menentukan jenis kunci dan harus melepaskannya setelah tugas selesai, jika tidak baterai perangkat akan cepat habis. Sistem tidak melepaskan WakeLock secara otomatis — ini tanggung jawab aplikasi.

Dengan setiap rilis utama Android, Google memperketat kontrol atas WakeLock. Mulai dari Android 9 (API 28), aplikasi latar belakang tidak dapat memperoleh WakeLock tanpa alasan yang kuat, dan sistem melacak aplikasi yang menyalahgunakan kunci dan dapat melepaskannya secara paksa. Di Android 12+ batasan tambahan diberlakukan pada akses ke PowerManager untuk aplikasi latar belakang.

Kapan WakeLock diperlukan

WakeLock diperlukan dalam skenario di mana tugas tidak dapat diinterupsi oleh perangkat masuk ke mode tidur: mengunduh file besar melalui koneksi tidak stabil, merekam video, melakukan perhitungan panjang tanpa partisipasi pengguna. Tanpa kunci tidur, prosesor masuk ke tidur nyenyak, semua thread dibekukan, dan tugas tetap tidak selesai.

Namun, Google sangat merekomendasikan meminimalkan penggunaan WakeLock. Dalam kebanyakan kasus, tugas yang sama dapat diselesaikan dengan Foreground Service dengan notifikasi, WorkManager atau JobScheduler. Mekanisme ini mempertimbangkan status baterai dan jaringan, yang memperpanjang masa pakai baterai perangkat.

Cara kerja WakeLock

WakeLock bekerja melalui layanan sistem PowerManager yang mengelola status daya perangkat. Ketika aplikasi meminta kunci melalui powerManager.newWakeLock(), sistem meningkatkan tingkat aktivitas CPU, mencegah transisi ke tidur nyenyak. Setelah memanggil wakeLock.release(), sistem kembali ke mode hemat daya normal.

Penting untuk dipahami bahwa WakeLock tidak mencegah semua mode hemat daya. Doze Mode (mode tidur Android 6+) dapat mengabaikan WakeLock dalam fase tertentu — aplikasi dengan WakeLock yang ditahan tidak akan mendapatkan akses jaringan di jendela pemeliharaan Doze. Ini berarti bahwa WakeLock yang aktif pun tidak menjamin eksekusi operasi jaringan selama fase kedua Doze.

Setiap WakeLock terkait dengan PowerManager.WakeLock di sisi framework. Sistem mempertahankan penghitungan kunci aktif di tingkat proses: jika satu proses menahan beberapa WakeLock, mereka dijumlahkan dan pelepasan hanya terjadi setelah memanggil release() untuk setiap kunci. Android juga mendukung wake lock timeouts — pelepasan otomatis setelah interval yang ditentukan. Namun, mengandalkan timeout tidak disarankan: tugas mungkin selesai lebih awal dan waktu penahanan tambahan akan mengurangi masa pakai baterai.

WakeLock dan peristiwa sistem

Saat perangkat beralih ke mode tidur (tombol daya), Android secara paksa melepaskan semua SCREEN_DIM_WAKE_LOCK dan SCREEN_BRIGHT_WAKE_LOCK, tetapi mempertahankan PARTIAL_WAKE_LOCK. Ini berarti kunci layar tidak dapat mencegah perangkat mematikan layar — hanya PARTIAL_WAKE_LOCK yang dapat terus bekerja setelah tombol daya ditekan.

Jenis WakeLock di Android

Di Android ada beberapa jenis WakeLock, masing-masing mengelola komponen perangkat tertentu. Pemilihan jenis menentukan komponen perangkat keras mana yang tetap aktif setelah kunci. Pemilihan jenis yang salah menyebabkan konsumsi daya berlebihan karena modul yang tidak perlu diaktifkan.

JenisCPULayarKeyboardKapan digunakan
PARTIAL_WAKE_LOCKNyalaMatiMatiUnduh file, perhitungan
SCREEN_DIM_WAKE_LOCKNyalaRedupMatiPemutar video, presentasi
SCREEN_BRIGHT_WAKE_LOCKNyalaTerangMatiGame (usang)
FULL_WAKE_LOCKNyalaTerangTerangUsang (deprecated)

PARTIAL_WAKE_LOCK — jenis utama

PARTIAL_WAKE_LOCK adalah jenis yang paling sering digunakan dan direkomendasikan. Ini menjaga CPU tetap aktif, tetapi memungkinkan layar dan lampu keyboard mati. Ini adalah pilihan optimal untuk tugas latar belakang: mengunduh data, memproses gambar, sinkronisasi. Layar mati setelah batas waktu sistem, yang menghemat baterai saat melakukan pekerjaan yang tidak terlihat oleh pengguna.

Jenis usang (deprecated)

SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK dan FULL_WAKE_LOCK ditandai sebagai usang sejak Android 7 (API 24). Mereka menjaga layar tetap menyala, yang menyebabkan konsumsi baterai signifikan. Google merekomendasikan menggunakan FLAG_KEEP_SCREEN_ON melalui Activity.getWindow().addFlags() sebagai gantinya — bendera ini hanya berfungsi dengan Activity aktif dan tidak memerlukan izin WAKE_LOCK, dan sistem secara otomatis mengelola waktu penahanan layar.

WakeLock dan konsumsi daya

WakeLock adalah salah satu „penguras" baterai utama di Android. Setiap detik penahanan kunci tidur mengkonsumsi energi tambahan karena prosesor tidak dapat beralih ke keadaan C-state yang efisien energi. Penelitian Google Power Dashboard menunjukkan bahwa aplikasi dengan WakeLock yang tidak dilepaskan dengan benar dapat meningkatkan konsumsi daya perangkat sebesar 30–50% dalam mode siaga.

Sistem melacak aplikasi yang menyalahgunakan WakeLock melalui komponen Battery Historian. Pengembang dapat menganalisis profil konsumsi daya dan mendeteksi „kebocoran" kunci — situasi di mana WakeLock dibuat tetapi tidak dilepaskan. Google Play Console menampilkan statistik WakeLock untuk aplikasi yang dipublikasikan, dan waktu penahanan yang lama dapat menyebabkan ulasan buruk.

Doze Mode dan App Standby lebih lanjut membatasi kerja WakeLock. Dalam fase pertama Doze (Light Doze), sistem mengizinkan WakeLock di jendela pemeliharaan pendek. Dalam fase kedua (Deep Doze), WakeLock digabungkan dengan kunci lain dan dijalankan di jendela bersama. Jika aplikasi menahan WakeLock lebih dari 10 menit tanpa interaksi pengguna, sistem dapat melepaskannya secara paksa dan menempatkan aplikasi di daftar hitam optimasi baterai.

  • Battery Historian — alat untuk menganalisis konsumsi daya dan kebocoran WakeLock
  • Doze Mode — membatasi WakeLock di jendela pemeliharaan, menggabungkan kunci
  • Google Play Console — menampilkan statistik WakeLock untuk aplikasi yang dipublikasikan
  • Daftar hitam — aplikasi dapat ditandai oleh sistem sebagai boros daya

Praktik terbaik penggunaan

Penggunaan WakeLock yang benar adalah keseimbangan antara kebutuhan untuk menyelesaikan tugas dan perhatian terhadap baterai perangkat. Google merekomendasikan untuk mengikuti beberapa prinsip: selalu lepaskan WakeLock di finally atau melalui acquire(timeout), gunakan jenis kunci minimal yang diperlukan dan hindari penahanan berkepanjangan tanpa kebutuhan mendesak.

Aturan pelepasan

WakeLock harus dilepaskan di blok kode yang sama di mana ia dibuat. Untuk menjamin pelepasan saat terjadi pengecualian, gunakan konstruksi try-finally atau blok use di Kotlin. Di Android 10+, sistem menampilkan peringatan di logcat jika WakeLock ditahan lebih dari 60 detik: "WakeLock held for more than 60 seconds" — ini adalah sinyal kemungkinan kebocoran.

Timeout saat akuisisi

Metode acquire(long timeout) secara otomatis melepaskan WakeLock setelah waktu yang ditentukan dalam milidetik. Ini adalah jaring pengaman jika kode pelepasan tidak dijalankan karena pengecualian atau bug. Disarankan untuk selalu menentukan timeout yang sama dengan waktu eksekusi maksimum yang diharapkan dari tugas ditambah 10–20% cadangan.

Memeriksa keberadaan kunci

Sebelum memanggil release(), periksa apakah WakeLock saat ini ditahan. Panggilan berulang release() tanpa acquire() sebelumnya menyebabkan RuntimeException: WakeLock under-locked. Disarankan untuk menyimpan bendera status (isHeld) dan sebelum melepaskan periksa wakeLock.isHeld().

Menggunakan WakeLock di Kotlin

Mari kita lihat pembuatan dan pelepasan WakeLock yang benar di Kotlin. Contoh menunjukkan pengunduhan data asinkron dengan menahan PARTIAL_WAKE_LOCK, pelepasan terjamin di blok try-finally dan penentuan timeout untuk perlindungan terhadap kebocoran. Layanan menggunakan CoroutineScope dengan dispatcher IO untuk menjalankan tugas latar belakang.

kotlin
class DownloadService : Service() {

    private lateinit var wakeLock: PowerManager.WakeLock
    private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())

    override fun onCreate() {
        super.onCreate()
        val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
        wakeLock = powerManager.newWakeLock(
            PowerManager.PARTIAL_WAKE_LOCK,
            "download:wakelock"
        )
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        wakeLock.acquire(60000)
        scope.launch {
            try {
                downloadFile()
            } finally {
                if (wakeLock.isHeld()) {
                    wakeLock.release()
                }
            }
        }
        return START_NOT_STICKY
    }

    private suspend fun downloadFile() {
        // Simulasi unduhan file
        delay(30000)
    }

    override fun onDestroy() {
        super.onDestroy()
        scope.cancel()
        if (wakeLock.isHeld()) {
            wakeLock.release()
        }
    }

    override fun onBind(intent: Intent): IBinder? = null
}

Deklarasi izin di manifes

Untuk menggunakan WakeLock, Anda perlu menambahkan izin di AndroidManifest.xml. Izin WAKE_LOCK adalah izin normal (normal) — tidak memerlukan permintaan runtime dari pengguna dan diberikan secara otomatis saat pemasangan aplikasi. Namun demikian, Google Play dapat menolak publikasi jika aplikasi tidak memiliki skenario penggunaan WakeLock yang jelas.

xml
<uses-permission
    android:name="android.permission.WAKE_LOCK" />

<uses-permission
    android:name="android.permission.DEVICE_POWER" />

Alternatif WakeLock

WakeLock adalah mekanisme tingkat rendah dan Google merekomendasikan untuk menggantinya dengan API yang lebih modern jika memungkinkan. Alternatif utama adalah Foreground Service dengan notifikasi, yang secara otomatis menahan kunci CPU selama layanan berjalan. Sistem sendiri mengelola WakeLock untuk Foreground Service, membebaskan pengembang dari kebutuhan untuk mengambil dan melepaskan secara eksplisit.

WorkManager adalah alat kedua terpenting untuk tugas latar belakang. Ini menjamin eksekusi pekerjaan bahkan saat perangkat masuk ke Doze dan setelah restart. WorkManager mendukung penahan kunci (hold lock) di dalamnya — pengembang tidak perlu bekerja secara eksplisit dengan PowerManager. Tugas dijalankan di jendela pemeliharaan Doze dengan pengelolaan kunci tidur otomatis.

Untuk tugas reguler yang memerlukan waktu tepat, digunakan AlarmManager dengan setAndAllowWhileIdle(), yang dapat membangunkan perangkat dari Doze. Namun AlarmManager hanya cocok untuk operasi pendek — tidak dirancang untuk penahanan WakeLock yang berkepanjangan. Jika tugas berlangsung lebih dari 10 detik, AlarmManager harus dikombinasikan dengan BroadcastReceiver yang menjalankan Foreground Service.

  • Foreground Service — pengelolaan WakeLock otomatis dengan notifikasi
  • WorkManager — eksekusi terjamin dengan mempertimbangkan Doze dan restart
  • JobScheduler — penjadwalan dengan mempertimbangkan jaringan, pengisian daya, dan idle
  • AlarmManager — membangunkan perangkat untuk tugas pendek sesuai jadwal

Pertanyaan Umum

Apa itu WakeLock di Android?

WakeLock adalah kunci sistem yang mencegah perangkat Android masuk ke mode tidur. Ini menjaga prosesor atau layar tetap aktif, memungkinkan tugas latar belakang (unduhan, perhitungan) berjalan tanpa gangguan. Dikelola melalui layanan sistem PowerManager.

Jenis WakeLock apa yang ada?

Jenis utama: PARTIAL_WAKE_LOCK (CPU aktif, layar mati) — direkomendasikan; SCREEN_DIM_WAKE_LOCK (CPU + layar redup); SCREEN_BRIGHT_WAKE_LOCK (CPU + layar terang). SCREEN_DIM, SCREEN_BRIGHT dan FULL_WAKE_LOCK ditandai usang dan digantikan oleh FLAG_KEEP_SCREEN_ON.

Apakah perlu izin untuk WakeLock?

Ya, di manifes harus mendeklarasikan android.permission.WAKE_LOCK. Ini adalah izin normal (normal permission) yang diberikan secara otomatis saat pemasangan — tidak perlu memintanya saat runtime. Tanpa izin ini, panggilan newWakeLock() mengembalikan null atau melempar SecurityException.

Apa yang terjadi jika WakeLock tidak dilepaskan?

Jika release() tidak dipanggil, perangkat tidak dapat masuk ke mode tidur. Baterai akan habis secara signifikan lebih cepat (hingga 50% konsumsi tambahan). Sistem akan mencatat kebocoran di logcat, dan Battery Historian akan menunjukkan waktu penahanan WakeLock yang tidak normal, yang mengarah pada ulasan negatif pengguna.

Dengan apa mengganti WakeLock di aplikasi modern?

Untuk tugas panjang, gunakan Foreground Service dengan notifikasi — sistem mengelola WakeLock sendiri. Untuk tugas tertunda dan terjamin, gunakan WorkManager, yang mendukung WakeLock secara internal. Untuk tugas pendek terjadwal — AlarmManager.

Ringkasan

  • WakeLock — kunci tidur, menjaga CPU atau layar perangkat Android tetap aktif
  • PARTIAL_WAKE_LOCK — jenis utama untuk tugas latar belakang; layar mati, CPU tetap aktif
  • Izin — WAKE_LOCK di manifes (normal permission, runtime tidak diperlukan)
  • Kebocoran — WakeLock tidak dilepaskan menguras baterai 30–50%; lepaskan di finally atau melalui timeout
  • Usang — SCREEN_DIM, SCREEN_BRIGHT dan FULL_WAKE_LOCK digantikan oleh FLAG_KEEP_SCREEN_ON
  • Foreground Service — alternatif dengan pengelolaan WakeLock otomatis dan notifikasi
  • WorkManager — pilihan terbaik untuk tugas latar belakang tertunda dengan eksekusi terjamin

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga