Почему служба местоположения перестала отправлять обновления местоположения, когда я заблокировал телефон - PullRequest
0 голосов
/ 01 сентября 2018

Я создал фоновый сервис для периодического получения местоположения пользователя и отправки его на сервер следующим образом: `

public class SyncDataToServerService extends Service {

    private static final String TAG = "SyncDataToServerService";
    private ServerCall serverCall;
    private SharedPreferences tempPref2;
    private Timer timer;
    LocationManager locationManager;
    UtilityClass utilityClass;
    PowerManager.WakeLock wakeLock;
    PowerManager powerManager;

    @Override
    public void onCreate() {
        Log.e(TAG, "onCreate");

        serverCall = new ServerCall(this);
        timer = new Timer();
        utilityClass = new UtilityClass(this);
        tempPref2 = getSharedPreferences(getString(R.string.temp_pref_name_2), Context.MODE_PRIVATE);

    }

    @SuppressLint("MissingPermission")
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        Log.e(TAG, "onStartCommand");

        powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        if (powerManager != null)
            wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                    "MyApp::MyWakelockTag");
        wakeLock.acquire();

        //initialize and start Location service
        startLocation();

        //initialize and start the TimerTask's job
        startTimer();

        return START_STICKY;
    }

    @SuppressLint("MissingPermission")
    private void startLocation() {

        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        if (locationManager != null)
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                    10, new MyLocationListener());

        if (locationManager != null)
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0,
                    10, new MyLocationListener());

    }


    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onDestroy() {
        Log.e(TAG, "onDestroy");
        if (locationManager != null)
            locationManager.removeUpdates(new MyLocationListener());
        super.onDestroy();
    }

    private void syncPath(Location mLocation) {

        Log.w(TAG, "Location: " + mLocation + "  Latitude: " + mLocation.getLatitude() + " & Longitude: "
                + mLocation.getLongitude());

        if (tempPref2.getString(getString(R.string.attendance_key), "").equalsIgnoreCase("present")) {

            serverCall.sendEmpPath(mLocation);
        }
    }

    private void startTimer() {

        TimerTask timerTask = new TimerTask() {
            @RequiresApi(api = Build.VERSION_CODES.KITKAT)
            public void run() {

                if (utilityClass.isInternetConnected()) {

                    if (serverCall != null) {

                        if (serverCall.requestQ.size() > 0)
                            Log.e(TAG, "Request queue size ==" + serverCall.requestQ.size());

                        serverCall.syncData();
                    }
                }

            }
        };

        //schedule the timer, to wake up every 1 second
        timer.schedule(timerTask, 1000, 1000);

    }

    private class MyLocationListener implements LocationListener {

        @Override
        public void onLocationChanged(Location location) {
            Log.e(TAG, "onLocationChanged: " + location);

            Intent intent1 = new Intent("com.example.mc_project");
            intent1.putExtra("location", location);
            sendBroadcast(intent1);

            if (location.getAccuracy() < 25)
                syncPath(location);

            wakeLock.release();
        }

        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {

        }

        @Override
        public void onProviderEnabled(String s) {

        }

        @Override
        public void onProviderDisabled(String s) {

        }
    }
}`

все работает нормально, но когда я блокирую свой телефон, он прекращает посылать обновления местоположения. Я прочитал, что это из-за системного сна и должен использовать пробуждение, но он также не работает. И когда я разблокирую телефон, он должен начать отправлять обновления местоположения, но это также не происходит. Мой сервис не останавливается, он всегда находится в Пожалуйста, помогите, если я делаю что-то не так или пропускаю.

1 Ответ

0 голосов
/ 24 октября 2018

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

...