BREW平台提供的是合作式多任务方式。这意味着Applet应用被设计成尽可能以最短的时间运行,在处理完消息后,退出以使其它活动得以进行。BREW环境正常情况下只能有一个Applet处于运行和可见(控制显示器),然而,多个Applet可以以后台方式运行当BREW暂停一个Applet,它将向Applet发送EVT_APP_SUSPEND消息。如果Applet处理该消息时返回TRUE, 表明该Applet已处理过该消息并且没有被调出内存。如果Applet不想处理EVT_APP_SUSPEND消息,可以返回FALSE,在这种情况下,BREW将停止该Applet,将向Applet发送EVT_APP_STOP消息,Applet将被载出内存。
因此采用一个特定的任务间消息处理机制,可以实现多个内存中任务同时运行。下面以一个简单的例子来说明如何实现BREW多任务协调工作。
现在两个应用程序,只是向屏幕中显示一个计数器。如下图所示:
为了区别起见,一个应用显示App1一个应用显示App2。
下面的两个是Soft Key按键。用于模拟向另一个应用发送消息。
假定App1主任务,App2为一从任务。
计数器的值定义在Applet结构中。程序启动时初始化为1
uint8 m_nIndex;
这里定义了一个消息
#define EVT_START_APP (EVT_USER + 11)
App1的消息处理过程:
switch (eCode){
case EVT_APP_START:
MM_WRITE_LOG0(“Start\r\n”);
return OnStart(pme,eCode,wParam,dwParam);
break;
case EVT_APP_STOP:
return TRUE;
case EVT_APP_RESUME:
MM_WRITE_LOG0(“Resume\r\n”);
pApp->m_nIndex++;
IWINAPP_SetWindow((IWinApp*)pApp,1,(void *)&rScreen);
return TRUE;
case EVT_START_APP:
MM_WRITE_LOG0(“Restart\r\n”);
ISHELL_StartApplet(pApp->a.m_pIShell,AEECLSID_APP1);
return TRUE;
case EVT_APP_SUSPEND:
MM_WRITE_LOG0(“Suspend\r\n”);
return TRUE;
case EVT_KEY:
case EVT_COMMAND:
return OnKey(pme,eCode,wParam,dwParam);
break;
App2的消息处理机制:
switch (eCode){
case EVT_APP_START:
MM_WRITE_LOG0(“Start\r\n”);
return OnStart(pme,eCode,wParam,dwParam);
break;
case EVT_START_APP:
MM_WRITE_LOG0(“Start the app\r\n”);
ISHELL_StartApplet(pApp->a.m_pIShell,AEECLSID_APP2);
return TRUE;
break;
case EVT_APP_STOP:
return TRUE;
case EVT_APP_RESUME:
pApp->m_nIndex++;
MM_WRITE_LOG0(“Resume\r\n”);
IWINAPP_SetWindow((IWinApp*)pApp,1,(void *)&rScreen);
return TRUE;
case EVT_APP_SUSPEND:
MM_WRITE_LOG0(“Suspend\r\n”);
return TRUE;
case EVT_KEY:
case EVT_COMMAND:
return OnKey(pme,eCode,wParam,dwParam);
可以看出两个App1的消息处理非常类似。因些都可以作为主任务,另一个则为从任务。
在App1中按键Tuesday:
case AEE_IDS_TUESDAY:
bRet=ISHELL_PostEvent(pThis->m_pIShell,AEECLSID_APP2,EVT_START_APP,0,AEECLSID_APP1);
向App2发起一个启动/恢复命令。
在App2中按键Tuesday:
case AEE_IDS_TUESDAY:
bRet=ISHELL_PostEvent(pThis->m_pIShell,AEECLSID_APP1,EVT_START_APP,0,AEECLSID_APP2);
向App1发起一个启动/恢复命令
从两个Applet的消息处理函数中可以看出都调用了一个。
ISHELL_StartApplet
该函数将异步启动一个Applet,本例子都是让Applet启动自生。如果一个没在内存中,则BREW创建该Applet的一个实例,并发送EVT_APP_START,如果已在后台运行,则将发送EVT_APP_RESUME。
因此,如果BREW不支持前后台多个任务同时运行的话。每次激活一个Applet,其计数器总会显示1。我们在EVT_APP_RESUME消息中对计数加1。
实现运行显示了每次计算数都会加1。因些可以说明BREW中是可以多个任务同时运行的。需不会是一个任务被启动时,其它的任务必需从系统中载出。
如下图所示:
因此通过这种机制,是可以实现一个Applet在后台运行。