那个破软件公司要求的东西太杂了,我不得不看几年前的文档复习一下,免得被人问倒。不知道这些几年前的东西有很大改变没有,我估计没有,基本的东西应该是没变太多,变动的更多的是接口和新的平台。我觉得那个时侯的我的同事们都还是很牛的,大家都是一无所知,对着都没有人用过的新平台探索,给后面的人留下了很宝贵的财富。btw:我很不喜欢和不看好BREW这个东西,学这个还不如业余学学Iphone、Android和QT。
1、BREW应用的管理BREW AEE的主要功能就是对BREW应用进行管理,它维护两个应用队列:
1. 前台应用队列,它的特点有:
a) 包括当前激活的一个应用,和当前suspended的多个应用。
b) 普通的事件,如按键事件等,发送给当前激活的应用。
c) 发给特定应用的事件可以将suspended的应用激活。
2. 后台应用队列,它的特点有:
a) 可以接收和处理事件。
b) 需要显式启动自身才能够获得显示控制权处理。
应用有三种状态A –Active、S-Suspend、B –Backgroud。分别处于Brew中的两个队列
2、扩展BREW API,估计这个是要被面试的,总是说什么用C来模拟COM机制。给我代码,我坐在电脑面前花1个小时能写好,但让我背这些东西,很头疼。
BREW提供了菜单,静态框,文本框,时间,日期等控件。但很多时候仍需自定义一些控件或者一些常用的算法,这就需要扩展BREW提供的API接口。实现扩展与编写 BREW 应用程序类似, 区别只是扩展必须向其它外部类Expose虚拟函数表。
虚拟函数表通过头文件中的接口expose给第三方开发者。 下面是一个 IExtensionCls 扩展的例子:
QINTERFACE(IExtensionCls)
{
DECLARE_IBASE(IExtensionCls)
int (DrawSmiley)(IExtensionCls po, AEEPoint ptCenter, int nRadius);
int (DrawHello)(IExtensionCls po, AEEPoint ptXYOffset);
};
通过 QINTERFACE() 宏声明一个 IExtensionCls 的接口,并列出其成员函数: DrawSmiley() 和 DrawHello()。 通过以下虚拟表访问宏可以访问这些函数:
#define IEXTCLS_DrawSmiley(p,ptC,nR) GET_PVTBL(p,IExtensionCls)->DrawSmiley(p,ptC,nR)
#define IEXTCLS_DrawHello(p,ptC) GET_PVTBL(p,IExtensionCls)->DrawHello(p,ptC)
另外,还将expose两个成员函数: AddRef() 和 Release()。 它们通过 DECLARE_IBASE() 宏由最顶层的父类 IBASE 派生。
AddRef() 函数需要将接口的内部引用计数增一。 按照 BREW 规则,每个模块或类必须执行自身的引用计数以保留内存资源。 Release() 函数必须将内部引用计数减一,并检查其是否为零 (0);如果为零,该函数需释放分配给自身与扩展的所有资源。在前例中还使用了 GET_PVTBL() 宏,它通过虚拟函数表指针访问接口函数。前述类声明的 C++ 实现:
class IExtensionCls : public IBase
{
int DrawSmiley(IExtensionCls po, AEEPoint ptCenter, int nRadius);
int DrawHello(IExtensionCls po, AEEPoint ptXYOffset);
}
前面部分声明的接口必须含有实际内容,以定义模块的行为。 继续前示例,下列代码是一个简单的类定义:
typedef struct _ExtensionCls
{
DECLARE_VTBL(IExtensionCls) // Declare our VTable by doing so, we //have placed function pointers in the beginning of this structure
// Class member variables
uint32 m_nRefs; // References to us
IShell m_pIShell; // copy of Shell pointer
IDisplay m_pIDisplay; // Display interface pointer
IModule m_pIModule; // IModule interface pointer
} ExtensionCls;
此类中的 DECLARE_VTBL() 宏用于将虚拟表插入类定义。
虚拟表声明必须位于类的第一行。
在虚拟表声明之后,可以按照任意顺序枚举所有的成员变量。 强制的成员变量是 m_nRefs,用于对引用扩展的所有模块进行计数。 该变量可以实现前面讨论的 AddRef() 和 Release() 函数。
类似C++实现如下:
class ExtensionCls : public IextensionCls
{
// Class member variables
uint32 m_nRefs; // References to us
IShell m_pIShell; // copy of Shell pointer
IDisplay m_pIDisplay; // Display interface
IModule m_pIModule; // IModule interface
}
对于示例扩展,接口声明了四种函数: AddRef()、Release()、DrawSmiley() 和 DrawHello()。 除此之外,在Simulator上使用还应有一个函数: AEEClsCreateInstance()。函数 AddRef() 和 Release() 负责模块引用计数和清除模块(如前所述)。DrawSmiley() 和 DrawHello() 负责执行扩展的目标功能。AEEClsCreateInstance() 函数和常规的Applet中此函数执行的有所不同。 例如,它不调用 AEEApplet_New() 进行创建,而是调用自身新的操作符。 在此例中,我们称之为 ExtensionCls_New(),其特征如下:
int ExtensionCls_New(int16 nSize, IShell pIShell, IModule pIModule,
IModule ppMod);
int ExtensionCls_New(int16 nSize, IShell pIShell, IModule pIModule,
IModule ppMod);
在该函数中,将发生以下操作:
• 分配内存
• 初始化虚拟表
• 初始化类成员
• 初始化任何其它代码
在所有情况下,该函数必须为 ISHELL 和 IMODULE 引用计数增一。 对于释放函数则相反,调用 ISHELL_Release() 和 IMODULE_Release() 时,会使引用计数返回原值。
完成全部任务后,其它应用程序可以调用 ISHELL_CreateInstance() 创建扩展的实例。 调用成功后,通过头文件中定义的宏可以访问每个函数。下面是调用和释放扩展的示例:
if(SUCCESS!=ISHELL_CreateInstance(pMe->m_pIShell, AEECLSID_EXTENSION_CLS, (void **)&pExtCls))
return FALSE;
IEXTCLS_DrawSmiley(pExtCls, ptSmile, 15);
IEXTCLS_DrawHello(pExtCls,ptHello);
IDISPLAY_Update(pMe->m_pIDisplay);
IEXTCLS_Release(pExtCls);
3、UI中的BREW启动
在UI_task初始化时,调用初始化函数AEE_Init(AEE_APP_SIG); 该过程完成的初始化工作包括:
a.得到设备信息,初始化ISHELL,IDISPLAY等接口。
b.构建所有加载的静态和动态模块的列表。
c.调用OEM_GetConfig(CFGI_AUTOSTART)
d.等等
OEM_GetConfig获得手机各种配置信息,包括:
1)第一个启动的Applet的ID号
2)DNS的IP地址
3)支持下载服务的各种信息
4)等等
...