掌上操作系统中的"后台"任务

Mat*_*inn 4 palm-os garnet-os

我正在尝试创建一个Palm OS应用程序,每隔X分钟或几小时检查一个网站,并在一段数据可用时提供通知.我知道这种事情可以在新的Palm上完成 - 例如,当应用程序不在顶层时,我的Centro可以下载电子邮件或网站 - 但我不知道该怎么做.谁能指出我正确的方向?

Tim*_*man 7

这可能会很困难.您必须采取几个步骤.

首先,这仅适用于Palm OS 5,并且在一些早期的Palm OS 5设备上是粗略的.最新的设备更好但不完美.

接下来,您需要使用AlmSetAlarm为您的应用程序创建警报.这就是你完成"每X分钟或几小时"部分的方法.

当警报触发时,您的应用程序将获得sysAppLaunchCmdAlarmTriggered启动代码,即使它尚未运行.如果您只想简单快速地做一些事情,那么您可以根据启动代码执行此操作并完成.

在警报启动代码中执行操作后,请务必设置下一个警报,以便继续调用.

重要说明:响应此启动代码时无法访问全局变量!根据编译器中的设置,您可能也无法访问某些C++功能,例如虚拟功能(内部使用全局变量).您可以在Codewarrior中设置一个有助于此的设置,但我对它不太熟悉.您应该构建您的代码,以便它不需要全局变量; 例如,您可以使用FtrSet和FtrGet存储您可能需要的全局数据位.最后,您只能访问68000机器代码的64KB代码段.如果没有设置全局变量,段间跳转将无法正常工作.

您可以通过将大部分代码移动到PNOlet来解决许多这些限制,但这是一个完全不同且更复杂的主题.

如果您想做一些可能需要一段时间的复杂事情(例如加载网页或下载电子邮件),强烈建议您不要在警报启动代码期间执行此操作.您可以在sysAppLaunchCmdDisplayAlarm启动代码中执行某些操作,并向用户显示一个表单,允许它们取消.但这肯定会很快烦人.

更好的用户体验(但更复杂)是成为后台应用程序.这是一个黑魔法并没有得到很好的支持,但它是可能的.成为后台应用程序基本上有三个步骤:

  1. 使用DmDatabaseProtect保护您的应用程序数据库.这将确保您的应用程序被锁定,因此无法删除.

  2. 使用MemHandleLock和MemHandleSetOwner锁定代码段(将所有者设置为0).这将确保您的代码加载到内存中,不会被移动.

  3. 注册一些通知.例如,sysNotifyIdleTimeEvent是用于执行某些定期后台处理的很棒通知.

设置完成后,您可以退出警报启动代码,然后等待通知发出.然后,在调用通知处理程序时,您将执行所有后台处理.

还要确保如果分配任何系统对象(内存,句柄,文件句柄等),如果您希望它们在从通知处理程序返回后保持不变,则将其所有者设置为0(系统).否则系统将清理它们.如果你这样做,要特别小心,以避免内存和资源泄漏!当所有者设置为0时,它们永远不会被清理干净!

要退出后台模式,只需执行相反操作:取消注册通知,解锁代码段并取消保护应用程序数据库.

如果您在后台进行任何网络操作,请确保将套接字设置为非阻塞模式并正确处理!否则,您将阻止前台应用程序并导致问题.