У меня есть приложение для Android, я хочу вычислять расстояние каждые две минуты, когда пользователь нажимает кнопку «Пуск». Итак, в моем приложении есть класс Service, в этом классе у меня googleapiclient.
Итак, яЯ получаю местоположение каждые две минуты. Я добавляю это расстояние в sharedpreference, но мобильный переходит в спящий режим, значит, расстояние не рассчитывается, когда пользователь нажимает кнопку «Завершить».
Я думаю, что сервис остановлен. Пожалуйста, помогите мне исправитьмоя проблема.Что я должен делать, когда мобильный телефон переходит в спящий режим. Если я вычисляю расстояние на странице активности, это означает, что когда приложение находится в фоновом режиме, расстояние не рассчитывается, поэтому я добавляю расстояние в сервис.
Код:
public class MyLocationService2 extends Service implements GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener, LocationListener {
LocationManager locationManager ;
SharedPreferences sharedPreferences,startdistance_preference;
SharedPreferences.Editor editor;
Timer timer;
String networkinformation;
MyLocationService.MyTimerTask myTask;
String gs_var_userid,gs_var_usetoken;
private GoogleApiClient mGoogleApiClient = null;
Double mlastlocationlat,mlastlocationlong,mcurrentlocationlat,mcurrentlocationlong;
private static final LocationRequest REQUEST = LocationRequest.create()
.setInterval(10000)
.setFastestInterval(10000)
.setSmallestDisplacement(0)
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
public static boolean isGPSEnabled = false;
public static boolean isNetworkEnabled = false;
String strlevel;
SimpleDateFormat simpledateformat;
String Date;
int deviceStatus;
String currentBatteryStatus="Battery Info";
private final int UPDATE_INTERVAL = 10000; // 5 sec
private final int FASTEST_INTERVAL = 10000; // 1 sec
private final int DISPLACEMENT = 0; // 10 meters
LocationRequest mLocationRequest;
public void createLocationRequest() {
mLocationRequest = LocationRequest.create();
mLocationRequest.setInterval(UPDATE_INTERVAL);
mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setSmallestDisplacement(DISPLACEMENT);
}
String provider;
double f_TotDist ;
//to check gps is enabled or not
@Override
public void onCreate() {
super.onCreate();
Log.i("FG","oncreate");
locationManager = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE);
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
mGoogleApiClient = new GoogleApiClient.Builder(getApplicationContext())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
createLocationRequest();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public void onLowMemory() {
super.onLowMemory();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("DF","ondestroy");
// mGoogleApiClient.disconnect();
// LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
}
private synchronized void buildGoogleApiClient() {
try {
mGoogleApiClient = new GoogleApiClient.Builder(getApplicationContext())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onConnected(@Nullable Bundle bundle) {
try {
Log.i("FG","----onConnected----service1");
if (ActivityCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
if (mGoogleApiClient != null) {
mGoogleApiClient.connect();
mGoogleApiClient.connect();
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient,
REQUEST,
this); // LocationListener
}
else
{
buildGoogleApiClient();
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient,
REQUEST,
this); // LocationListener
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onConnectionSuspended(int i) {
}
// to get current latitude and longitude
// storing the updated latitde and longitude when user moving and reach destination
@Override
public void onLocationChanged(Location location) {
try {
Log.i("MS","service class********"+location);
sharedPreferences = getSharedPreferences("myprefer", MODE_PRIVATE);
editor = sharedPreferences.edit();
gs_var_userid=Prefs.getuserid(getApplicationContext());
gs_var_usetoken=Prefs.getusertokene(getApplicationContext());
editor.putString("dest_Lat", String.valueOf(location.getLatitude()));
editor.putString("dest_Long", String.valueOf(location.getLongitude()));
editor.putString("Lat", String.valueOf(location.getLatitude()));
editor.putString("Long", String.valueOf(location.getLongitude()));
startdistance_preference = getSharedPreferences("startLessonPref",
Context.MODE_PRIVATE);
if(mlastlocationlat==null && mlastlocationlong==null && mcurrentlocationlat==null && mcurrentlocationlong==null)
{
mlastlocationlat=location.getLatitude();
mlastlocationlong=location.getLongitude();
mcurrentlocationlat=location.getLatitude();
mcurrentlocationlong=location.getLongitude();
}
else
{
mlastlocationlat=mcurrentlocationlat;
mlastlocationlong=mcurrentlocationlong;
mcurrentlocationlat=location.getLatitude();
mcurrentlocationlong=location.getLongitude();
}
editor.commit();
Float dist = distanceCal(mlastlocationlat, mlastlocationlong,mcurrentlocationlat, mcurrentlocationlong);
} catch (Exception e) {
e.printStackTrace();
}
}
private float distanceCal(double lat1, double lon1, double lat2, double lon2) {
Location loc1 = new Location("");
loc1.setLatitude(lat1);
loc1.setLongitude(lon1);
Location loc2 = new Location("");
loc2.setLatitude(lat2);
loc2.setLongitude(lon2);
float distanceInMeters = loc1.distanceTo(loc2);
Log.e("RS--first--","-distanceInMeters-" +distanceInMeters);
Log.e("RS---#####-1-" + lat1, "--" + lon1);
Log.e("RS---#####-2-" + lat2, "--" + lon2);
startdistance_preference = getSharedPreferences("startLessonPref",
Context.MODE_PRIVATE);
f_TotDist = startdistance_preference.getFloat("str_TotalDist", 0);
Log.e("RS","-f_TotDist-first-" +f_TotDist);
// startLesson_preference = getSharedPreferences("startLessonPref", Context.MODE_PRIVATE);
f_TotDist+=(distanceInMeters);
Log.e("RS","-f_TotDist--if-" +f_TotDist);
SharedPreferences.Editor editor1 = startdistance_preference.edit();
editor1.putFloat("str_TotalDist", (float) f_TotDist);
editor1.commit();
return distanceInMeters;
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
В действии пользователь, когда щелчок заканчивается, получает расстояние от службы, но если переходит в спящий режим, значит, я не получил расстояние, Даже я печатаю расстояние на странице активности, используя sqlite, но когдаЯ думаю, что переходит в спящий режим. Остановка службы