Прежде всего, я хотел бы отметить, что я провел здесь много исследований по переполнению стека, документации по 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 метод I startForeground служба.
В 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 .Даже с приложением, игнорирующим оптимизацию батареи, сервис (с высокой точностью) был убит в режиме ожидания.
Кто-то понял, как решить эту проблему?Может быть, это просто нужно сделать по некоторому шаблону, который я не знаю, чтобы работать с O.
Спасибо всем Пока
ОБНОВЛЕНИЕ
Я все еще не нашел то, что я ищу (U2 :)).В итоге я попросил пользователя вручную установить приложение в списке защищенных приложений, чтобы диспетчер питания не убивал его.
Вы можете найти полезную информацию здесь Настройка "Защищенные приложения" на телефонах Huaweiи как с этим справиться