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á đánh thức, bạn phải thực hiện đúng cách. Tài liệu này đề cập đến một số phương pháp hay nhất có thể giúp bạn tránh những cạm bẫy phổ biến về khoá đánh thức.
Đặt tên chính xác cho khoá chế độ thức
Bạn nên đưa tên gói, lớp hoặc phương thức vào thẻ khoá chế độ thức. Nhờ đó, 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á đánh 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 thấy thông tin nhận dạng cá nhân trong thẻ khoá chế độ thức, thiết bị sẽ ghi nhật ký
_UNKNOWN
thay vì thẻ mà bạn đã chỉ định. - Đừng dùng tên lớp hoặc phương thức thông qua mã, 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á đánh 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á đánh 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. Người dùng thiết bị phải biết rằng điều này đang xảy ra. Vì lý do này, nếu đang dùng khoá chế độ thức, bạn nên hiển thị cho người dùng một số thông báo. Trên thực tế, điều này có nghĩa là bạn nên lấy và giữ wakelock trong một dịch vụ trên nền trước. Các dịch vụ trên nền trước phải hiển thị một 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ì có lẽ bạn cũng không nên sử dụng khoá đánh thức. Hãy xem tài liệu Chọn API phù hợp để giữ cho thiết bị luôn ở trạng thái hoạt động để biết những cách khác giúp ứng dụng của bạn hoạt động ngay cả khi không ở 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 giải phóng
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ờ đạt đến lệnh gọi release()
. Kết quả là khoá đánh thức được thu nạp 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á đánh thức ngay cả khi một ngoại lệ được trả về:
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();
}
}