Chinaunix首页 | 论坛 | 博客
  • 博客访问: 849615
  • 博文数量: 190
  • 博客积分: 7021
  • 博客等级: 少将
  • 技术积分: 1752
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-17 19:26
文章分类

全部博文(190)

文章存档

2014年(9)

2011年(32)

2010年(149)

我的朋友

分类: 嵌入式

2010-06-12 15:32:14

    BREW应用程序最为基本的内容就是它的事件驱动和处理的机制,通过这样的机制,我们可以使用相对简单的思路开发出我们所需要的应用程序。基于事件驱动机制开发的好处就是我们可以把复杂的程序容易的分割成各个小模块程序,同时针对事件驱动机制的特点我们还可以实现一个状态机的结构,这样的程序框架对于开发大型的应用程序来说是十分的方便的。

8.1 理解事件驱动模型

       做为BREW平台最为核心的一块,BREW的事件驱动模型是我们开发BREW应用程序必须要提前理解和消化的。这也是我们开发应用程序的基本的一步。

8.1.1处理一个事件

       对于一个BREW应用程序来说,不管愿不愿意处理这个事件,都将收到来自系统或使用者的事件,并且将这些事件传递到应用程序中的控件或者接口当中。正如前面章节所描述的一样,BREW通过应用程序的HandleEvent函数将事件传递给应用程序,应用程序处理这些事件并且通过函数的返回值告知系统这个事件的处理情况。

与大多数的操作系统不同,我们的应用程序不需要采用的轮询的方式来查看是否有事件传递过来,BREW系统将会根据相关的事件主动的调用应用程序的HandleEvent函数将事件传递给我们的应用程序。这个区别是至关重要的,因为我们的应用程序在捕获一个事件的时候,必须进行尽可能简单的处理。不像一些大型的操作系统平台,如Windows CE和其他的嵌入式系统操作系统,BREW运行在一个单线程的环境,因此,我们必须尽可能快地处理每一个事件,这样才不至于影响系统的正常运行。否则,应用程序的表象可能就会是响应用户非常迟钝,这样的应用程序是用户不会喜欢的。

基于这样的一个 BREW 事件驱动环境,要求我们的应用程序及时处理事件。这意味着应用程序应该迅速处理事件并立即返回。BREW将事件传递给应用程序时,应用程序会通过返回TRUE(表示已处理)或FALSE(表示未处理)来指示应用程序是否已处理事件。如果小程序必须将事件传递给其它事件处理程序(如控件或接口),它只需返回调用这个接口HandleEvent函数的结果。

BREW应用程序的事件处理(HandleEvent)函数接受三种与事件相关参数的输入,它们分别作为HandleEvent函数的第二、第三和第四个参数传递。下面是一个事件处理程序函数的示例:

boolean HandleEvent(MyApp* pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam);

第二个参数为AEEEvent类型,用于指定应用程序接收的主要事件。第三个和第四个参数是根据接收事件来定义的短数据和长数据。 这些值取决于事件本身,并根据事件的定义来定义。

典型的,我们的应用程序的事件处理函数是一个巨大的switch语句的程序结构,在这个结构中我们可以看到我们所感兴趣的事件,或者直接将某些事件传递到一些二级事件处理函数之中,这些二级事件处理函数既可以是我们为了程序结构的清晰而编写的函数,也可以是某个控件或接口的事件处理函数。关于这个switch语句的结构,我们可以在上一章创建的应用程序中看到。

执行应用程序时,我们只需考虑和处理应用程序可能需要处理的事件。一般情况下,我们可以忽略很多事件。例如,如果应用程序执行一个只需使用上下左右箭头键作为输入的游戏,并收到与0-9按键对应的事件,那么它将返回FALSE来表示应用程序不处理这些事件。体现在代码上就是我们的switch语句中不必“case”这些事件。

8.1.2捕获系统事件

       在我们的应用程序当中,最起码需要处理EVT_APP_STARTEVT_APP_STOPEVT_APP_SUSPENDEVT_APP_SUSPEND事件,上一章里面我们已经了解了它们的作用。而除了这些事件之外,应用程序中还可能涉及到的系统事件有:

       1EVT_APP_MESSAGE事件。此事件表示当前系统发送了一个文本短消息到我们的应用程序中。

       2EVT_ALARM事件。此事件表示系统发送了一个闹钟事件到我们的应用程序之中。

       3EVT_NOTIFY事件。此事件表示有一个系统的通知事件到达。发送通知事件的通常包括呼叫等事件。我们的应用程序需要注册相应的通知事件才能接收到这些通知。

