Palm OS中的"背景"任务
我正在尝试创建一个Palm OS应用程序,以每隔X分钟或者小时检查一个网站,并在有数据可用时提供通知。我知道这种事情可以在新的Palm上完成,例如,当应用程序不在顶部但我不知道怎么做时,我的Centro可以下载电子邮件或者网站。谁能指出我正确的方向?
解决方案
回答
这是可以做到的,但是非常困难。我们必须执行几个步骤。
首先,这仅适用于Palm OS 5,并且在某些早期的Palm OS 5设备上是粗略的。最新的设备更好,但并不完美。
接下来,我们将需要使用AlmSetAlarm为应用程序创建警报。这是我们完成"每X分钟或者小时"部分的方式。
发生警报时,即使应用程序尚未运行,它也会获得sysAppLaunchCmdAlarmTriggered启动代码。如果我们只想简单快速地执行操作,则可以响应启动代码来完成操作。
在警报启动代码中完成操作之后,请确保设置下一个警报,以便继续呼叫我们。
重要说明:响应此启动代码时,我们将无法访问全局变量!根据编译器中的设置,我们可能也将无法访问某些C ++功能,例如虚函数(内部使用全局变量)。我们可以在Codewarrior中设置一个可以解决此问题的设置,但我对此不太熟悉。我们应该构建代码,使其不需要全局变量。例如,可以使用FtrSet和FtrGet存储可能需要的全局数据位。最后,我们将只能访问68000个机器代码的单个64KB代码段。没有设置全局变量,段间跳转将无法正常进行。
通过将大部分代码移至PNOlet,可以避免很多限制,但这是一个完全不同且更为复杂的主题。
如果我们想做一些可能需要一段时间的复杂操作(例如,加载网页或者下载电子邮件),强烈建议不要在警报启动代码中执行此操作。我们可以在sysAppLaunchCmdDisplayAlarm启动代码中执行某些操作,并向用户显示一个允许他们取消的表单。但这势必会很快变得烦人。
更好的用户体验(但要复杂得多)是成为后台应用程序。这有点黑魔法,并没有得到很好的支持,但是有可能。成为后台应用程序基本上需要三个步骤:
- 使用DmDatabaseProtect保护应用程序数据库。这将确保应用程序已锁定,因此无法删除。
- 使用MemHandleLock和MemHandleSetOwner锁定代码段(将所有者设置为0)。这将确保代码已加载到内存中并且不会被移动。
- 注册一些通知。例如,sysNotifyIdleTimeEvent是一个很棒的通知,可用于执行一些定期的后台处理。
设置完毕后,我们可以退出警报启动代码,然后等待通知触发。然后,当通知处理程序被调用时,我们将进行所有的后台处理。
还请确保,如果我们分配了任何系统对象(内存,句柄,文件句柄等),并且希望它们从通知处理程序返回后仍然存在,则将其所有者设置为0(系统)。否则,系统将清理它们。如果这样做,请格外小心,以免造成内存和资源泄漏!当所有者设置为0时,它们将永远不会被清除!
要退出后台模式,只需执行相反的操作:取消注册通知,解锁代码段并取消保护应用程序数据库。
如果我们在后台执行任何网络操作,请确保将套接字设置为非阻塞模式并正确处理!否则,我们将阻止前台应用程序并导致问题。