27
Апр
2021

Неубиваемый сервис в текущих реалиях

Нужно сделать сервис который остаётся активным, даже если телефон находится в режиме ожидания. То есть заблокирован и лежит в кармане. Или телефон перезагрузился/выключился, сервис перезапустился. В сервисе использую alarmmanager который раз в минуту вызывает определённые методы(получение gps и отправка на сервер). Но пока решил не торопится с сервисам как таковым. Может кто то уже сталкивался с подобным? Как обходили Doze Mode? Может есть примеры? Сейчас сервис написан так(пока даже не запускал): Запускается активность, нажимается кнопка, запускается сервис. В сервисе в oncreate вызывается alarmmanager и выполняет раз в минуту методы. Для предотвращения убийства используется:

 @Override
public void onDestroy()
{
    super.onDestroy();
    startService(new Intent(this, GpsService.class));
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    super.onTaskRemoved(rootIntent);
    startService(new Intent(this, GpsService.class));
}

Верен ли сейчас подход? Или пока не поздно лучше делать иначе? Дополняю свой вопрос. Администрация, если нужно создать новый то напишите пожалуйста. Итак, дремота вроде как побеждена... Для получения координат использую следующее:

public void requsetLocationUpdate()
{
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        fusedLocationProviderClient.requestLocationUpdates(locationRequest, new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                super.onLocationResult(locationResult);
                locations = locationResult.getLocations();
                currentLat = locations.get(0).getLatitude();
                currentLon = locations.get(0).getLongitude();
            }
        }, Looper.myLooper());
    }
}

Вызываю его в OnStartComand. Предвидел что OnLocationResult поведёт себя так, а именно будет вызываться сам по себе не взирая ни на что... В методе OnCreate прописал следующее:

fusedLocationProviderClient = new FusedLocationProviderClient(this);
    locationRequest = new LocationRequest();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setFastestInterval(1000*60);
    locationRequest.setInterval(1000*60);

Сервис пробуждается по сигналу тревоги AlarmManager, вызывает метод requsetLocationUpdate() он работает как положено. Но потом вызывается ещё несколько раз и типо обновляет координаты. Выявил данный косяк с помощью отладчика android studio. Вижу такой выход: вызывать removelocationupdates после получения координат. Но тогда появляется проблема с синхронизацией потоков(Метод отправки координат на сервер вызывается в том же OnStartCommand естественно в потоке). В итоге происходит следующее, отправляются координаты полученные ранее, а новые просто висят, и отправятся в следующий раз. И всё по новой...

Источник: https://ru.stackoverflow.com/questions/1275721/%D0%9D%D0%B5%D1%83%D0%B1%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC%D1%8B%D0%B9-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81-%D0%B2-%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D1%85-%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D1%8F%D1%85

Тебе может это понравится...

Добавить комментарий