Google のサンプル ソース コードは、フロントエンドで継続的な位置情報の更新を実装するのは簡単でしたが、FusedLocationApi と PendingIntent を使用してバックグラウンドでの位置情報の更新がどのように機能するかを明確に理解することはまだできません。
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 トラッカーを実装するためにどのように利用できるかを明確に理解する必要があります。
@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
}
}
};