这些系统事件是属于BREW的系统级别的事件,无论当前我们的应用程序处在什么样的状态下,都会处理这些系统事件。也就是说即便当前我们的应用程序处于关闭状态,也同样的可以接收到这些系统事件。

我们还可以定义大于EVT_USER的事件代码,通过ISHELL_PostEvent接口来向特定的应用程序发送自定义事件。例如:

bRet = ISHELL_PostEvent( pIShell, classid, eCode, wParam, dwParam );

       其中pIShellIShell接口的指针,classid表示事件发送到哪一个应用程序,eCode就是我们要发送的事件。通过这样的方式,就像系统事件一样,无论目标应用处于什么样的状态,都可以收到这个事件进行处理。bRet代表事件是否发送成功,注意,这里面返回值代表的是事件是否发送成功,而不是事件的处理结果。

8.1.3捕获用户接口事件

       在我们的应用程序中处理的大多数事件是键盘事件或者菜单选择事件,这些事件的特点是只有在应用程序处于活动状态的时候才能处理,这些事件就是典型的用户接口事件。这些事件的处理也是我们应用程序的核心内容,因为这些事件描述了当前用户的输入信息。

       最简单的用户输入就是用户按一下按键,然后释放按键。这其中BREW当前活动的应用程序将收到三个事件:EVT_KEY_PRESSEVT_KEYEVT_KEY_RELEASEEVT_KEY_PRESS描述用户已经按下了一个按键,EVT_KEY_RELEASE表示用户已经释放了这个按键,EVT_KEY则是介于两者之间的一种按键装态的描述。通常情况下我们的应用程序只需要处理EVT_KEY事件就好了。

       对于每一个按键事件,系统通常使用一个16位的按键代码来表示当前按下的是哪一个按键。这些按键代码定义在AEEVCode.h中,最为常用的按键代码如下:

按键

按键代码

0

AVK_0

1

AVK_1

2

AVK_2

3

AVK_3

4

AVK_4

5

AVK_5

6

AVK_6

7

AVK_7

8

AVK_8

9

AVK_9

*

AVK_STAR

#

AVK_POUND

清除键(返回键)

AVK_CLR

上方向键

AVK_UP

下方向键

AVK_DOWN

左方向键

AVK_LEFT

右方向键

AVK_RIGHT

选择键(确认键)

AVK_SELECT

呼叫键

AVK_SEND

结束键(关机键)

AVK_END

       通过上面的表格我们可以发现,与其他系统相比BREW缺少了一些独立的字符按键。这是因为通常一个BREW设备都是只有一个数字键盘和少数的几个控制按键,而字符的输入则是通过文件控件来完成。文本控件通过用户输入方式和所选择的不同输入法,如数字、字母以及拼音或笔画等,来实现对应的文本输入。事实上,要做到这些我们需要将应用程序捕获到的用户输入事件传入文本事件中去,传入的方式是通过文本控件的HandlEvent方法。

       在我们的应用程序中通常使用控件来处理一些用户的输入事件,而且在应用程序中通过控件的HandleEvent函数将这些事件传入,而控件在处理了相关事件之后,也同样会以某种方式来保存结果或者通知应用程序。例如,文本控件会保存并显示用户输入的文本,而菜单控件则会通过发送EVT_COMMAND事件来告知应用程序用户的选择项目是什么。在后面的章节中我们将逐渐的看到这些应用。

       有一个特殊的按键事件需要我们特别的注意,这个事件就是带有AVK_CLR参数的EVT_KEY事件。在默认情况下,当BREW内核捕获到这个事件的时候所执行的动作是关闭当前的应用程序。因此,如果我们不想BREW在收到这个事件的时候关闭我们的应用程序的话,我们需要在应用程序中处理这个事件,也就是在我们的应用程序接收到这个事件的时候返回TRUE,以使得BREW内核不会再处理这个事件。

 

ps:以上内容来自 《深入BREW开发》 作者:焦玉海

阅读(1532) | 评论(0) | 转发(0) |
0

上一篇:理解BREW接口

下一篇:BREW的事件处理(2)

给主人留下些什么吧!~~