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. Даже с приложением, игнорирующим оптимизацию батареи, сервис (с высокой точностью) был убит в режиме ожидания.
Кто-то получил представление о том, как решить эту проблему? Может быть, это просто нужно сделать по некоторому шаблону, который я не знаю, чтобы работать с О.
Спасибо всем пока