15

最近我开始为 Tizen OS 开发。我的应用程序仅为可穿戴设备创建,并且仅适用于 Samsung Gear Sport(板载 Tizen 3.0)的特定设备。该应用程序的主要目的是长时间收集完整的传感器数据。我对心率和一般的运动传感器(陀螺仪和加速度计)感兴趣。然后,这些数据将被发送到云服务器并进行分析。目前我正在考虑一个 WEB 应用程序,因为到目前为止我还没有发现任何证据表明 WEB API 缺少本机 API 中存在的东西。

但是到目前为止,我无法克服 Tizen OS 中的一个限制。一段时间(10 分钟左右)后,我的应用程序进入睡眠状态。至关重要的是,此应用应在后台长时间运行(最长 10 小时)。为此,我尝试了以下方法:

  • 具有背景类别的普通 Tizen 应用程序:这种方法给出的数据仍然过于碎片化,例如我有 15 分钟的空洞,根本没有记录任何数据。有时甚至超过30分钟的洞。
  • Tizen 警报 API:警报起到了让应用程序保持活动状态的作用,但每次警报时,应用程序都会被带到最前面,这不是一个可接受的解决方案。可以选择静默唤醒应用程序(使用应用程序控制),但它没有任何回调,因此必须提前安排所有警报。
  • CPU_AWAKE 标志使系统显示“这个应用程序正在使用过多的能量”弹出窗口,如果在 10 分钟左右没有回答,系统仍然会杀死我的应用程序。
  • Web Workers - 这个只是为了论证,Web Workers 与应用程序一起休眠
  • 数据记录:我希望有类似于 Apple Health Kit 的东西,但我得到的东西根本不适用于 HRM。不知何故,它适用于PRESSURE传感器。Tizen 允许开始录制,HRM但在 - 之后没有录制任何内容NotFoundError: Failed to read recorded data。任何其他传感器都会给出TypeMismatchError
  • Web Service 应用程序- 如文档所述,此应用程序需要三星的合作伙伴级认证,它也受背景限制的影响
  • 在设备设置中将“始终开启”标志设置为 true 的Watch Face方法。这个解决方案是我尝试过的最好的。表盘应用程序每分钟唤醒一次以更改时间,它还接收传感器数据。不幸的是,经过更多测试后发现记录的数据中有几个漏洞。

关于电池:以上都没有将电池耗尽到无法接受的程度。因此,首先我想找到一个解决方案,它可以提供我需要的所有传感器数据,至少 10 小时后尽可能频繁地提供,并且没有任何漏洞。在那之后,如果事实证明这个解决方案消耗了太多的电池,我会考虑如何优化它。

现在的问题是:是否可以让我的应用程序不间断地运行 10 多个小时?

4

2 回答 2

6

我花了好几个星期试图找到解决这个问题的方法。我最接近一直不间断工作的应用程序是创建多包应用程序(也称为混合应用程序),其中包括:

  • 用 JS 编写的 WEB 应用程序,它是一个表盘应用程序
  • 用 C 编写的本机服务应用程序(无 UI)

所有应用程序都针对 Tizen API 2.3.1。这是至关重要的部分,因为 3.0 API 存在多个问题,例如操作系统意外终止应用程序或“电池使用过多”提示有时也会导致我的应用程序终止。Tizen OS 的有趣之处在于,当它由于过多的资源使用而杀死表盘应用程序时,手表的主屏幕只是纯黑色。不幸的是,针对 API 2.3.1 导致无法使用此版本之后添加的多个 API。

我使用的下一件事是device_power_request_lock(POWER_LOCK_CPU, 0);在所有本机服务应用程序中。我相信使用较旧的 API(2.3.1 而不是 3.0)可以让应用程序工作更长时间而不会被系统杀死。我认为这是我使用的这个 Tizen OS 版本的一个缺陷。

在 WEB 应用程序中,我使用了ScreenStateChangeListenertimetick 事件来检查服务应用程序是否正在运行。如果不是 -> 它是由 WEB 应用程序启动的。对于服务和表盘之间的通信,我使用了首选项侦听器 API。Watch face WEB app负责检查哪些服务在工作,哪些服务需要唤醒或启动。

最后,我最终使用了 4 个与 WEB 应用程序打包在一起的原生服务应用程序。每个服务应用程序都有自己的用途,例如文件系统、网络、监控等。多线程服务应用程序真的很难维护,并且经常因为未知原因而崩溃。

于 2018-09-26T14:56:47.410 回答
6

如果您以本机服务应用 API 3.0 为目标,请获取以下内容:

device_power_request_lock(POWER_LOCK_CPU, 0);
sensor_listener_set_option(listener,  SENSOR_OPTION_ALWAYS_ON);
sensor_listener_set_attribute_int(listener, SENSOR_ATTRIBUTE_PAUSE_POLICY, SENSOR_PAUSE_NONE);

并且不要忘记在 Manifest 中设置背景类别(如果需要,传感器 + 位置),否则 Tizen 会在大约 10 分钟后终止您的应用程序。

当然,几乎所有这些都没有被正确记录......

于 2018-06-12T09:47:07.130 回答