这个小程序的其他细节
在Palm OS系统中,系统往往需要同一个正在运行的应用软件进行通讯,或者和一个可能处于关闭状态的应用程序进行通讯。这两种情况,系统是区别对待的。在第一种情况下,应用程序正忙于处理事件循环中的事件。此时,系统通过发送一个事件到事件队列中,来实现和软件的通讯。就像我们的Hello World软件展示的那样,该软件的退出就是通过这种发送事件的方式。系统发送到软件事件队列中的是appStopEvent事件。一旦正在运行的软件收到此事件,马上进行退出操作。
除此之外,还有很多情况下软件会被系统调用。这就需要另外一种通讯方式来应用于这些其他的情况。首先,让我们看一看系统需要和软件进行交互的情况列表:
· 当用户调用了“查询”程序,系统必须去查询每一个安装过的软件,看一看它们的记录中由没有符合查询条件的数据。
· 当一个广播数据被收到以后,系统必须调用合适的软件(即能够识别被接收数据的软件)来处理输入的信息。
· 当开始一个热同步过程时,所有的软件都要看一看有没有需要同步的数据。
· 当系统重启之后,需要向每一个软件通报此事。
· 当系统日期和事件改变之后,需要通知所有的软件。
· 当国籍设置改变之后,需要通知所有的软件。
在所有以上这些情况下,都必须和每一个没有被激活,或者关闭着的软件进行通讯。问题是系统如何做到?答案是启动代码;所有这些通讯工作都是由您软件的启动代码完成的。
1 启动代码
在Palm OS系统内部,启动代码定义了上面提到的那些情况,以及在此情况下应用程序需要做的工作。这些代码将通过传递launchCode参数的方式,访问应用程序的PilotMain程序。下面是一些常用的启动代码:
sysAppLaunchFind
该代码要求应用程序去遍历一段文本,然后返回关于被查找数据的信息。
sysAppLaunchGoTo
该代码要求启动应用程序(如果该程序还没有启动的话),然后跳转到某特定的数据区段。
sysAppLaunchNormal
顾名思义,该代码将按照正常方式启动应用软件。
2 启动标志
和这些启动代码相关联的是各种各样的启动标志。这些启动标志定义了一些关于应用程序如何执行的重要信息。下面是一些例子:
· 应用软件的全局变量是否可用。在某些启动代码中不允许使用应用软件的全局变量。
· 应用软件目前是否处于激活状态。
· 应用软件是否已经被作为被激活的软件打开。
· 是否有其他的应用软件处于被激活状态。
3 一些假设
为了对应用程序本身以及它何时被系统调用,这之间的关系有一个清晰的了解,让我们来看一些假设的情况,以及这些情况发生后的程序操作。
例子12,当系统内置的备忘录软件被打开,然后用户发出了一个查找请求。此时,我们的“软件的结构”软件的PilotMain程序段将收到一个sysAppLaunchCmdFind启动代码的调用请求,并且此启动代码不带启动标志。
例子12 备忘录打开时用户进行查询的控制流程
|
MemoPad's sysAppLaunchFlagNewStack AND
PilotMain(sysAppLaunchCmdNormalLaunch,params, sysAppLaunchFlagNewGlobals AND
flags) sysAppLaunchFlagUIApp
MemoPad's EventLoop
SysHandleEvent (enter)
用户点击了find按钮
Loop through all applications:
MemoPad's PilotMain(sysAppLaunchCmdFind,
parameters, sysAppLaunchFlagSubCall)
PilotMain(sysAppLaunchCmdFind, 调用我们程序的主程序PilotMain
parameters, 0)
SysHandleEvent (exit) |
然后让我们来看一下例子13。此时的情况是,我们的软件已经打开了,然后进行查询操作。此时,我们软件的PilotMain被相同的启动代码sysAppLaunchCmdFind调用,但是此时带有了一个sysAppLaunchFlagSubCall启动标志,标志着当前我们的软件处于打开并运行状态。这就意味着全局变量可用,并且StartApplication程序已经被调用了。
例子13 我们程序打开时查询操作的控制流
我们程序的主程序 PilotMain( sysAppLaunchFlagNewStack AND
sysAppLaunchCmdNormalLaunch, params, sysAppLaunchFlagNewGlobals AND
flags) sysAppLaunchFlagUIApp
我们程序的EventLoop
SysHandleEvent (enter)
用户点击了find按钮
Loop through all applications:
我们软件的 PilotMain(sysAppLaunchCmdFind,parameters, sysAppLaunchFlagSubCall)
PilotMain(sysAppLaunchCmdFind,parameters,0)
SysHandleEvent (exit)