是否可能让Tizen应用程序持续运行而不间断?

15

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

但是,在Tizen OS中有一个限制,到目前为止我无法克服。我的应用程序在一段时间后(大约10分钟)会进入睡眠状态。这个应用程序必须在后台长时间工作(长达10小时),这非常重要。为了实现这一目标,我尝试了以下方法:

  • 带有background-category的普通Tizen应用程序:这种方法提供的数据仍然太零散了,例如我得到了15分钟的空白时间,其中根本没有记录任何数据。有时甚至有超过30分钟的空白时间。
  • Tizen alarms API:闹钟可以保持应用程序处于活动状态,但每次闹钟响起时,应用程序都会被带到前台,这不是一个可接受的解决方案。有一种选项可以静默地唤醒应用程序(使用应用程序控制),但它没有任何回调,因此所有闹钟都必须预先安排。
  • CPU_AWAKE标志:让系统显示“此应用程序正在使用太多能量”的弹出窗口,在10分钟左右没有得到答复时,系统仍将杀死我的应用程序。
  • Web Workers:这个只是为了论证而已,web workers会和应用程序一起进入睡眠状态。
  • 数据记录:我希望得到类似于Apple Health Kit的东西,但实际上我得到的是根本无法在HRM上运行的东西。某种程度上它适用于PRESSURE传感器。Tizen允许启动HRM的录制,但之后没有任何记录 - NotFoundError:无法读取记录的数据。任何其他传感器均会产生TypeMismatchError
  • Web Service 应用 - 这个应用需要与三星达到合作伙伴级别认证,同时也受到后台限制的影响,正如文档所述。
  • 采用“保持常开”标志的表盘方式。这种解决方案是我尝试过的最好的方法。表盘应用程序每分钟唤醒一次以更改时间,并接收传感器数据。不幸的是,经过更多的测试,发现记录的数据中还有一些漏洞。
  • 关于电池:以上任何一种方法都没有将电池耗尽到无法接受的程度。因此,首先我想找到一个解决方案,可以在至少10小时内尽可能频繁地获取所有传感器数据,而且没有漏洞。之后,如果发现这种解决方案消耗了太多的电池电量,我将考虑如何进行优化。

    现在的问题是:是否有可能让我的应用程序连续保持10小时以上不间断运行?


    1
    其实那是我在Tizen开发论坛上发布的帖子。仍在寻找比闹钟更好的解决方案。 - tymbark
    据我所知,目前可能没有比这更好的解决方案...... 如果您找到了,请分享。 - Iqbal hossain
    我也卡在这个问题上了。我有一个用C语言编写的本地Tizen应用程序。我在加速度计和HRM上使用了始终开启选项,并且需要连续获取6-8小时的数据。有时会出现长达30分钟甚至3-4小时的大间隙。同时设置CPU锁定请求也无效。如果我一直使用SAP在应用程序和可穿戴设备之间发送消息,它还会保持活动状态吗? - Gilad Eshkoli
    不,你说得对,即使我使用服务应用程序,也会有30分钟甚至更长时间的重大“漏洞”。有其他的运气吗? - Gilad Eshkoli
    3
    联系Tizen应用学校怎么样?它是由Tizen开发者为其他开发者创建的网站。如果您在这个问题上留下评论,他们可能会为这个问题准备讲座或解决方案。 - msalt.net
    显示剩余25条评论
    2个回答

    6
    如果您针对原生的Service App 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);
    

    不要忘记在清单文件中设置一个背景类别(如果需要,包括传感器和位置信息),否则Tizen将在大约10分钟后关闭您的应用程序。

    当然,这些内容几乎没有得到很好的文档支持...


    1
    我成功地使用了 device_power_request_lock(POWER_LOCK_DISPLAY, 0); 来保持显示屏在给定的超时时间内开启,但我不得不添加特权 http://tizen.org/privilege/display,否则它对我无效。 - go3d

    6
    我花费了许多周的时间寻找解决此问题的方法。最接近实现全天候不间断工作应用程序的方法是创建一个多包应用程序(也称为混合应用程序),其中包括:
    • 用JS编写的WEB应用程序,它是一个手表表盘应用程序。
    • 不带UI的本机服务应用程序,用C语言编写。
    所有应用程序都针对Tizen API 2.3.1进行开发。这是至关重要的一点,因为3.0 API存在多个问题,例如操作系统意外杀死应用程序或“电池使用过多”提示,有时也会导致我的应用程序被杀死。关于 Tizen 操作系统的趣事是,当它由于资源使用过多而杀死手表表盘应用程序时,手表的主屏幕只是纯黑色的。遗憾的是,针对API 2.3.1的结果是无法使用在此版本之后添加的多个API。
    接下来,我在所有本机服务应用程序中使用了 "device_power_request_lock(POWER_LOCK_CPU, 0);"。我认为使用旧的API(2.3.1而不是3.0)可以使应用程序在不被系统杀死的情况下长时间工作。我认为这是我利用了这个Tizen操作系统版本的缺陷。
    在WEB应用程序中,我使用了 "ScreenStateChangeListener" 和 "timetick" 事件来检查服务应用程序是否正在运行。如果没有 - >它将由WEB应用程序启动。为了实现服务和手表表盘之间的通信,我使用了首选项监听器API。手表表盘WEB应用程序负责检查哪个服务正在运行以及需要唤醒或启动哪个服务。
    最终,我最终使用了4个本地服务应用程序与WEB应用程序一起打包。每个服务应用程序都有自己的目的,例如文件系统、网络、监视等。多线程服务应用程序非常难以维护,并经常因未知原因而崩溃。

    这仍然是国家的现状吗?或者我们在此期间是否有更好的无限运行服务选项?我目前正在尝试各种方法,但我还没有找到令人满意的解决方案。 - user1195883
    我一年没有重新访问这个主题,因为现在我正在进行不同的项目。但是它仍然应该适用于三星Gear Sport智能手表。我没有在最新的三星手表上检查过这个解决方案,但我认为它们的传感器不如Gear Sport好。 - tymbark

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接