要求接獲位置更新通知

適當地使用位置資訊,可能對 應用程式。舉例來說,如果您的應用程式協助使用者在步行或行走時規劃路線, 或應用程式追蹤資產位置,則應用程式必須取得 定期的裝置位置。還有地理位置 地點 (經緯度) 時,建議您進一步為使用者提供 資訊,例如方位 (行進的水平方向)、高度或 裝置的速率如需更多資訊,請參閱 Location 應用程式可從 融合式 位置提供者。作為回應,API 會定期以 根據目前所在位置找出最準確的地點 Wi-Fi 和 GPS (全球定位系統) 等服務供應商。更準確的 位置則是由供應商決定 你已授予的位置存取權 要求,以及您在位置資訊要求中設定的選項。

本課程將說明如何要求定期更新裝置的 使用 requestLocationUpdates()敬上 方法。

取得最後已知位置

裝置的最後已知位置是個方便的基地,可於 請先確定應用程式已含已知位置,再開始 定期更新位置資訊。 取得最後已知位置: 如何撥打電話取得最後已知位置? getLastLocation()。 以下章節的程式碼片段假設您的應用程式已 已擷取最後已知位置並儲存為 全域變數中的 Location 物件 mCurrentLocation

提出位置資訊要求

應用程式必須先連線至位置資訊,才能要求位置更新通知 並提出位置資訊要求 變更位置資訊設定 中示範了具體做法提出位置資訊要求後,即可開始使用 可以呼叫 requestLocationUpdates()

根據要求格式,整合式位置預測提供工具 會叫用 LocationCallback.onLocationResult()敬上 並傳遞 Location 物件清單給這個方法 發行 PendingIntent ,在其延伸資料中包含該位置。此外,資料的準確率與頻率 更新項目會受到您要求的位置存取權 您在位置資訊要求物件中設定的選項。

本課程將說明如何使用 LocationCallback敬上 回呼方法。致電 requestLocationUpdates()、 並向其傳送 LocationRequest。 物件 和 LocationCallback。 請定義 startLocationUpdates() 方法,如以下程式碼範例所示:

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

private fun startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper())
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

private void startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper());
}

請注意,上述程式碼片段參照的是布林值標記 requestingLocationUpdates,用於追蹤使用者是否已開啟定位功能 開啟或關閉更新。如果使用者關閉了位置更新功能,您可以通知 指出應用程式的地理位置規定。適用對象 進一步瞭解如何在 請參閱「儲存活動狀態」。

定義位置更新通知的回呼

整合式位置預測提供工具會叫用 LocationCallback.onLocationResult()敬上 回呼方法。傳入的引數包含 Location 清單 物件,內含位置的經緯度。下列程式碼片段 會說明如何在 LocationCallback敬上 並定義 方法,然後取得位置更新的時間戳記 並在應用程式使用者上顯示經緯度 介面:

Kotlin

private lateinit var locationCallback: LocationCallback

// ...

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    locationCallback = object : LocationCallback() {
        override fun onLocationResult(locationResult: LocationResult?) {
            locationResult ?: return
            for (location in locationResult.locations){
                // Update UI with location data
                // ...
            }
        }
    }
}

Java

private LocationCallback locationCallback;

// ...

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                return;
            }
            for (Location location : locationResult.getLocations()) {
                // Update UI with location data
                // ...
            }
        }
    };
}

停止位置更新通知

考慮是否要在活動發生時停止位置更新通知 使用者就會失去焦點,例如使用者切換至其他應用程式 同一個應用程式中的不同活動。有效降低耗電量 前提是應用程式不需收集 它會在背景執行本節說明如何停止 活動的 onPause() 方法。

如要停止位置更新通知,請撥打 removeLocationUpdates()、 傳送 LocationCallback, 如以下程式碼範例所示:

Kotlin

override fun onPause() {
    super.onPause()
    stopLocationUpdates()
}

private fun stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback)
}

Java

@Override
protected void onPause() {
    super.onPause();
    stopLocationUpdates();
}

private void stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback);
}

使用布林值 requestingLocationUpdates 追蹤 是否開啟位置更新功能。在活動的 onResume() 方法,請檢查 是否正在啟用位置更新功能;如果沒有,請啟用:

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

儲存活動狀態

變更裝置設定,例如畫面變更 方向或語言,可能會導致目前活動遭到刪除。您的 因此,應用程式必須儲存重建活動所需的任何資訊。 其中一個做法是透過儲存於 Bundle 物件。

以下程式碼範例說明如何使用活動的 onSaveInstanceState()敬上 儲存實例狀態的回呼:

Kotlin

override fun onSaveInstanceState(outState: Bundle?) {
    outState?.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates)
    super.onSaveInstanceState(outState)
}

Java

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY,
            requestingLocationUpdates);
    // ...
    super.onSaveInstanceState(outState);
}

定義要還原的 updateValuesFromBundle() 方法 也就是上一個活動例項中儲存的值 (如果有的話) 廣告。從活動的 onCreate() 方法,如 請看以下程式碼範例:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    updateValuesFromBundle(savedInstanceState)
}

private fun updateValuesFromBundle(savedInstanceState: Bundle?) {
    savedInstanceState ?: return

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY)
    }

    // ...

    // Update UI to match restored state
    updateUI()
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    updateValuesFromBundle(savedInstanceState);
}

private void updateValuesFromBundle(Bundle savedInstanceState) {
    if (savedInstanceState == null) {
        return;
    }

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY);
    }

    // ...

    // Update UI to match restored state
    updateUI();
}

如要進一步瞭解如何儲存執行個體狀態,請參閱 Android Activity 類別參考資料。

注意:如要增加永久儲存空間,您可以 將使用者偏好設定儲存在應用程式的 SharedPreferences。將共用偏好設定設為 活動的 onPause() 方法,以及 擷取 onResume() 中的偏好設定。 如要進一步瞭解如何儲存偏好設定,請參閱 儲存中 鍵/值組合

其他資源

如需瞭解更多資訊,不妨參考以下資源:

範例