針對電池續航力進行位置資訊使用最佳化

請採取下列行動,改善應用程式對裝置電池續航力的影響,以便使用定位服務。

移除定位更新通知

不必要的電池耗電是造成電力用盡的常見原因。

當活動的 onStart()onResume() 生命週期方法包含對 requestlocationUpdates() 的呼叫,但在 onPause()onStop() 生命週期方法中,卻沒有對應的 removeLocationUpdates() 呼叫,就可能發生這種情形。

您可以使用生命週期感知元件,妥善管理應用程式中的活動生命週期。詳情請參閱「使用生命週期感知元件處理生命週期」一文。

設定逾時

為防止電池耗電,請設定一個位置更新通知應停止的合理逾時時間。逾時設定可確保更新不會無限期地持續進行,在要求更新後但未移除更新的情況下 (例如,因為程式碼發生錯誤),還能保護應用程式。

針對整合式位置預測提供工具要求,請呼叫 setExpirationDuration() (接收代表自系統上次呼叫這個方法後的毫秒時間參數) 來新增逾時設定。此外,您也可以呼叫 setExpirationTime() (接收代表自系統上次啟動後起算的毫秒到期時間參數),來新增逾時設定。

如要在地理圍欄定位要求中新增逾時設定,請呼叫 setExpirationDuration() 方法。

批次處理要求

對於所有非前景用途,請批次處理多個要求。使用 setInterval() 方法指定計算位置的間隔時間。接著,使用 setMaxWaitTime() 方法設定位置「傳送」至應用程式的間隔時間。請將值傳遞至 setMaxWaitTime() 方法,該值應為傳遞至 setInterval() 方法的值的倍數。以下列定位要求為例:

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

在這種情況下,系統大約每 10 分鐘計算一次位置,並且大概每小時批量傳送 6 個左右位置資料點。儘管您仍然每隔 10 分鐘左右就會收到位置更新通知,但由於每小時才喚醒您的裝置,因此可節省電力。

使用被動位置更新通知

在背景用途中,建議您限制位置更新通知次數。雖然 Android 8.0 (API 級別 26) 限制會強制執行這種做法,但在舊版裝置上執行的應用程式應盡可能設法限制背景位置資訊。

很可能當您的應用程式在背景執行時,另一個應用程式可能正在前景頻頻要求位置更新通知。定位服務為您的應用程式提供這些更新。請考慮以下列位置資訊要求,適時使用位置資料:

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

在上一個範例中,系統大約每 15 分鐘計算一次應用程式的位置。如果其他應用程式要求位置資訊,應用程式會以最長 2 分鐘的間隔時間收到資料。

雖然以被動方式使用位置資訊而未導致電池耗電,但在接收位置資料的位置時,會觸發費用昂貴的 CPU 或 I/O 作業,請務必格外小心謹慎。為盡量減少電池消耗,setFastestInterval() 中指定的間隔時間不得太小。