Mengikuti praktik terbaik wake lock

Menggunakan penguncian layar saat aktif dapat menurunkan performa perangkat. Jika Anda perlu menggunakan kunci pintar, Anda harus melakukannya dengan benar. Dokumen ini membahas beberapa praktik terbaik yang dapat membantu Anda menghindari kesalahan umum terkait kunci tetap 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 menemukan lokasi di kode sumber tempat wake lock 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 _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 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 kunci tetap aktif harus menggunakan tag yang sama setiap kali dijalankan. Praktik ini memungkinkan sistem menggabungkan penggunaan kunci tetap aktif setiap metode.

Pastikan aplikasi Anda terlihat di latar depan

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

Jika layanan latar depan bukan pilihan yang tepat untuk aplikasi Anda, Anda juga sebaiknya tidak menggunakan kunci tetap aktif. Lihat dokumentasi Memilih API yang tepat untuk menjaga perangkat tetap aktif untuk mengetahui cara lain dalam 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 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 didiagnosis dan didebug.

Pastikan 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 memunculkan pengecualian MyException. Jika ya, metode doSomethingAndRelease() akan menyebarkan pengecualian ke luar, dan tidak akan pernah mencapai panggilan release(). Akibatnya, kunci tetap aktif diperoleh, tetapi tidak dilepaskan, yang sangat buruk.

Dalam kode yang telah diperbaiki, doSomethingAndRelease() memastikan untuk melepaskan wake lock 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();
    }
}