Làm theo các phương pháp hay nhất về khoá chế độ thức

Việc sử dụng khoá chế độ thức có thể làm giảm hiệu suất của thiết bị. Nếu cần sử dụng khoá chế độ thức, bạn cần phải thực hiện đúng cách. Tài liệu này trình bày một số phương pháp hay nhất giúp bạn tránh các lỗi thường gặp liên quan đến khoá chế độ thức.

Đặt tên khoá chế độ thức đúng cách

Bạn nên đưa tên gói, lớp hoặc phương thức vào thẻ khoá chế độ thức. Bằng cách đó, nếu xảy ra lỗi, bạn sẽ dễ dàng tìm thấy vị trí trong mã nguồn nơi khoá chế độ thức được tạo. Dưới đây là một số mẹo bổ sung:

  • Bỏ mọi thông tin nhận dạng cá nhân (PII) trong tên, chẳng hạn như địa chỉ email. Nếu phát hiện PII trong thẻ khoá chế độ thức, thiết bị sẽ ghi nhật ký _UNKNOWN thay vì thẻ bạn chỉ định.
  • Đừng dùng tên lớp hoặc phương thức theo phương thức lập trình, chẳng hạn như gọi getName(). Nếu bạn cố gắng lấy tên theo phương thức lập trình, tên đó có thể bị các công cụ như Proguard làm rối mã nguồn. Thay vào đó, hãy dùng một chuỗi được mã hoá cứng.
  • Đừng thêm bộ đếm hoặc giá trị nhận dạng duy nhất vào thẻ khoá chế độ thức. Mã tạo khoá chế độ thức phải sử dụng cùng một thẻ mỗi khi chạy. Phương pháp này cho phép hệ thống tổng hợp mức sử dụng khoá chế độ thức của từng phương thức.

Đảm bảo ứng dụng của bạn hiển thị ở nền trước

Khi khoá chế độ thức đang hoạt động, thiết bị sẽ tiêu thụ điện năng. Người dùng thiết bị phải biết rằng việc này đang diễn ra. Vì lý do này, nếu đang sử dụng khoá chế độ thức, bạn nên hiển thị một số thông báo cho người dùng. Trong thực tế, điều này có nghĩa là bạn nên lấy và giữ khoá chế độ thức trong một dịch vụ trên nền trước. Bạn cần có dịch vụ trên nền trước để hiển thị thông báo.

Nếu dịch vụ trên nền trước không phải là lựa chọn phù hợp cho ứng dụng của bạn, thì bạn cũng không nên sử dụng khoá chế độ thức. Hãy xem tài liệu Chọn API phù hợp để giữ cho thiết bị luôn thức để biết các cách khác để thực hiện công việc khi ứng dụng không chạy ở nền trước.

Giữ cho logic đơn giản

Hãy đảm bảo các logic thu nạp và hủy bỏ khóa chế độ thức đơn giản nhất có thể. Khi logic khoá chế độ thức liên kết với các máy có trạng thái phức tạp, thời gian chờ, nhóm thực thi hoặc sự kiện gọi lại, thì bất kỳ lỗi nhỏ nào trong logic đó cũng có thể khiến khoá chế độ thức bị giữ lâu hơn dự kiến. Những lỗi này rất khó để chẩn đoán và gỡ lỗi.

Kiểm tra để đảm bảo khoá chế độ thức luôn được huỷ bỏ

Nếu sử dụng khoá chế độ thức, bạn phải đảm bảo rằng mọi khoá chế độ thức mà bạn nhận được đều được huỷ bỏ đúng cách. Việc này không phải lúc nào cũng dễ dàng như bạn tưởng. Ví dụ: mã sau đây có vấn đề:

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
}

Vấn đề ở đây là phương thức doTheWork() có thể gửi ngoại lệ MyException. Nếu có, phương thức doSomethingAndRelease() sẽ truyền ngoại lệ ra ngoài và không bao giờ đến lệnh gọi release(). Kết quả là khoá chế độ thức được lấy nhưng không được giải phóng, điều này rất tệ.

Trong mã đã sửa, doSomethingAndRelease() đảm bảo giải phóng khoá chế độ thức ngay cả khi một ngoại lệ được gửi:

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();
    }
}