Приложение-служба Tizen не работает нормально в фоновом режиме без подключения к Tizen Studio

Я пытаюсь создать собственное приложение tizen, которое будет обнаруживать активность и периодически собирать данные датчиков для загрузки на удаленный http-сервер.

Для этого я разработал две вещи.
1. Приложение с собственным пользовательским интерфейсом для запуска / остановки
2. Приложение-служба

Я разрабатываю проект в студии tizen с помощью samsung gear fit 2 pro, подключенного через удаленный диспетчер устройств по Wi-Fi.

Когда я запускаю свое приложение, оно работает нормально, пока мое устройство подключено к sdb. Но когда я отключаю устройство, оно начинает вести себя недетерминированно. Например, пока оно подключено к tizen studio, приложение записывает данные в течение первых 15 секунд каждые 60 секунд, а на 16-й секунде загружает этот файл на сервер. Он также запускается при обратном вызове изменения активности.
Но как только устройство отключается, этот интервал не соблюдается должным образом, т.е. датчики считывают данные через 30 минут (что также варьируется), и даже частота сбора данных за каждую секунду резко снижается. Но если приложение пользовательского интерфейса находится на переднем плане, снова все в порядке.

Итак, мое приложение работает нормально, если оно находится на переднем плане или на переднем плане / в фоновом режиме, а устройство подключено к sdb на ПК.

Как я могу сделать так, чтобы моя служба всегда работала в фоновом режиме, независимо от подключения устройства к tizen sdb на ПК?

NB Загрузка данных выполняется с использованием libcurl, для подключения используется тайм-аут 5 секунд, а в случае сбоя загрузка пропускается. Ecore Timer используется, но таймер не должен быть проблемой, так как я тестировал, постоянно запуская датчик, но проблема с понижением частоты все еще сохраняется. Параметры запуска датчика в сервисном приложении следующие

sensor_get_default_sensor(sensor_type, &sensor);
sensor_create_listener(sensor, &listener[sensor_type]);
sensor_listener_set_event_cb(listener[sensor_type], 1000 / SENSOR_FREQ, example_sensor_callback, vc);
sensor_listener_set_option(listener[sensor_type], SENSOR_OPTION_ALWAYS_ON);
sensor_listener_start(listener[sensor_type]);

2 ответа

См. Связанные вопросы здесь и здесь.

Мне кажется, что CPU переходит в состояние SLEEP и мешает вашей записи. Чтобы предотвратить это, используйте

device_power_request_lock(POWER_LOCK_CPU, 0);

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

device_power_release_lock(POWER_LOCK_CPU);

В зависимости от того, на какую версию Tizen вы нацеливаетесь, вы также можете (необходимо) использовать

sensor_listener_set_attribute_int(listener[sensor_type], SENSOR_ATTRIBUTE_PAUSE_POLICY, SENSOR_PAUSE_NONE);

который был введен как замена

sensor_listener_set_option(listener[sensor_type], SENSOR_OPTION_ALWAYS_ON);

в Tizen API 3.0.

Это можно найти в API здесь, здесь и здесь.

Возможно, возникла проблема с привязкой приложения-службы к приложению пользовательского интерфейса.

Я думаю, что элемент фоновой категории полезен для этой проблемы. Согласно руководству, фоновая категория позволяет приложениям работать в фоновом режиме.

Итак, вам нужно изменить файл манифеста, вот пример.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns="http://tizen.org/ns/packages" api-version="2.4" package="org.tizen.test" version="1.0.0">
   <ui-application appid="org.tizen.test" exec="text" type="capp" multiple="false" taskmanage="true" nodisplay="false">
      <icon>rest.png</icon>
      <label>rest</label>
      <!--For API version 2.4 or higher-->
      <background-category value="media"/>
      <background-category value="download"/>
      <background-category value="background-network"/>
   </ui-application>
   <service-application appid="org.tizen.test-service" exec="test-service" multiple="false" type="capp"/>
      <background-category value="background-network"/>
      <background-category value="location"/>
   </service-application>
</manifest>

Значение может быть установлено на media, download, background-network, location, sensor, iot-communication, и я думаю, что в этом случае значение должно быть датчиком.

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