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

Прежде всего, я хотел бы отметить, что я провел здесь много исследований по переполнению стека, документации по 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и как с этим справиться

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