要求接獲位置更新通知

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

本課程將說明如何使用整合式位置預測提供工具中的 requestLocationUpdates() 方法,要求對裝置的位置資訊進行定期更新。

取得最後已知位置

裝置的最後已知位置是個方便的起點,可確保應用程式在開始定期更新位置資訊前,已具備已知位置資訊。「取得最後已知位置」課程會說明如何呼叫 getLastLocation() 以取得最後已知位置。後續章節的程式碼片段假設應用程式已擷取最後已知位置,並將其儲存為全域變數 mCurrentLocation 中的 Location 物件。

提出位置資訊要求

應用程式必須先連上定位服務並提出位置資訊要求,才能要求位置更新通知。請參閱「變更位置資訊設定」課程瞭解操作說明。提出位置資訊要求後,即可開始使用 方法是呼叫 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() 中的偏好設定。 如要進一步瞭解如何儲存偏好設定,請參閱 儲存中 鍵/值組合

其他資源

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

範例