【发布时间】:2008-09-10 21:19:39
【问题描述】:
我正在尝试创建一个 Palm OS 应用程序,以每隔 X 分钟或几小时检查一次网站,并在有数据可用时提供通知。我知道这种事情可以在新的 Palm 上完成——例如,当应用程序不在顶部时,我的 Centro 可以下载电子邮件或网站——但我不知道该怎么做。谁能指出我正确的方向?
【问题讨论】:
我正在尝试创建一个 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 时,它们将永远不会被清理!
要离开后台模式,只需执行相反的操作:取消注册通知、解锁您的代码段并取消保护您的应用程序数据库。
如果您在后台执行任何网络操作,请确保将套接字设置为非阻塞模式并正确处理!否则会阻塞前台应用程序并导致问题。
【讨论】: