分类: C/C++
2008-06-12 22:39:19
Brew学习笔记3之Applet要点归纳
l BREW提供了多组不同功能对象(接口)和功能,这些对象和功能统称为服务,这些服务包括:
1、提供支持简单的基于事件的处理方式的应用程序服务
2、提供访问文件系统、网络服务、内存和显示的核心服务
3、提供增强的图形功能、多媒体、声音和GPS定位等增强服务
4、提供诸如支持浏览器开发的综合服务
在这些不同功能和级别的服务中包含了BREW的多种类型的接口,如IShell接口负责应用程序的控制和管理等功能;IDisplay负责显示的控制和屏幕刷新等功能。BREW的每一个接口使用一个32位的接口ID表示,这个接口ID叫做Class ID。这些Class ID都是由高通公司统一管理的,如果需要公开自己开发的接口,那么必须使用高通的注册网页申请一个ID,申请后这个ID就会保留下来给我们自己,不会再分配给其他的人。如果我们的接口只是做为本地测试使用,那么我们可以使用自己定义的接口Class ID,需要注意的就是不要与现有接口的ID相同就可以了。每一个BREW接口都是继承自一个叫做IBase的接口。
在使用一个接口之前,必须首先使用ISHELL_CreateInstance()接口函数创建接口实例。IShell的接口指针是通过调用ISHELL_CreateInstance()接口的当前应用程序,或接口的入口函数传递进来的,不需要创建。创建实例后,这个接口实例的指针将通过ISHELL_CreateInstance()方法传递回来。对于一些特定的接口不是通过这个方法创建的,而是通过其他方法直接返回的,如IImage接口就是通过ISHELL_LoadImage()方法获得的。
BREW的应用程序也是使用一个32位的ID来表示的,这个ID也叫做Class ID,它与接口的Class ID没有什么区别,而且是统一分配的。如果希望我们的应用程序能够分发给用户下载,除了要经过测试以外,您还必须申请全球唯一的Class ID,就像公开接口一样。要获得这样的ID,我们必须成为一个授权的开发者。关于如何成为一个授权的开发者请到高通的网站上察看详细的内容。
l 开发一个BREW应用程序所需的组件:
1、BREW AEE随SDK提供的头文件(在SDK中的inc目录下的.h文件)
2、BREW模块创建所需的助手源文件(AEEAppGen.c和AEEModGen.c)
3、Applet源文件和头文件
4、使用MIF文件编辑器创建MIF文件
5、Applet资源文件和相应的资源文件头文件,这些文件使用BREW资源文件编辑器创建
注意,应用程序中使用的源文件,对于Windows环境和指定设备环境下是相同的,使用同样的源文件去建立Windows的DLL二进制文件和设备指定的MOD二进制文件。
创建一个接口的实例
在一个模块或Applet中可以使用任何一个BREW的接口,不过在使用这些接口方法之前,需要先创建接口的实例,也就是获得接口的指针。BREW创建一个接口实例的方法是通过调用ISHELL_CreateInstance(IShell * pIShell, AEECLSID cls, void * * ppobj)成员函数,这是一个在BREW中十分有用的API接口函数。在调用这个函数的时候,需要指定创建接口的Class ID,以及接收接口指针数据的接口指针,这个接口指针通过**ppobj的二重指针传入。在这个成员函数执行的时候,BREW会根据指定的Class ID搜索支持类的列表,这个列表由两部分组成:一种是内嵌在BREW平台中的接口,如BREW的标准接口;另一种是系统启动时枚举的MIF文件中支持的类。BREW中调用ISHELL_CreateInstance成员函数的具体执行内容如下:
1、查找支持当前类的模块
2、将这个模块载入内存(如果当前没有载入的话)
3、调用IMOUDULE_CreateInstance()成员函数创建接口实例
如果成功创建了这个类的实例,那么,将会通过参数ppobj返回这个接口实例的指针。在这个接口的使用者不再需要这个接口的时候,必须调用该类的Release方法释放接口实例,同时将接口指针置空。在编写BREW应用程序的时候,创建实例的应用程序一定要负责释放这个实例。
l 所有的BREW类都是从IBase继承而来的。
IBase接口中有两个方法,IBASE_AddRef和IBASE_Release,由于全部的类都是从IBase继承而来,那么,全部BREW类都支持AddRef和Release方法。这两个方法是用来控制接口实例引用计数的。引用计数也就是指当前的类实例有多少个指针指向它(也就是引用它)。当增加一个引用的时候,必须调用AddRef方法增加类实例内部的引用计数,当释放一个引用的时候必须调用Release方法减少引用计数。当内部引用计数为0的时候,就会释放这个类的实例。我们必须严格的遵守这个规则,否则将不能够正确地释放接口实例所占用的系统资源,如内存等,会引起系统资源的耗尽,从而导致系统崩溃。
l 创建和终止一个Applet
在BREW模式下,Applet是一个支持IApplet接口的类。这使得BREW可以通过一个简单的接口控制所有的Applet。除了标准的AddRef和Release方法外,IApplet接口还支持HandleEvent方法。
BREW可以通过两种方式创建一个Applet:
1、直接调用ISHELL_StartApplet(IShell * pIShell, AEECLSID cls)成员函数。这个成员函数允许创建Applet并同时通过IApplet的HandleEvent方法发送EVT_APP_START事件。EVT_APP_START事件告知BREW Applet现在已经处于激活状态,同时可以刷新屏幕了。
2、注册通知或闹钟事件。在这种情况下,将立刻创建Applet并接收指定的通知事件。如果Applet需要刷新屏幕或接收按键输入时,可以通过调用ISHELL_StartApplet来启动自身。
如果需要终止当前激活的Applet,可以调用ISHELL_CloseApplet(IShell * pIShell, boolean bReturnToIdle)成员函数。调用此方法时,将会终止当前处于激活状态的Applet,同时发送EVT_APP_STOP事件告知Applet:应用程序将被关闭,请释放相关资源。
l 处理Applet的事件
当一个BREW Applet正在运行的时候(出于激活状态),它将通过HandleEvent函数接收事件。这些事件包括键盘、对话框和控件更改事件。下面是一个Applet的示例事件流程:
EVT_APP_START
…
其他BREW事件(EVT_KEY等)
…
EVT_APP_SUSPEND(可选)
EVT_APP_RESUME(可选)
…
其他BREW事件(EVT_KEY等)
…
EVT_APP_STOP
通常情况下,一个Applet值需要处理几种事件就可以了,包括EVT_APP_START、EVT_APP_STOP、EVT_KEY和EVT_COMMAND。如果在我们的Applet中没有处理一个事件的话,我们应该在应用程序的HandleEvent函数中返回FALSE。这将让BREW采用默认的方式处理这个事件。任何一个BREW Applet的核心函数都是HandleEvent,因为BREW基于事件驱动的机制就是通过这个函数体现出来的,它是BREW Applet的一个事件入口。Applet的运行也是通过这个函数接收事件而运转的。
l 创建自定义通知
通知事件是BREW提供的一种常用的高级功能。通过这个通知机制,我们可以接收到来自网络、闹钟等模块的事件,而不必采用轮询的方式进行监测,这大大提高了程序的效率。最常见的几种通知类型是通话、短信息、闹钟(闹钟使用的是EVT_ALARM事件,但它与通知事件原理相同)事件。一个应用程序如果要获得这样的通知事件,需要使用ISHELL_RegisterNotify()函数进行事件注册。注册后,当事件产生的条件满足时,BREW将发送EVT_NOTIFY事件给注册的应用程序。不管这个应用程序是否处于激活状态,都能够接收到这个事件。
除了BREW系统的通知事件以外,我们还可以创建自己的通知类。基本步骤如下:
1、编写一个从INotifier接口继承而来的BREW接口类(非Applet),同时实现INotifier接口成员函数。
2、定义接口类所需的通知掩码。
3、实现这个新的接口类。
一旦这个接口类被实现了,那么任何一个BREW的应用程序都可以注册这个接口的通知事件。