Служба останавливается, когда мобильный переходит в спящий режим в Android - PullRequest
0 голосов
/ 08 июня 2018

У меня есть приложение для 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, но когдаЯ думаю, что переходит в спящий режим. Остановка службы

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

В Android Oreo (API 26) существуют серьезные ограничения на запуск служб в фоновом режиме и поиск местоположений в фоновом режиме, чтобы сохранить заряд батареи, теперь приложение может получать обновления местоположения пару раз в час (без ограничений, когда приложение работает).на переднем плане)

Подробнее здесь:

Чтобы преодолеть ограничения в приложении на основе определения местоположения, создайте BroadCastReceiver, который будет получать намерение и иметь логику для обработки кода, специфичного для вашего приложения, после получения данных о местоположении.Используйте pendingIntent для извлечения Intent, когда данные о местоположении запускаются в фоновом режиме, как показано ниже:

Intent intent = new Intent(this, LocationUpdatesBroadcastReceiver.class);
  intent.setAction(LocationUpdatesBroadcastReceiver.ACTION_PROCESS_UPDATES);
   return PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Пошаговое руководство, предоставленное Google для обработки местоположения для oreo: https://codelabs.developers.google.com/codelabs/background-location-updates-android-o/#0

(Вывозможно, из шага 5 нужно будет посмотреть подробнее, как обращаться с oreo)

0 голосов
/ 08 июня 2018

Это ведет себя в соответствии с дизайном ОС.Начиная с Android O, когда приложение находится на переднем плане, оно может свободно создавать и запускать фоновые службы.

Когда приложение переходит в фоновый режим, оно имеет окно в несколько минут (по моим наблюдениям оно составляет около 1 - 2 минут, даже меньше, чем в некоторых других областях), в котором ему все еще разрешено создавать и использоватьСервисы.Система останавливает фоновые службы приложения, как если бы приложение вызывало методы Service.stopSelf() служб.

Следует избегать непрерывного запуска службы, поскольку это влияет на срок службы батареи.Если вы все еще хотите продолжить, лучшим вариантом будет использовать ForegroundService.Но если система считает, что ваша служба потребляет слишком много обработки, то в режиме ожидания эта служба также не будет работать.

Вы можете следовать этому SO , который описывает, как использовать ForegroundService.

Для запросов местоположения, проверьте этот официальный документ .Начиная с Android O, вы не можете так часто запрашивать обновление местоположения (каждые две минуты).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...