Mengikuti praktik terbaik wake lock

Menggunakan penguncian layar saat aktif dapat mengganggu performa perangkat. Jika Anda perlu menggunakan penguncian layar saat aktif, penting untuk melakukannya dengan benar. Dokumen ini membahas beberapa praktik terbaik yang dapat membantu Anda menghindari kesalahan umum terkait penguncian layar saat aktif.

Beri nama penguncian layar saat aktif dengan benar

Sebaiknya sertakan nama paket, class, atau metode di tag penguncian layar saat aktif. Dengan begitu, jika terjadi error, akan lebih mudah untuk menemukan lokasi dalam kode sumber tempat penguncian layar saat aktif dibuat. Berikut ini beberapa tips tambahan:

  • Kosongkan informasi identitas pribadi (PII) dalam nama, seperti alamat email. Jika perangkat mendeteksi PII dalam tag penguncian layar saat aktif, perangkat akan mencatat _UNKNOWN ke dalam log, bukan tag yang Anda tentukan.
  • Jangan mendapatkan nama class atau metode secara terprogram, misalnya dengan memanggil getName(). Jika Anda mencoba mendapatkan nama secara terprogram, nama tersebut mungkin akan di-obfuscate oleh alat seperti Proguard. Sebaiknya gunakan string hard code.
  • Jangan menambahkan penghitung atau ID unik ke tag penguncian layar saat aktif. Kode yang membuat penguncian layar saat aktif harus menggunakan tag yang sama setiap kali dijalankan. Praktik ini memungkinkan sistem menggabungkan penggunaan penguncian layar saat aktif untuk setiap metode.

Memastikan aplikasi Anda terlihat di latar depan

Saat penguncian layar saat aktif aktif, perangkat akan menggunakan daya. Pengguna perangkat harus mengetahui bahwa hal ini sedang terjadi. Oleh karena itu, jika Anda menggunakan penguncian layar saat aktif, Anda harus menampilkan beberapa notifikasi kepada pengguna. Dalam praktiknya, ini berarti Anda harus mendapatkan dan mempertahankan penguncian layar saat aktif di layanan latar depan. Layanan latar depan diperlukan untuk menampilkan notifikasi.

Jika layanan latar depan bukan pilihan yang tepat untuk aplikasi Anda, Anda mungkin juga tidak perlu menggunakan penguncian layar saat aktif. Lihat dokumentasi Memilih API yang tepat untuk menjaga perangkat tetap aktif untuk mengetahui cara lain melakukan pekerjaan saat aplikasi Anda tidak berada di latar depan.

Buat logika tetap sederhana

Pastikan logika untuk mendapatkan dan melepaskan penguncian layar saat aktif sesederhana mungkin. Saat logika penguncian layar saat aktif dikaitkan ke mesin yang berstatus kompleks, waktu tunggu, gabungan eksekusi, atau peristiwa callback, bug halus dalam logika tersebut dapat menyebabkan penguncian layar saat aktif ditahan lebih lama daripada yang diharapkan. Bug ini sulit untuk didiagnosis dan didebug.

Memastikan penguncian layar saat aktif selalu dilepaskan

Jika menggunakan penguncian layar saat aktif, Anda harus memastikan bahwa setiap penguncian layar saat aktif yang Anda peroleh dilepaskan dengan benar. Hal ini tidak selalu semudah kedengarannya. Misalnya, kode berikut memiliki masalah:

Kotlin

@Throws(MyException::class)
fun doSomethingAndRelease() {
    wakeLock.apply {
        acquire()
        doTheWork() // can potentially throw MyException
        release()   // does not run if an exception is thrown
    }
}

Java

void doSomethingAndRelease() throws MyException {
    wakeLock.acquire();
    doTheWork();         // can potentially throw MyException
    wakeLock.release();  // does not run if an exception is thrown
}

Masalahnya di sini adalah metode doTheWork() dapat menampilkan pengecualian MyException. Jika ya, metode doSomethingAndRelease() akan menyebarkan pengecualian ke luar, dan tidak akan pernah mencapai panggilan release(). Hasilnya, penguncian layar saat aktif diperoleh, tetapi tidak dilepaskan, yang sangat buruk.

Dalam kode yang diperbaiki, doSomethingAndRelease() memastikan untuk melepaskan penguncian layar saat aktif meskipun pengecualian ditampilkan:

Kotlin

@Throws(MyException::class)
fun doSomethingAndRelease() {
    wakeLock.apply {
        try {
            acquire()
            doTheWork()
        } finally {
            release()
        }
    }
}

Java

void doSomethingAndRelease() throws MyException {
    try {
        wakeLock.acquire();
        doTheWork();
    } finally {
        wakeLock.release();
    }
}