谷歌的示例源代碼很容易在前端實現連續位置更新,但我仍然無法清楚地瞭解後臺位置更新如何使用FusedLocationApi和PendingIntent工作。帶有PendingIntent的FusedLocationApi用於後臺位置更新。無法接收更新
LocationService類:
public class LocationService extends IntentService {
private static final String TAG = LocationService.class.getSimpleName();
private static final String ACTION_LOCATION_UPDATED = "location_updated";
private static final String ACTION_REQUEST_LOCATION = "request_location";
public static IntentFilter getLocationUpdatedIntentFilter() {
return new IntentFilter(LocationService.ACTION_LOCATION_UPDATED);
}
public static void requestLocation(Context context) {
Intent intent = new Intent(context, LocationService.class);
intent.setAction(LocationService.ACTION_REQUEST_LOCATION);
context.startService(intent);
}
public LocationService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
String action = intent != null ? intent.getAction() : null;
if (ACTION_REQUEST_LOCATION.equals(action)) {
onRequestLocation();
}
else if(ACTION_LOCATION_UPDATED.equals(action)) {
onLocationUpdated(intent);
}
}
/**
* Called when a location update is requested. We block until we get a result back.
* We are using Fused Location Api.
*/
private void onRequestLocation() {
Log.v(TAG, ACTION_REQUEST_LOCATION);
GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.build();
// we block here
ConnectionResult connectionResult = googleApiClient.blockingConnect(10, TimeUnit.SECONDS);
if (connectionResult.isSuccess() && googleApiClient.isConnected()) {
Intent locationUpdatedIntent = new Intent(this, LocationService.class);
locationUpdatedIntent.setAction(ACTION_LOCATION_UPDATED);
// Send last known location out first if available
Location location = FusedLocationApi.getLastLocation(googleApiClient);
if (location != null) {
Intent lastLocationIntent = new Intent(locationUpdatedIntent);
lastLocationIntent.putExtra(
FusedLocationProviderApi.KEY_LOCATION_CHANGED, location);
startService(lastLocationIntent);
}
// Request new location
LocationRequest mLocationRequest = new LocationRequest()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
FusedLocationApi.requestLocationUpdates(
googleApiClient, mLocationRequest,
PendingIntent.getService(this, 0, locationUpdatedIntent, 0));
googleApiClient.disconnect();
} else {
Log.e(TAG, String.format("Failed to connect to GoogleApiClient (error code = %d)",
connectionResult.getErrorCode()));
}
}
/**
* Called when the location has been updated & broadcast the new location
*/
private void onLocationUpdated(Intent intent) {
Log.v(TAG, ACTION_LOCATION_UPDATED);
// Extra new location
Location location =
intent.getParcelableExtra(FusedLocationProviderApi.KEY_LOCATION_CHANGED);
if (location != null) {
LatLng latLngLocation = new LatLng(location.getLatitude(), location.getLongitude());
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
}
MainActivity 代碼看起來凌亂,所以我將分享一個驅動器鏈接代碼:https://drive.google.com/open?id=0B7QMYFlbkUpOVjkxMUtfenRLXzA
的例子示例中的以下部分是我無法理解MainActivity中的位置的部分。如何使用廣播接收器接收位置更新?我還需要清楚瞭解在後臺運行的FusedLocation,以及如何利用它來實現實時GPS實時追蹤。當應用程序在使用PRIORITY_HIGH_ACCURACY模式每5秒後臺運行
@Override
protected void onResume() {
super.onResume();
if(checkPlayServices()) {
LocationService.requestLocation(this);
LocalBroadcastManager.getInstance(getActivity())
.registerReceiver(locationReceiver, LocationService.getLocationUpdatedIntentFilter());
}
}
@Override
public void onResume() {
super.onResume();
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
locationReceiver, LocationService.getLocationUpdatedIntentFilter());
}
@Override
public void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(locationReceiver);
}
private BroadcastReceiver locationReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Location location = intent.getParcelableExtra(FusedLocationProviderApi.KEY_LOCATION_CHANGED);
if (location != null) {
LatLng latestLocation = new LatLng(location.getLatitude(), location.getLongitude());
// do something with the location
}
}
};