Mengikuti praktik terbaik wake lock

Penggunaan 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 masalah umum penguncian layar saat aktif.

Memberi 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 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 di tag penguncian layar saat aktif, perangkat akan mencatat log _UNKNOWN, 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 diobfuscate 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 mengagregasi penggunaan penguncian layar saat aktif setiap metode.

Memastikan aplikasi Anda terlihat di latar depan

Saat penguncian layar saat aktif aktif, perangkat 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 menyimpan penguncian layar saat aktif di layanan latar depan. Layanan latar depan wajib menampilkan notifikasi.

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

Membuat 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 memiliki 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.

Memeriksa apakah penguncian layar saat aktif selalu dilepaskan

Jika Anda 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 yang dibayangkan. 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 demikian, metode doSomethingAndRelease() akan menyebarkan pengecualian ke luar, dan tidak pernah mencapai panggilan release(). Hasilnya adalah penguncian layar saat aktif diperoleh, tetapi tidak dilepaskan, yang sangat buruk.

Dalam kode yang dikoreksi, 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();
    }
}