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