эта служба должна работать в фоновом режиме
LocationClient является основной точкой входа для определения местоположения, связанных с API-интерфейсов, таких как местоположение и геозоны.
Используйте LocationClient для:
- подсоединять и отсоединять в Google Location Services.
- Запросить/удалить обратные вызовы обновления местоположения.
- Запрос/удаление геообъективов.
Чтобы установить соединение, вызовите connect() и дождитесь обратного вызова onConnected (android.os.Bundle).
LocationRequest объекты используются для запроса качества обслуживания для обновлений местоположения из LocationClient.
в LocationRequest, вы можете установить там параметры, такие как точность местоположения и временной интервал между обновлениями местоположения.
onLocationChanged будет вызываться в соответствии с временным интервалом, установленным в LocationRequest, и оттуда вы можете обновить свой сервер. служба не работает в фоновом режиме, поэтому вам необходимо обновить сервер AsyncTask или каким-либо другим способом, просто убедитесь, что обновления сервера выполнены в фоновом потоке.
public class LocationUpdatesService extends Service implements GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener,
LocationListener {
private static int LOCATION_UPDATE_INTERVAL = 30000; // how often you will get a location update (this is in milliseconds)
private LocationClient locationClient;
private LocationRequest locationRequest;
private boolean isConnected = false;
@Override
// onCreate is called when the service gets started (from an Activity) than immediately calls onStartCommand
public void onCreate() {
super.onCreate();
if (servicesConnected()) {
startLocationUpdates();
} else {
// isGooglePlayServicesAvailable FAILURE
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private boolean servicesConnected() {
int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (ConnectionResult.SUCCESS == resultCode) {
return true;
} else {
return false;
}
}
public void startLocationUpdates() {
locationRequest = LocationRequest.create();
locationRequest.setInterval(LOCATION_UPDATE_INTERVAL);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setFastestInterval(LOCATION_UPDATE_INTERVAL);
locationClient = new LocationClient(this, this, this);
locationClient.connect();
isConnected = true;
}
@Override
public void onDestroy() {
if (locationClient.isConnected()) {
onDisconnectClient();
} else {
// locationClient is disconnected
}
super.onDestroy();
}
private void onDisconnectClient() {
isConnected = false;
locationClient.removeLocationUpdates(this);
locationClient.disconnect();
locationRequest = null;
locationClient = null;
}
@Override
public void onLocationChanged(Location location) {
// update server from here with AsyncTask (or some other way but in the background)
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
@Override
public void onConnected(Bundle bundle) {
locationClient.requestLocationUpdates(locationRequest, this);
}
@Override
public void onDisconnected() {
}
}
полезные ссылки:
http://developer.android.com/reference/android/app/Service.html
http://developer.android.com/guide/components/services.html
http://developer.android.com/reference/android/location/LocationListener.html
https://developer.android.com/reference/com/google/android/gms/location/LocationRequest.html
https://developer.android.com/reference/com/google/android/gms/location/LocationListener.html
Вы можете START_STICKY услугу. Но рассмотрите влияние на батарею, вызванную вашей программой. – Skynet
@ByzantineFailure: Что вы подразумеваете под START_STICKY? есть ли у вас какой-нибудь пример или учебник, который может мне помочь? –
[This] (http://developer.android.com/guide/components/services.html) и [this] (http://stackoverflow.com/questions/9093271/start-sticky-and-start-not- липкий) – Skynet