Android : Tối Ưu Hóa Vị Trí Cho Pin

Thảo luận trong 'Học tập' bởi HoitruongS4, 21/12/2018.

  1. HoitruongS4

    HoitruongS4 Thành viên tập sự

    Tham gia:
    14/8/2018
    Bài viết:
    15
    Đã được thích:
    0
    Điểm thành tích:
    1
    Các giới hạn nền Location giới thiệu trong Lập trình Android 8.0 (mức API 26) đã mang lại tập trung đổi mới đến chủ đề về cách sử dụng dịch vụ định vị ảnh hưởng đến pin.

    Trang này đề cập đến một số dịch vụ vị trí thực tiễn tốt nhất và những gì bạn có thể làm ngay bây giờ để làm cho ứng dụng của bạn tiết kiệm pin hơn. Áp dụng các thực tiễn tốt nhất này mang lại lợi ích cho ứng dụng của bạn bất kể phiên bản nền tảng mà nó đang chạy.

    Giới hạn vị trí nền trong Android 8.0 đã giới thiệu các thay đổi sau:

    Thu thập vị trí nền được điều chỉnh và vị trí được tính toán, và chỉ được giao một vài lần một giờ.

    Quét Wi-Fi bảo thủ hơn và cập nhật vị trí không được tính khi thiết bị vẫn được kết nối với cùng một điểm truy cập tĩnh.

    Phản ứng địa lý thay đổi từ hàng chục giây đến khoảng hai phút. Sự thay đổi này đáng chú ý giúp cải thiện hiệu suất pin, tốt hơn tới 10 lần trên một số thiết bị.

    Trang này giả định rằng bạn đang sử dụng API Dịch vụ vị trí của Google , cung cấp độ chính xác cao hơn và áp đặt gánh nặng pin nhẹ hơn so với API vị trí khung .

    Đặc biệt, trang này giả định quen thuộc với API nhà cung cấp vị trí hợp nhất , kết hợp các tín hiệu từ GPS, Wi-Fi và mạng di động, cũng như gia tốc kế, con quay hồi chuyển, từ kế và các cảm biến khác.

    Bạn cũng nên làm quen với API định vị địa lý , được xây dựng dựa trên API của nhà cung cấp vị trí hợp nhất và được tối ưu hóa cho hiệu suất của pin.

    Hiểu pin

    Thu thập vị trí và tiêu hao pin có liên quan trực tiếp trong các khía cạnh sau:

    Độ chính xác: Độ chính xác của dữ liệu vị trí. Nói chung, độ chính xác càng cao, hao pin càng cao.

    Tần suất: Tần suất vị trí được tính toán. Vị trí càng thường xuyên được tính toán, càng sử dụng nhiều pin.

    Độ trễ: Dữ liệu vị trí được phân phối nhanh như thế nào. Độ trễ ít hơn thường đòi hỏi nhiều pin hơn.

    Độ chính xác

    Bạn có thể chỉ định độ chính xác của vị trí bằng setPriority() phương thức, chuyển một trong các giá trị sau làm đối số:

    PRIORITY_HIGH_ACCURACY cung cấp vị trí chính xác nhất có thể, được tính toán bằng cách sử dụng càng nhiều đầu vào càng cần thiết (nó cho phép GPS, Wi-Fi và tế bào và sử dụng nhiều Cảm biến khác nhau ) và có thể gây hao pin đáng kể.

    PRIORITY_BALANCED_POWER_ACCURACY cung cấp vị trí chính xác trong khi tối ưu hóa cho sức mạnh. Rất hiếm khi sử dụng GPS. Thông thường sử dụng kết hợp Wi-Fi và thông tin di động để tính toán vị trí thiết bị.

    PRIORITY_LOW_POWER chủ yếu dựa vào các tháp di động và tránh các đầu vào GPS và Wi-Fi, cung cấp độ chính xác thô (cấp thành phố) với mức tiêu hao pin tối thiểu.

    PRIORITY_NO_POWER nhận vị trí thụ động từ các ứng dụng khác mà vị trí đã được tính toán.

    Nhu cầu vị trí của hầu hết các ứng dụng có thể được thỏa mãn bằng cách sử dụng các tùy chọn công suất thấp hoặc công suất thấp. Độ chính xác cao phải được dành riêng cho các ứng dụng đang chạy ở nền trước và yêu cầu cập nhật vị trí theo thời gian thực (ví dụ: ứng dụng bản đồ).

    Tần số

    Bạn có thể chỉ định tần suất vị trí bằng hai phương pháp:

    Sử dụng setinterval() phương pháp để chỉ định khoảng thời gian mà vị trí được tính cho ứng dụng của bạn .

    Sử dụng setFastestInterval() để chỉ định khoảng thời gian mà vị trí được tính cho các ứng dụng khác được gửi đến ứng dụng của bạn .

    Bạn nên vượt qua giá trị lớn nhất có thể khi sử dụng setInterval(). Điều này đặc biệt đúng đối với việc thu thập vị trí nền, thường là một nguồn gây hao pin không mong muốn. Nên sử dụng khoảng thời gian vài giây cho các trường hợp sử dụng tiền cảnh.

    Giới hạn vị trí nền được giới thiệu trong Android 8.0 thực thi các chiến lược này, nhưng ứng dụng của bạn nên cố gắng thực thi chúng trên Học lập trình Android .

    Độ trễ

    Bạn có thể chỉ định độ trễ bằng setMaxWaitTime () phương thức, thường truyền một giá trị lớn hơn nhiều lần so với khoảng thời gian được chỉ định trong setInterval () phương thức. Cài đặt này làm trì hoãn việc phân phối vị trí và nhiều cập nhật vị trí có thể được phân phối theo đợt. Hai thay đổi này giúp giảm thiểu tiêu thụ pin.

    Nếu ứng dụng của bạn không ngay lập tức cần cập nhật vị trí, bạn nên chuyển giá trị lớn nhất có thể cho setMaxWaitTime()phương thức, giao dịch có độ trễ hiệu quả để có thêm dữ liệu và hiệu quả pin.

    Khi sử dụng geofences, các ứng dụng nên chuyển một giá trị lớn vào setNotificationResponsiveness() phương thức để bảo toàn năng lượng. Giá trị năm phút hoặc lớn hơn được đề nghị.

    Trường hợp sử dụng vị trí

    Phần này mô tả một số tình huống thu thập vị trí điển hình, cùng với các đề xuất để sử dụng tối ưu các API của nhà cung cấp vị trí địa lý và hợp nhất.

    Cập nhật người dùng hiển thị hoặc tiền cảnh

    Ví dụ: Một ứng dụng bản đồ cần cập nhật thường xuyên, chính xác với độ trễ rất thấp. Tất cả các cập nhật xảy ra ở nền trước: người dùng bắt đầu một hoạt động, tiêu thụ dữ liệu vị trí và sau đó dừng hoạt động sau một thời gian ngắn.

    Sử dụng setPriority () phương thức có giá trị PRIORITY_HIGH_ACCURACY hoặc PRIORITY_BALANCED_POWER_ACCURACY.

    Khoảng thời gian được chỉ định trong setInterval() phương thức tùy thuộc vào trường hợp sử dụng: đối với các kịch bản thời gian thực, đặt giá trị thành vài giây; mặt khác, giới hạn trong một vài phút (khuyến nghị khoảng hai phút hoặc lớn hơn để giảm thiểu việc sử dụng pin).

    Biết vị trí của thiết bị

    Ví dụ: Một ứng dụng thời tiết muốn biết vị trí của thiết bị.

    Sử dụng getLastLocation() phương thức trả về vị trí khả dụng gần đây nhất (trong trường hợp hiếm hoi có thể là null).

    Phương pháp này cung cấp một cách đơn giản để nhận vị trí và không phát sinh chi phí liên quan đến việc chủ động yêu cầu cập nhật vị trí.

    Sử dụng kết hợp với isLocationAvailable() phương thức, phương thức này trả về truekhi vị trí được trả về getLastLocation() là hợp lý cập nhật.

    Bắt đầu cập nhật khi người dùng ở một địa điểm cụ thể

    Ví dụ: Yêu cầu cập nhật khi người dùng ở trong một khoảng cách nhất định của công việc, nhà hoặc một địa điểm khác.

    Sử dụng tính năng định vị địa lý kết hợp với cập nhật nhà cung cấp vị trí hợp nhất. Yêu cầu cập nhật khi ứng dụng nhận được kích hoạt lối vào geofence và xóa cập nhật khi ứng dụng nhận được kích hoạt thoát geofence. Điều này đảm bảo rằng ứng dụng được cập nhật vị trí chi tiết hơn chỉ khi người dùng đã vào một khu vực được xác định.

    Quy trình công việc điển hình cho kịch bản này có thể liên quan đến việc hiển thị thông báo khi chuyển đổi nhập địa lý và khởi chạy một hoạt động có chứa mã để yêu cầu cập nhật khi người dùng chạm vào thông báo.

    Bắt đầu cập nhật dựa trên trạng thái hoạt động của người dùng

    Ví dụ: Chỉ yêu cầu cập nhật khi người dùng đang lái xe hoặc đi xe đạp.

    Sử dụng API nhận dạng hoạt động kết hợp với các cập nhật của nhà cung cấp vị trí hợp nhất. Yêu cầu cập nhật khi phát hiện hoạt động được nhắm mục tiêu và xóa cập nhật khi người dùng ngừng thực hiện hoạt động đó.

    Quy trình công việc điển hình cho trường hợp sử dụng này có thể liên quan đến việc hiển thị thông báo cho hoạt động được phát hiện và khởi chạy một hoạt động có chứa mã để yêu cầu cập nhật khi người dùng nhấn vào thông báo.

    Cập nhật vị trí nền chạy dài gắn liền với các khu vực địa lý

    Ví dụ: Người dùng muốn được thông báo khi thiết bị ở gần nhà bán lẻ.

    Đây là một trường hợp sử dụng tuyệt vời cho geofenced. Bởi vì trường hợp sử dụng gần như chắc chắn liên quan đến vị trí nền, sử dụng addGeofences (GeofencingRequest, PendingIntent) phương pháp.

    Bạn nên đặt các tùy chọn cấu hình sau:

    Nếu bạn đang theo dõi chuyển tiếp dừng, hãy sử dụng setLoiteringDelay() phương pháp chuyển giá trị khoảng năm phút hoặc ít hơn.

    Sử dụng setNotificationResponsiveness(), vượt qua một giá trị khoảng năm phút. Tuy nhiên, hãy cân nhắc sử dụng giá trị khoảng mười phút nếu ứng dụng của bạn có thể quản lý độ trễ thêm trong khả năng phản hồi.

    Một ứng dụng chỉ có thể đăng ký tối đa 100 geofences mỗi lần. Trong trường hợp sử dụng khi ứng dụng muốn theo dõi một số lượng lớn các tùy chọn của nhà bán lẻ, ứng dụng có thể muốn đăng ký geofence lớn (ở cấp thành phố) và tự động đăng ký các geofences nhỏ hơn (cho các vị trí trong thành phố) cho các cửa hàng trong phạm vi địa lý lớn hơn.

    Khi người dùng nhập vào một geofence lớn, các geofences nhỏ hơn có thể được thêm vào; khi người dùng thoát khỏi geofence lớn hơn, các geofences nhỏ hơn có thể được loại bỏ và geofences có thể được đăng ký lại cho một khu vực mới.

    Cập nhật vị trí nền chạy dài mà không có thành phần ứng dụng hiển thị

    Sử dụng setPriority() phương pháp với PRIORITY_NO_POWER tùy chọn nếu có thể vì nó hầu như không gây hao pin. Nếu PRIORITY_NO_POWER không thể sử dụng, hãy sử dụng PRIORITY_BALANCED_POWER_ACCURACY hoặc PRIORITY_LOW_POWER, nhưng tránh sử dụng PRIORITY_HIGH_ACCURACY cho công việc nền bền vững vì tùy chọn này làm cạn kiệt pin.

    Nếu bạn cần thêm dữ liệu vị trí, hãy sử dụng vị trí thụ động bằng cách gọi setFastestInterval() phương thức chuyển một giá trị nhỏ hơn giá trị bạn truyền đến setInterval().

    Khi được kết hợp với PRIORITY_NO_POWER tùy chọn, vị trí thụ động có thể phân phối vị trí một cách cơ hội bởi các ứng dụng khác mà không mất thêm chi phí.

    Tần số vừa phải bằng cách thêm một số độ trễ, sử dụng setMaxWaitTime() phương pháp. Ví dụ: nếu bạn sử dụng setinterval() phương thức có giá trị khoảng 10 phút, bạn nên xem xét việc gọi setMaxWaitTime() với giá trị trong khoảng từ 30 đến 60 phút.

    Sử dụng các tùy chọn này, vị trí được tính cho ứng dụng của bạn sau mỗi 10 phút, nhưng ứng dụng chỉ được đánh thức sau mỗi 30 đến 60 phút với một số dữ liệu vị trí có sẵn dưới dạng cập nhật hàng loạt. Cách tiếp cận này giao dịch độ trễ cho nhiều dữ liệu có sẵn và hiệu suất pin tốt hơn.

    Cập nhật độ chính xác cao thường xuyên trong khi người dùng tương tác với các ứng dụng khác

    Ứng dụng điều hướng hoặc tập thể dục tiếp tục hoạt động khi người dùng tắt màn hình hoặc mở một ứng dụng khác.

    Sử dụng một dịch vụ tiền cảnh. Nếu công việc đắt tiền có khả năng sẽ được thực hiện bởi ứng dụng của bạn thay mặt cho người dùng, làm cho người dùng nhận thức được công việc đó là cách thực hành tốt nhất được đề xuất. Một dịch vụ tiền cảnh đòi hỏi một thông báo liên tục. Để biết thêm thông tin, xem Thông báo Tổng quan .

    Địa điểm thực hành tốt nhất

    Thực hiện các thực tiễn tốt nhất trong phần này giúp giảm mức sử dụng pin của ứng dụng của bạn.

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

    Một nguồn chung gây hao pin không cần thiết là không xóa được cập nhật vị trí khi không còn cần thiết. Điều này có thể xảy ra, ví dụ, khi các phương thức của một hoạt động onStart() hoặc onResume() vòng đời chứa một cuộc gọi đến requestlocationUpdates() mà không có một cuộc gọi tương ứng removeLocationUpdates() trong các phương thức onPause()hoặc onStop()vòng đời.

    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 của mình. Để biết thêm thông tin, hãy xem Xử lý vòng đời với các thành phần nhận vòng đời .

    Đặt thời gian chờ

    Để bảo vệ chống 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 rằng các bản cập nhật không tiếp tục vô thời hạn và nó bảo vệ ứng dụng trong các trường hợp yêu cầu cập nhật nhưng không bị xóa (ví dụ: do lỗi trong mã).

    Đối với yêu cầu nhà cung cấp vị trí hợp nhất, hãy thêm thời gian chờ bằng cách gọi setExpirationDuration(), nhận thông số thể hiện thời gian tính bằng mili giây kể từ khi phương thức được gọi lần cuối.

    Bạn cũng có thể thêm thời gian chờ bằng cách gọi setExpirationTime(), nhận thông số thể hiện thời gian hết hạn tính bằng mili giây kể từ khi hệ thống khởi động lần cuối.

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

    Yêu cầu hàng loạt

    Đối với tất cả các trường hợp sử dụng không phải tiền cảnh, hãy gộp nhiều yêu cầu lại với nhau. Bạn có thể sử dụng setInterval() phương pháp để chỉ định khoảng thời gian bạn muốn tính toán vị trí.

    Sau đó, sử dụng setMaxWaitTime() phương pháp để đặt khoảng thời gian mà vị trí được phân phối đến ứng dụng của bạn. Giá trị được truyền cho setMaxWaitTime() phương thức phải là bội số của giá trị được truyền cho setInterval() phương thức. Ví dụ: xem xét yêu cầu vị trí sau:

    KOTLINJAVA

    val yêu cầu = LocationRequest () yêu cầu . yêu cầu setInterval ( 10 * 60 * 1000 ) . setMaxWaitTime ( 60 * 60 * 1000 )

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

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

    Trong các trường hợp sử dụng nền, đó là một ý tưởng tốt để tăng tốc cập nhật vị trí. Giới hạn Học lập trình Android 8.0 thực thi quy trình này, nhưng các ứng dụng chạy trên các thiết bị cũ hơn nên cố gắng hạn chế vị trí nền càng nhiều càng tốt.

    Có khả năng trong khi ứng dụng của bạn ở chế độ nền, một ứng dụng khác có thể thường xuyên yêu cầu cập nhật vị trí ở phía trước. Dịch vụ định vị làm cho những cập nhật này có sẵn cho ứng dụng của bạn. Xem xét yêu cầu vị trí sau, tiêu thụ dữ liệu vị trí một cách cơ hội:

    KOTLINJAVA

    val yêu cầu = LocationRequest () yêu cầu . yêu cầu setInterval ( 15 * 60 * 1000 ) . setFastestInterval ( 2 * 60 * 1000 )

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

    Trong khi tiêu thụ vị trí một cách thụ động không gây hao pin, hãy cẩn thận hơn trong trường hợp việc nhận dữ liệu vị trí kích hoạt các hoạt động CPU hoặc I / O đắt tiền. Để giảm thiểu chi phí pin, khoảng thời gian quy địnhsetFastestInterval() không nên quá nhỏ.

    Bạn có thể cải thiện đáng kể hiệu suất pin của thiết bị của người dùng bằng cách làm theo các đề xuất trên trang này. Người dùng của bạn ít có khả năng xóa các ứng dụng không làm hao pin của họ.
     

    Xem thêm các chủ đề tạo bởi HoitruongS4
    Đang tải...


Chia sẻ trang này