Tối ưu hoá việc sử dụng thông tin vị trí để kéo dài thời lượng pin

Hãy thực hiện các hành động sau để giảm tác động của ứng dụng đối với thời lượng pin của thiết bị khi sử dụng dịch vụ vị trí.

Xóa bản cập nhật vị trí

Một nguyên nhân phổ biến gây tiêu hao pin không cần thiết là không xóa được thông tin cập nhật vị trí khi dữ liệu đó không còn cần thiết nữa.

Điều này có thể xảy ra khi phương thức vòng đời onStart() hoặc onResume() của hoạt động chứa lệnh gọi đến requestlocationUpdates() mà không có lệnh gọi tương ứng đến removeLocationUpdates() trong phương thức vòng đời onPause() hoặc onStop().

Bạn có thể sử dụng các thành phần nhận biết vòng đời để quản lý tốt hơn vòng đời của các hoạt động trong ứng dụng. Để biết thêm thông tin, vui lòng xem nội dung Xử lý vòng đời bằng các thành phần nhận biết vòng đời ,

Đặt thời gian chờ

Để tránh bị hao pin, hãy đặt thời gian chờ hợp lý khi dừng cập nhật vị trí. Thời gian chờ đảm bảo các bản cập nhật không tiếp tục vô thời hạn và bảo vệ ứng dụng trong các trường hợp thông báo cập nhật được yêu cầu nhưng không bị xóa (ví dụ: do lỗi trong mã).

Đối với yêu cầu từ trình cung cấp vị trí kết hợp, hãy thêm thời gian chờ bằng cách gọi setExpirationDuration(). Sự kiện này nhận được thông số đại diện cho thời gian tính bằng mili giây kể từ khi phương thức được gọi gần đây nhất. Bạn cũng có thể thêm thời gian chờ bằng cách gọi setExpirationTime(). Sự kiện này nhận được thông số thể hiện thời gian hết hạn tính bằng mili giây kể từ lần khởi động (root) gần đây nhất của hệ thống.

Để thêm thời gian chờ vào yêu cầu vị trí khoanh vùng địa lý, hãy gọi phương thức setExpirationDuration().

Yêu cầu theo lô (Batch)

Đối với tất cả các trường hợp sử dụng không phải trên nền trước, hãy tạo nhiều yêu cầu cùng lúc. Sử dụng phương thức setInterval() để chỉ định khoảng thời gian bạn muốn tính toán vị trí. Sau đó, hãy sử dụng phương thức setMaxWaitTime() để đặt khoảng thời gian mà vị trí được phân phối đến ứng dụng của bạn. Truyền một giá trị đến phương thức setMaxWaitTime() là bội số của giá trị được truyền đến phương thức setInterval(). Ví dụ: hãy xem xét yêu cầu vị trí sau:

Kotlin

val request = LocationRequest()
request.setInterval(10 * 60 * 1000)
request.setMaxWaitTime(60 * 60 * 1000)

Java

LocationRequest request = new LocationRequest();
request.setInterval(10 * 60 * 1000);
request.setMaxWaitTime(60 * 60 * 1000);

Trong trường hợp này, hệ thống sẽ tính toán vị trí khoảng 10 phút một lần và phân phối khoảng 6 điểm dữ liệu vị trí theo lô khoảng mỗi giờ. Mặc dù bạn vẫn nhận được thông tin cập nhật vị trí khoảng mười phút một lần, nhưng bạn vẫn tiết kiệm được pin vì thiết bị chỉ bị đánh thức mỗi giờ một lần.

Sử dụng thông báo cập nhật vị trí thụ động

Đối với các trường hợp sử dụng trong nền, bạn nên hạn chế các cập nhật vị trí. Giới hạn của Android 8.0 (API cấp 26) thực hiện phương pháp này, nhưng các ứng dụng chạy trên các thiết bị cấp thấp hơn cần giới hạn quyền truy cập thông tin vị trí ở chế độ nền nhiều nhất có thể.

Nhiều khả năng khi ứng dụng của bạn chạy trong nền thì một ứng dụng khác có thể thường xuyên yêu cầu thông báo cập nhật vị trí ở nền trước. Dịch vụ vị trí cung cấp các bản cập nhật này cho ứng dụng. Hãy cân nhắc yêu cầu vị trí sau đây bởi chúng sẽ có thể tiêu thụ dữ liệu vị trí:

Kotlin

val request = LocationRequest()
request.setInterval(15 * 60 * 1000)
request.setFastestInterval(2 * 60 * 1000)

Java

LocationRequest request = new LocationRequest();
request.setInterval(15 * 60 * 1000);
request.setFastestInterval(2 * 60 * 1000);

Trong ví dụ trước, vị trí của ứng dụng được tính toán khoảng 15 phút một lần. Nếu các ứng dụng khác yêu cầu thông tin vị trí, ứng dụng sẽ nhận được dữ liệu trong khoảng thời gian tối đa là hai phút.

Mặc dù việc sử dụng dịch vụ vị trí thụ động không làm tiêu hao pin, nhưng hãy thận trọng hơn trong các trường hợp mà việc tiếp nhận dữ liệu vị trí sẽ kích hoạt các hoạt động tốn nhiều chi phí là CPU hoặc I/O. Để giảm thiểu chi phí pin, khoảng thời gian chỉ định trong setFastestInterval() không được quá nhỏ.