4

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

4

1 回答 1

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 是一个很好的通知,可用于执行一些周期性的后台处理。

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

Also make sure that if you allocate any system objects (memory, handles, file handles, etc.), you set their owner to 0 (system) if you expect them to persist after you return from your notification handler. Otherwise the system will clean them up. If you do this, be super careful to avoid memory and resource leaks!! They will never get cleaned up when the owner is set to 0!

To leave background mode, simply do the reverse: unregister for notifications, unlock your code segment, and unprotect your application database.

If you do any network operations in the background, be sure that you set the sockets to non-blocking mode and deal correctly with that! Otherwise you will block the foreground application and cause problems.

于 2008-09-11T04:37:39.507 回答