Oreo - справочная служба локации спортивного трекера

Прежде всего, я хотел бы отметить, что я провел здесь много исследований по переполнению стека, документации по Android и другим сайтам, но я до сих пор не нашел решения.

Мне нужна ваша помощь, чтобы узнать, как сохранить мой сервис SportTracker в фоновом режиме в android >= O. На самом деле я запускаю сервис как липкий сервис переднего плана с:

Intent intent = new Intent(mContext, SmanAppLocationSerivce.class);
intent.putExtra(RequestCode.AgentService,RequestCode.START_SPORT_NOTIFICATION);
startForegroundService(intent);

В моем сервисе я делаю:

public void onCreate() {

    super.onCreate();

    mLocationRequest = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
            .setFastestInterval(Project.TIME_GPS_UPDATE_FAST)
            .setInterval(Project.TIME_GPS_UPDATE)ì;



    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();

}

и в методе onStartCommand я запускаю сервис.

В onLocationChanged мне нужно вычислить время, прошедшее с начала, расстояние и сохранить новое местоположение в БД, чтобы я мог получить их все, когда сохраню спортивный сеанс и отправлю их на сервер.

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

(Лучший пример, который я могу привести для ожидаемого поведения - спортивная сессия Runtastic)

На самом деле все работает нормально, если я прекращаю свою деятельность, служба продолжает работать так, как он должен, но когда телефон переходит в режим сна (я полагаю, когда переходит в режим ожидания), служба убивается системой.

Я попробовал эти решения:

  • Я пытался установить Будильник каждые n секунд, чтобы проверить, активна ли служба, и (если она не работает) перезапустить ее. НЕ РАБОТАЕТ, похоже, что даже сигнал тревоги убит системой (даже с помощью setExactAndAllowWhileIdle)
  • Попытался использовать широковещательный приемник для ACTION_SCREEN_OFF и ACTION_SCREEN_ON, чтобы я мог выключить таймер обновления уведомлений при выключенном экране и перезапустить его на screen_on, чтобы показать новые данные (не работает)
  • Попытка использовать другой приоритет для запроса местоположения (PRIORITY_BALANCED_POWER_ACCURACY вместо PRIORITY_HIGH_ACCURACY). Иногда служба выживает, иногда его убивают, но точность определения местоположения очень низкая, и, поскольку я отслеживаю спортивную сессию, мне нужна высокая точность
  • Я попытался попросить пользователя игнорировать оптимизацию батареи для моего приложения, перенаправляя на представление настроек с помощью Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS. Даже с приложением, игнорирующим оптимизацию батареи, сервис (с высокой точностью) был убит в режиме ожидания.

Кто-то получил представление о том, как решить эту проблему? Может быть, это просто нужно сделать по некоторому шаблону, который я не знаю, чтобы работать с О.

Спасибо всем пока

0 ответов

Другие вопросы по тегам